一个非常清晰的"Hook API"实例源码
2008-06-23 07:44
525 查看
//附件下载:http://d.download.csdn.net/down/509594/rgbsky_nudt
/*==========================a.exe===========================*/ #include <windows.h> #pragma comment(lib,"hookapi.lib") extern "C" __declspec(dllimport) void InstallHook4Api(HWND hwnd); void main() { HWND hwnd; while(1) { if(hwnd =FindWindow("#32770","程序B"))//程序B为目标程序,它调用了MessageBoxA() { InstallHook4Api(hwnd); break; } Sleep(500); } //注意进程A的MessageBoxA()也被修改了 MessageBoxA(NULL,"原MessageBoxA()","程序A",MB_OK); } /*=========================hookapi.dll=========================*/ #include <windows.h> #pragma data_seg("YuKai") HHOOK hHook=0; HINSTANCE hinstDll=0; HANDLE hHandle=0; DWORD TargetPid; BOOL bApiHook = false; FARPROC fpApiAddr=NULL; BYTE OldCode[5]={0,0,0,0,0}; BYTE NewCode[5]={0,0,0,0,0}; #pragma data_seg() #pragma comment(linker,"/SECTION:YuKai,rws") extern "C" __declspec(dllexport) void InstallHook4Api(HWND hwnd); //--------------------------------------------------------------------------- // 空的钩子函数 LRESULT WINAPI HookProc(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(hHook, nCode, wParam, lParam); } //--------------------------------------------------------------------------- // 安装卸载空钩子(ProcessID=NULL:卸载) extern "C" __declspec(dllexport) void InstallHook4Api(HWND hwnd) { //GetWindowThreadProcessId(hwnd,&TargetPid); //只hook窗口句柄为hwnd的线程 if(hwnd) hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)HookProc, hinstDll,GetWindowThreadProcessId(hwnd,&TargetPid)); else if(hHook) UnhookWindowsHookEx(hHook); } //--------------------------------------------------------------------------- //本函数一定要用WINAPI(即__stdcall),表示本函数自己平衡堆栈(和win32 API一致) int WINAPI myMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT uType) { DWORD dwProtect; /*恢复MessageBoxA()的前5个字节*/ VirtualProtectEx(hHandle, fpApiAddr,5, PAGE_READWRITE, &dwProtect); WriteProcessMemory(hHandle, fpApiAddr, OldCode, 5, 0); VirtualProtectEx(hHandle, fpApiAddr, 5, dwProtect, &dwProtect); bApiHook = false; MessageBoxA(hWnd, "myMessageBoxA()", "钩子Dll", MB_OK); //显示一个对话框,表示HOOK API成功 int nReturn = MessageBoxA(hWnd,lpText,lpCaption,uType); //执行原有的MessageBoxA()功能 /*改写MessageBoxA()的前5个字节*/ VirtualProtectEx(hHandle, fpApiAddr, 5, PAGE_READWRITE,&dwProtect); WriteProcessMemory(hHandle, fpApiAddr, NewCode, 5, 0); VirtualProtectEx(hHandle, fpApiAddr, 5, dwProtect, &dwProtect); bApiHook=true; return nReturn; //返回程序调用MessageBoxA()的下一条语句 } //--------------------------------------------------------------------------- int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved) { HMODULE hModule; DWORD CurrentPid; DWORD dwProtect; char dllname[256]; hinstDll = hinst; switch (reason) { case DLL_PROCESS_ATTACH: hModule = LoadLibrary( "user32.dll"); fpApiAddr = GetProcAddress(hModule, "MessageBoxA"); if(fpApiAddr == NULL) return false; /*MessageBoxA原前5字节存至OldCode[5]*/ _asm { pushad lea edi, OldCode mov esi, fpApiAddr cld movsd movsb popad } /*MessageBoxA新前5字节存至 NewCode[5]*/ NewCode[0] = 0xe9; _asm { lea eax, myMessageBoxA mov ebx, fpApiAddr sub eax, ebx sub eax, 5 mov dword ptr [NewCode+1], eax } /*改写MessageBoxA()的前5个字节*/ CurrentPid = GetCurrentProcessId(); hHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, CurrentPid); VirtualProtectEx(hHandle, fpApiAddr, 5, PAGE_READWRITE,&dwProtect); WriteProcessMemory(hHandle, fpApiAddr, NewCode, 5, 0); VirtualProtectEx(hHandle, fpApiAddr, 5, dwProtect, &dwProtect); bApiHook=true; //增加引用次数后立即卸钩(目的:卸钩后保留该dll存在于目标进程中) GetModuleFileName(hinst,dllname,256); LoadLibrary(dllname); //只能由目标程序卸钩,否则目标程序有可能来不及加载Hook进来的dll if(hHook && (CurrentPid==TargetPid)) UnhookWindowsHookEx(hHook); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; default: break; } return true; } /*=========================================================*/
相关文章推荐
- "未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件"的解决方案
- "无法找到运行搜索助理需要的一个文件,您可能需要运行安装"的解决办法
- 一个关于"int型二维数组"及"指针数组"作函参的地址传递和带回返回值的问题,指针的拓展练习〈二〉
- "Chinese" ---- 一个对中国人带有种族侮辱的称呼
- // 写一个函数,实现将一个字符串中的'/t'替换成四个'*', '/t'个数不定。如char *p="ht/thdsf/t/ttt/tfds dfsw/t ew/t",替换后p="ht****hdsf********tt****fds dfsw****
- 在一个类的头文件(如B.h)中声明了A类,问在此文件中能否用"class A;"来代替#include "A.h"?
- "BOF或EOF中有一个是真,或者当前的记录已被删除,所需的操作要求一个当前的记录"问题解决
- 一个非常不错的纯源码“PDF转换swf”完全脱离安装第三方插件,直接使用java调用Flash api将PDF转换成图片,在将图片转换成swf。
- Web Service开发实例(转的)——这编描述了如何建立一个webService的实例,写得非常简洁清晰,所以情不自禁地就原文照转了
- 一个高考的"黑客"故事:用2B铅笔"注入"阅卷系统(只有佩服。。)
- HOOK API (一)——HOOK基础+一个鼠标钩子实例
- "未能载入文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件"的解决方式
- 对&quot;一个非常难的查询问题(部门上下级的关系)&quot;之解答的完善
- 使用"增强现实"的3D绘图API来增强角色形象的活泼性
- Android使用"中国天气网"API数据通过城市名称获取天气情况
- <form>标签只能作用一个<input type="hidden"/>?
- 如何快速创建一个AJAX的"加载"的图片效果
- Ext的面向对象设计(如何建立一个继承Ext控件的"类")
- "Dynamic Code Evolution for Java dcevm"发现一个NB的东西
- 给一个很长的字符串str 还有一个字符集比如"abc" 找出str 里包含"abc"的最短子串。要求O(n)