-
-
未解决 [求助]为什么MFC DLL 可以正常挂接(hook)主线程消息而普通DLL却不行? 43雪币
-
发表于: 2025-2-27 13:25 548
-
同样的代码,64位,在常规远程注入dll后,如果是mfc dll 带界面的,在界面上按一下按钮然后执行下边的代码就正常能够监听到消息。
而普通dll在入口处直接调用hook主线程的函数或者启动线程延迟hook,都只是调试输出显示hook成功,但是回调函数没有任何反应,句柄是正确获取的。
难道在普通dll中不能hook主线程吗?
hook代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | int mainProc() { g_hWnd = Call_获取窗口句柄_EX(); Call_outDebugString( "sh:窗口句柄:%p" , g_hWnd); if (Call_Hook主线程() = = 1 ) Call_outDebugString( "sh:Hook成功" ); else Call_outDebugString( "sh:Hook失败" ); return 0 ; } DWORD Call_Hook主线程() { HWND hGame = g_hWnd; DWORD ndThreadId = GetWindowThreadProcessId(hGame, NULL); if (ndThreadId ! = 0 ) { g_Hook返回 = SetWindowsHookEx(WH_CALLWNDPROC, Call_主线程回调函数, NULL, ndThreadId); if (g_Hook返回 = = NULL) { DWORD error = GetLastError(); Call_outDebugString( "sh: SetWindowsHookEx 失败,错误码:%d" , error); return 0 ; } } else { Call_outDebugString( "sh: 获取线程ID失败" ); return 0 ; } return 1 ; } / / 主线程回调函数 LRESULT CALLBACK Call_主线程回调函数( int nCode, WPARAM wParam, LPARAM lparam) { CWPSTRUCT * lpArg = (CWPSTRUCT * )lparam; Call_outDebugString( "sh:捕获消息 hwnd=0x%p, msg=0x%X" , lpArg - >hwnd, lpArg - >message); if (nCode = = HC_ACTION) / / 自己进程的消息 { Call_outDebugString( "sh:收到消息" ); if (lpArg - >hwnd = = g_hWnd && lpArg - >message = = g_My消息 ID ) { Call_outDebugString( "sh:收到消息" ); switch (lpArg - >wParam) { case 1 : Call_outDebugString( "sh:收到消息1" ); break ; default: break ; } } } return CallNextHookEx(g_Hook返回, nCode, wParam, lparam); } |
dllmain部分
1 2 3 4 5 | case DLL_PROCESS_ATTACH: g_hInstance = hModule; DisableThreadLibraryCalls(hModule); CreateThread(nullptr, 0 ,mainProc, nullptr, 0 , nullptr); break ; |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
赞赏
雪币:
留言: