首页
社区
课程
招聘
[未解决,已结帖] [求助]一个hook问题求助 50.00雪花
2022-8-21 20:47 5372

[未解决,已结帖] [求助]一个hook问题求助 50.00雪花

2022-8-21 20:47
5372
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
LRESULT CALLBACK MyCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    LPCWPSTRUCT stru = (LPCWPSTRUCT)lParam;
    if (nCode == HC_ACTION)
    {
        if (stru->hwnd == g_hwnd && stru->message == WM_USER + 1)
        {
            CString str;
            str.Format(L"lParam:%d---wParam:%d", stru->lParam, stru->wParam);
            OutputDebugStringW(str);
            return 1;
        }
    }
 
    return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
 
bool MyHook()
{
    g_hook = SetWindowsHookExW(WH_CALLWNDPROC, MyCallWndProc, NULL, g_tID);
    if (!g_hook)
    {
        MessageBoxW(NULL, L"Error:Hook", L"Error", MB_OK);
        return false;
    }
    return true;
}
void MyUnHook()
{
    if (g_hook)
    {
        UnhookWindowsHookEx(g_hook);
    }
}
 
 
 
void NewDlg::OnBnClickedButton1()//开始hook
{
    // TODO: 在此添加控件通知处理程序代码
 
    g_hwnd = ::FindWindow(NULL, L"T1ll");
    if (!g_hwnd)
    {
        ::MessageBoxW(NULL, L"Error:hWnd", L"Error", MB_OK);
        return;
    }
    g_tID = GetWindowThreadProcessId(g_hwnd, NULL);
    if (!g_tID)
    {
        ::MessageBoxW(NULL, L"Error:tID", L"Error", MB_OK);
        return;
    }
 
    MyHook();
}

代码如上,这是一个MFC的DLL。将这个DLL注入目标进程后,我用另外一个进程给目标进程发消息,OutputDebugString能正常输出数据,一切正常。

 

但是我将代码移植到普通的DLL,以DllMain开始不带界面的那种DLL中后,OutputDebugString就不输出任何信息了,但是也没有弹报错的信息框。

 

请帮助解决,DLL是不能带窗口的。


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 57
活跃值: (2141)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
qiusuper 2022-8-21 23:54
2
0
估计是hwnd的问题
雪    币: 6701
活跃值: (3336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htpidk 2022-8-22 00:06
3
0
把nCode == HC_ACTION条件去掉,后面都调用 CallNextHookEx试试
雪    币: 3755
活跃值: (3773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2022-8-22 07:43
4
0

你直接贴你的 所谓不成功的普通DLL代码就行了    不要让人在正确的东西里面找未知的错误.   

你需要做的是发你不成功的DLL代码,让别人帮你排查错误,你发个正确的代码有什么意义呢?  



优先排查是不是移植过程中有粗心大意搞错了,然后再确认其他的问题. 比如窗口是不是有效,注入的进程是不是有窗口,注入的线程是不是主线程等等

最后于 2022-8-22 07:50 被Mxixihaha编辑 ,原因:
雪    币: 6287
活跃值: (3812)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大鲤鱼 2022-8-22 19:55
5
0
#include "windows.h"
#include <corecrt_wstdio.h>

HWND g_hwnd = NULL;
ULONG g_tID = NULL;
HHOOK g_hook = NULL;



LRESULT CALLBACK MyCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    LPCWPSTRUCT stru = (LPCWPSTRUCT)lParam;
    if (nCode == HC_ACTION)
    {
        if (stru->hwnd == g_hwnd && stru->message == WM_USER + 1)
        {
            wchar_t str[50] = { 0 };
            swprintf_s(str, 50, L"lParam:%d---wParam:%d", stru->lParam, stru->wParam);
            OutputDebugStringW(str);
            return 1;
        }
    }

    return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

bool MyHook()
{
    g_hook = SetWindowsHookExW(WH_CALLWNDPROC, MyCallWndProc, NULL, g_tID);
    if (!g_hook)
    {
        MessageBoxW(NULL, L"Error:Hook", L"Error", MB_OK);
        return false;
    }
    return true;
}
void MyUnHook()
{
    if (g_hook)
    {
        UnhookWindowsHookEx(g_hook);
    }
}

void DoWork()
{
    g_hwnd = ::FindWindow(NULL, L"sss");
    if (!g_hwnd)
    {
        ::MessageBoxW(NULL, L"Error:hWnd", L"Error", MB_OK);
        return;
    }
    g_tID = GetWindowThreadProcessId(g_hwnd, NULL);
    if (!g_tID)
    {
        ::MessageBoxW(NULL, L"Error:tID", L"Error", MB_OK);
        return;
    }

    MyHook();

}


BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        DoWork();
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
雪    币: 6287
活跃值: (3812)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大鲤鱼 2022-8-22 19:56
6
0
qiusuper 估计是hwnd的问题
那个findwindow我是随便写的,窗口句柄不会错,毕竟MFC的dll一切正常。
雪    币: 6287
活跃值: (3812)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大鲤鱼 2022-8-22 19:58
7
0
不是这个原因
雪    币: 6287
活跃值: (3812)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大鲤鱼 2022-8-22 19:59
8
0
Mxixihaha 你直接贴你的&nbsp;所谓不成功的普通DLL代码就行了&nbsp;&nbsp;&nbsp;&nbsp;不要让人在正确的东西里面找未知的错误.&nbsp ...
代码传了,代码几乎是一样的。但是在MFC的DLL中一切正常,在不带界面的DLL中就不行。
雪    币: 3755
活跃值: (3773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2022-8-22 21:18
9
0

1.确定你获得的窗体是响应消息的窗体么,最好用spy++看下  有没有消息响应.


2.SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。


线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。



你最好在主线程调用的过程中去使用SetWindowsHookEx设置钩子,最后一个参数用 GetCurrentThreadId()

最后于 2022-8-22 21:40 被Mxixihaha编辑 ,原因:
雪    币: 6287
活跃值: (3812)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大鲤鱼 2022-8-22 21:40
10
0
Mxixihaha 1.确定你获得的窗体是响应消息的窗体么,最好用spy++看下&nbsp;&nbsp;有没有消息响应.2.SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是 ...
在MFC的DLL中,一切正常,但是在不带界面的DLL中就不行,而且它没任何报错。
雪    币: 3755
活跃值: (3773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2022-8-23 08:11
11
0
大鲤鱼 在MFC的DLL中,一切正常,但是在不带界面的DLL中就不行,而且它没任何报错。
大概就是没有消息循环,你的DLL估计是在单独的线程注入,然后SetWindowsHookEx后无法进入 HookProc
游客
登录 | 注册 方可回帖
返回