vs2013编译
//inline hook 实际上就是指 通过改变目标函数头部的代码来使改变后的代码跳转至我们自己设置的一个函数里,产生hook.
#include <windows.h>
#include <stdio.h>
//定义一个与MessageBoxA类型一致的函数指针。
typedef int (WINAPI * MessageBox_type)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
MessageBox_type RealMessageBox = MessageBoxA;
//自定义的MessageBox,每调用MessageBox都要跳到myMessageBox来处理
_declspec(naked) void MyMessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
__asm{
push ebp
mov ebp,esp
push esi
}
printf("Hwnd %08x,%s,%s,%d", hWnd, lpText, lpCaption, uType);
__asm{
pop esi
mov ebx,RealMessageBox
add ebx,5
jmp ebx
}
}
#pragma pack(1)
typedef struct _JMPCODE
{
BYTE jmp;
DWORD addr;
}JMPCODE,*PJMPCODE;
void HookMessageBoxA()
{
JMPCODE jcode;
jcode.jmp = 0xe9;
jcode.addr = (DWORD)MyMessageBox - (DWORD)RealMessageBox - 5;
::WriteProcessMemory(GetCurrentProcess(), RealMessageBox, &jcode, sizeof(jcode), NULL);
}
int main(int argc, char * argv[])
{
HookMessageBoxA(); //hook操作
::MessageBoxA(NULL, "InlineHOOK", "Title", MB_OK); //直接加双冒号::表示使用全局函数,当全局函数没有该函数时即指API函数。
getchar();
return 0;
}
成功劫持到了传入的参数。