PDA

View Full Version : سوال: Hook کردن توابع یا استفاده از کد C++ 6 در دات نت



DarkSoroush
پنج شنبه 03 مرداد 1387, 01: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# استفاده کنم یا خیر؟

پیشاپیش ممنون :لبخندساده:
- سروش

DarkSoroush
پنج شنبه 03 مرداد 1387, 12:48 عصر
هیچ !؟

DarkSoroush
پنج شنبه 03 مرداد 1387, 20:17 عصر
:متعجب:
خنده داره که توی این فروم با سطح حدودی بالا یک نفر جواب منو نمیده. :کف:
البته من عادت ندارم dp بزنم چه برسه به tp ولی چه میشه کرد برای بالا اومدن تاپیک و شاید در دید استادان قرار گرفتن لازمه.

linux
جمعه 04 مرداد 1387, 01:16 صبح
:متعجب:
خنده داره که توی این فروم با سطح حدودی بالا یک نفر جواب منو نمیده. :کف:
البته من عادت ندارم dp بزنم چه برسه به tp ولی چه میشه کرد برای بالا اومدن تاپیک و شاید در دید استادان قرار گرفتن لازمه.
برای استفاده از api ویندوز در C# قبلا مثال گذاشته شده است می توانی با کمی تلاش این کد را به C# تبدیل کنی