|
发表于 2015-6-23 16:46:05
|
显示全部楼层
- #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;
- }
复制代码 |
|