Ring3 Hook API
/*Ring3 Hook API 本进程内*/
#include<windows.h>
#include<stdio.h>
typedef (WINAPI *pMessageBoxDef)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
char szOldMessageBox[5] = {0};
char szJmpMyMessageBox[5] = {(char)0xe9}; //0xe9为jmp指令
pMessageBoxDef pMessageBox = NULL;
int WINAPI MyMessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
)
{
printf("函数拦截成功,可以修改传进来的参数,做坏事啦,只是一个例子!\n");
WriteProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);
MessageBoxW(hWnd, lpText, lpCaption, uType);
WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);
return 0;
}
int main()
{
DWORD dwJmpAddr = 0;//jmp指令jmp到的地址
HMODULE hModule = LoadLibrary("USER32.dll");
pMessageBox = GetProcAddress(hModule, (LPCSTR)"MessageBoxW");
dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox - 5;//MyMessageBox是函数入口地址 pMessageBox也是函数入口地址
//pMessageBox(0,0,0,0);
memcpy(szJmpMyMessageBox + 1, &dwJmpAddr, 4);//dwJmpAddr = 0x8869AACC(只是我机器上的,这个数值会变动)
FreeLibrary(hModule);
ReadProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);//读出原来的前5个字节 在地址pMessageBox(0x77d66534)处:
//8B FF 55 8B EC
WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节 在地址pMessageBox(0x77d66534)处:
//E9 CC AA 69 88 (jmp 0X8869AACC)
MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK);
MessageBoxW(GetForegroundWindow(), L"Hello World", L"Win32", MB_OK);
return 0;
}

浙公网安备 33010602011771号