-
-
[求助]安装局部键盘钩子调用时机的问题
-
发表于: 2016-12-6 00:33 2656
-
我写了一个dll,实现一个局部键盘钩子,部分核心代码如下。
该dll导出一个函数InstallHook()实现键盘钩子的安装。
目前有三种测试使用方法,
一是写一个MFC程序,使用LoadLibrary动态加载dll,并使用GetProcAddress获取导出函数idle()地址并调用。
二是写一个exe的窗口程序但并没有用到该dll,然后使用stud_PE修改该exe的导入表,导入该dll的idle符号
三是写一个MFC程序,使用LoadLibrary动态加载dll,并使用GetProcAddress获取导出函数InstallHook()地址并调用。
结果只有第三种能够截获键盘记录成功。
前两测试是为了让exe加载带有键盘记录的dll,模拟dll劫持,注意dll的dllmain中已经调用了InstallHook(),按说无论是显式的加载(第一种)还是隐式加载(第二种)dll都会调用dllmain,也就是都会调用InstallHook()完成键盘钩子的安装,但测试结果并没有成功。
第三种方法在宿主进程中显式调用InstallHook()安装键盘钩子,这样才能成功,也就是说在dllmain中调用InstallHook()并不能成功安装钩子,这是什么原因呢?
还望高手解答,多谢!
HHOOK g_hook = NULL; HMOUDULE g_hInst = NULL; extern "C" __declspec(dllexport) void idle()//导出函数:测试用 { //进行一些无关操作。 } extern "C" __declspec(dllexport) void InstallHook()//安装键盘钩子的导出函数 { if (g_hook == NULL) g_hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, NULL, GetCurrentThreadId()); /*安装局部键盘钩子:第三个参数为NULL, 第四个参数使用GetCurrentThreadId()*/ if (g_hook == NULL) MessageBox(NULL, "SetWindowsHookEx() failed!", "Error", 0x10); } LRESULT KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)//回调函数 { //记录按键信息 return CallNextHookEx(hHook, nCode, wParam, lParam); } int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)//主函数 { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hInst=hInstance; InstallHook();//在dll加载的时候安装键盘钩子 break; case DLL_PROCESS_DETACH: UnhookWindowsHookEx(g_hook); g_hook = NULL; break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE ; }
该dll导出一个函数InstallHook()实现键盘钩子的安装。
目前有三种测试使用方法,
一是写一个MFC程序,使用LoadLibrary动态加载dll,并使用GetProcAddress获取导出函数idle()地址并调用。
二是写一个exe的窗口程序但并没有用到该dll,然后使用stud_PE修改该exe的导入表,导入该dll的idle符号
三是写一个MFC程序,使用LoadLibrary动态加载dll,并使用GetProcAddress获取导出函数InstallHook()地址并调用。
结果只有第三种能够截获键盘记录成功。
前两测试是为了让exe加载带有键盘记录的dll,模拟dll劫持,注意dll的dllmain中已经调用了InstallHook(),按说无论是显式的加载(第一种)还是隐式加载(第二种)dll都会调用dllmain,也就是都会调用InstallHook()完成键盘钩子的安装,但测试结果并没有成功。
第三种方法在宿主进程中显式调用InstallHook()安装键盘钩子,这样才能成功,也就是说在dllmain中调用InstallHook()并不能成功安装钩子,这是什么原因呢?
还望高手解答,多谢!
赞赏
赞赏
雪币:
留言: