首页
社区
课程
招聘
[求助]hook(dll)中创建线程 引起崩溃
发表于: 2013-3-26 01:00 5134

[求助]hook(dll)中创建线程 引起崩溃

2013-3-26 01:00
5134
写了个钩子程序A,在DLL中实现的消息钩子回调函数里createthread,然后A将DLL sethook到任务管理器,成功,线程也成功执行,接着退出A,钩子自动卸载,任务管理器也会去unload DLL,但unload完之后任务管理器却发生了崩溃,试了好几个程序,A在退出的时候,被挂钩进程都发生了崩溃。尝试使用_beginthreadex,还是发生崩溃。

经过缩小范围,发现是跟createthread有关,如果不创建线程,一切正常。但创建的线程过程非常简单,代码如下
UINT WINAPI ThreadProcMonitor(LPVOID lpParameter)
{
        while (TRUE)
        {
                Sleep(5000);
        }
       
        return 0;
}

为什么会在钩子DLL卸载的时候引起被挂钩进程崩溃实在是找不出原因。

下面是完整DLL的代码,希望高手指点一二
#include <Windows.h>
#include <process.h>

HHOOK g_hHook = NULL;
HINSTANCE g_hInst = NULL;
HANDLE hThread = NULL;

UINT WINAPI ThreadProcMonitor(LPVOID lpParameter)
{
        while (TRUE)
        {
                Sleep(5000);
        }
       
        return 0;
}

extern "C" _declspec(dllexport) BOOL SetHook(BOOL bInstall, DWORD dwThreadId);

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
        g_hInst = hinstDLL;
       
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
                // Initialize once for each new process.
                // Return FALSE to fail DLL load.
                break;
        case DLL_THREAD_ATTACH:
                // Do thread-specific initialization.
                break;
        case DLL_THREAD_DETACH:
                // Do thread-specific cleanup.
                break;
        case DLL_PROCESS_DETACH:
                // Perform any necessary cleanup.
                break;
        }
       
        return TRUE;
}

LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
        // g_hHook is ignored since from NT according to latest MSDN
        if (hThread == NULL)
        {
                //hThread = CreateThread(NULL, 0, ThreadProcMonitor, NULL, 0, NULL);
                hThread = (HANDLE)_beginthreadex(NULL,0,ThreadProcMonitor,NULL,0,NULL);
        }
       
        return CallNextHookEx(NULL, code, wParam, lParam);
}

BOOL SetHook(BOOL bInstall, DWORD dwThreadId)
{
        BOOL ret = FALSE;
        if (bInstall)
        {
                g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInst, dwThreadId);
                if (g_hHook != NULL)
                {
                        ret = TRUE;
                }
        }
        else
        {
                ret = UnhookWindowsHookEx(g_hHook);
        }
       
        return ret;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
你unload dll的时候,线程退出了没?请设置个标志,用个等待使其退出。没退出的话,unload以后它的代码空间就被回收了,这时线程还要去执行,不崩溃才怪。
2013-3-26 01:26
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
要在创建线程里在次加载dll
2013-3-26 08:37
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
DLL卸載時Thread還在Loop....
2013-3-26 08:54
0
雪    币: 199
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
FreeLibraryAndExitThread
2013-3-26 09:19
0
游客
登录 | 注册 方可回帖
返回
//