#include <windows.h>
#include <stdio.h>
BYTE bOldByte[5]; // 保存hook函数的前5个字节方便恢复
BYTE bNewByte[5]; // hook的指令主要是跳转到自己的函数
PROC fun;
// 为了不造成栈问题 我们需要定义成FindWindow形式
HWND _stdcall hookFun(LPCTSTR lpClassName, LPCTSTR lpWindowName)
{
printf("禁止调用\n");
printf("小孩子不要乱hook\n");
return 0;
}
void hookFindWindow()
{
HANDLE hand = LoadLibrary(TEXT("user32.dll"));
fun = GetProcAddress((HMODULE)hand, "FindWindowW");
ReadProcessMemory(GetCurrentProcess(), fun, bOldByte, 5, nullptr);
bNewByte[0] = '\xe9'; // e9 是汇编的JMP指令
// JMP后面是相对偏移 不会的回去补汇编
*(PDWORD)(bNewByte + 1) = (DWORD)hookFun - (DWORD)fun - 5;
WriteProcessMemory(GetCurrentProcess(), fun, bNewByte, 5, nullptr);
}
// hook完之后不要忘了恢复呦
void unHookFindWindow()
{
if (fun != nullptr)
WriteProcessMemory(GetCurrentProcess(), fun, bOldByte, 5, nullptr);
}
int main(int argc, char* argv[])
{
hookFindWindow();
FindWindow(TEXT("hello"), TEXT("world"));
unHookFindWindow();
FindWindow(TEXT("hello"), TEXT("world")); // 恢复后不会调用hook函数了
return 0;
}
|