首页
社区
课程
招聘
未解决 [求助]为什么MFC DLL 可以正常挂接(hook)主线程消息而普通DLL却不行? 43雪币
发表于: 2025-2-27 13:25 548

未解决 [求助]为什么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直播授课

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