转载注明出处
http://blog.csdn.net/xugangjava/article/details/7455851
1.首先下载Detour3.0 。
2.新建一个win32的 dll链接库
将 Detour3.0的源代码 Copy到工程目录下,就是下面这个样子
最后在dllmian里面编写 我们的钩子,
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "stdafx.h" #include "detours.h" PVOID g_pOldMessageBoxA=NULL; typedef int (WINAPI *PfuncMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType); int WINAPI ZwNewMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) { return ((PfuncMessageBoxA)g_pOldMessageBoxA)(hWnd, "Hook This!","My hook",uType); } //安装Hook BOOL APIENTRY SetHook() { //大概是 开始事务吧 DetourTransactionBegin(); //更新线程信息 DetourUpdateThread(GetCurrentThread()); //查询函数 地址 将MessageBoxA 地址保存在这个 指针里面 g_pOldMessageBoxA=DetourFindFunction("User32.dll","MessageBoxA"); //将我们的拦截函数 附加到 MessageBoxA 地址上 DetourAttach(&g_pOldMessageBoxA,ZwNewMessageBoxA); //完成hook LONG ret=DetourTransactionCommit(); return ret==NO_ERROR; } //卸载Hook BOOL APIENTRY DropHook() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&g_pOldMessageBoxA, ZwNewMessageBoxA); LONG ret=DetourTransactionCommit(); return ret==NO_ERROR; } static HMODULE s_hDll; HMODULE WINAPI Detoured() { return s_hDll; } BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: s_hDll = hModule; DisableThreadLibraryCalls(hModule); SetHook(); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: DropHook();//UNHOOK break; } return TRUE; }
我们的钩子就加载了,
懒得编程序试了进入命令行 cmd 进入到 Hook.dll所在的目录
python 来测试一下 在交互式命令行中输入
OK 输入最后最后一句回车,效果如下,MessageBox的内容已经被修改了
附源代码 http://download.csdn.net/detail/xugangjava/4221929
如何Hook其他进程的MessageBox 请看后续篇
《Hook MessageBox 进阶 全局Hook》
http://blog.csdn.net/xugangjava/article/details/14001685