DarkSoroush
پنج شنبه 03 مرداد 1387, 02:59 صبح
اول سلام خدمت دوستان!! :لبخند:
من تصمیم دارم تابعی را در برنامه ای HOOK کنم تا تابع به برنامه من پاس بشه. سورسی در این مورد برای c# یا vb.net پیدا نکردم. اولین سوالم اینه که سورسی برای این کار بر اساس c# دارید؟! (یا Vb که البته فکر کنم به اینجا مربوط نباشه)
و البته من یک سورس برای c++6 دارم به شرح زیر:
#include <windows.h>
#include <stdio.h>
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup);
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup);
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
BYTE hook[6];
void WinMainCRTStartup()
{
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
MessageBox(0, "HEY", "", MB_OK);
}
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
UnHookFunction("user32.dll", "MessageBoxA", hook);
char msg[strlen(lpText)];
sprintf(msg, "HOOKED!!\n\n%s", lpText);
int x = MessageBox(hWnd, msg, lpCaption, uType);
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
return x;
}
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE jmp[6] = { 0xe9, //jmp
0x00, 0x00, 0x00, 0x00, //address
0xc3
}; //retn
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5); //((to)-(from)-5)
memcpy(&jmp[1], &dwCalc, 4); //build the jmp
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
return dwAddr;
}
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
return TRUE;
return FALSE;
}
c++ میفهمم و متوجه مفهوم کلی کد میشم ولی نمیتونم به زبان دیگه ای ترجمش کنم چون تفاوت های زیادی بین زبانهای تحت دات نت و سنتی به وجود آمده که من راه حل کردن بیشترشون رو نمیدونم.
میخواستم ببینم راهی هست که بشه این کد رو مستقیم در برنامه های تحت دات نت اجرا کرد یا خیر؟! اگر نه ایا میشه اینو به c++.net تبدیل کنم و اگر تبدیل کردم میتونم شبیه سایر کلاسهای زیانهای دات نت از اون در زبانهای دیگه ای مثل c# استفاده کنم یا خیر؟
پیشاپیش ممنون :لبخندساده:
- سروش
من تصمیم دارم تابعی را در برنامه ای HOOK کنم تا تابع به برنامه من پاس بشه. سورسی در این مورد برای c# یا vb.net پیدا نکردم. اولین سوالم اینه که سورسی برای این کار بر اساس c# دارید؟! (یا Vb که البته فکر کنم به اینجا مربوط نباشه)
و البته من یک سورس برای c++6 دارم به شرح زیر:
#include <windows.h>
#include <stdio.h>
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup);
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup);
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
BYTE hook[6];
void WinMainCRTStartup()
{
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
MessageBox(0, "HEY", "", MB_OK);
}
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
UnHookFunction("user32.dll", "MessageBoxA", hook);
char msg[strlen(lpText)];
sprintf(msg, "HOOKED!!\n\n%s", lpText);
int x = MessageBox(hWnd, msg, lpCaption, uType);
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
return x;
}
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE jmp[6] = { 0xe9, //jmp
0x00, 0x00, 0x00, 0x00, //address
0xc3
}; //retn
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5); //((to)-(from)-5)
memcpy(&jmp[1], &dwCalc, 4); //build the jmp
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
return dwAddr;
}
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
return TRUE;
return FALSE;
}
c++ میفهمم و متوجه مفهوم کلی کد میشم ولی نمیتونم به زبان دیگه ای ترجمش کنم چون تفاوت های زیادی بین زبانهای تحت دات نت و سنتی به وجود آمده که من راه حل کردن بیشترشون رو نمیدونم.
میخواستم ببینم راهی هست که بشه این کد رو مستقیم در برنامه های تحت دات نت اجرا کرد یا خیر؟! اگر نه ایا میشه اینو به c++.net تبدیل کنم و اگر تبدیل کردم میتونم شبیه سایر کلاسهای زیانهای دات نت از اون در زبانهای دیگه ای مثل c# استفاده کنم یا خیر؟
پیشاپیش ممنون :لبخندساده:
- سروش