首页
社区
课程
招聘
[求助]安装局部键盘钩子调用时机的问题
发表于: 2016-12-6 00:33 2656

[求助]安装局部键盘钩子调用时机的问题

2016-12-6 00:33
2656
我写了一个dll,实现一个局部键盘钩子,部分核心代码如下。
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()并不能成功安装钩子,这是什么原因呢?
还望高手解答,多谢!

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回