【笔记】注入DLL创建窗口闪退的问题

最近无聊在写一个DLL的时候想实现注入DLL出现窗口
无奈本人技术太菜,被迷惑了几天,后来翻阅资料才找到
希望给刚刚学WIN32编程的朋友提示下,顺便给我自己写个笔记方便以后遇到了能马上查询到

创建一个非模态对话框
HWND CreateDialogParam(HINSTANCE hlnstancem,LPCTSTR IpTemplateName,HWND hWndParent,DLGPROCIpDialogFunc, LPARAM dwlniParam)
参数一:实例句柄,可以用GetModuleHandle(NULL);获取,也可以在DLL入口函数的参数hModule传入进去
参数二:资源模板,可以用MAKEINTRESOURCE宏包含你创建的RC资源
参数三:指定拥有对话框的窗口
参数四:指向对话框过程的指针,BOOL CALLBACK (*DlgProc)(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
参数五:指定传递到WM_INITDIALOG消息的IParam参数中的对话框过程的值。
返回值窗口句柄

在创建非模态对话框的时候需要使用多线程创建,不然注入的主程序会卡死,因为他会创建成功后直接返回,导致资源被释放,所以窗口会直接闪退。

解决方案看代码:
 

[C] 纯文本查看 复制代码
?
1
2
3
HWND hwnd = CreateDialogParam(h_Module, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc,NULL);
       ShowWindow(hwnd, SW_SHOW);
       MessageBox(hwnd, _T("停住了"), _T("停住了"), MB_OK);


这段代码最主要的是消息框这个代码,他也创建了一个非模态的对话框,所以在执行这一句的时候他是不会立即返回,所以我们的窗口不会直接闪退,直到你关闭消息框
这么做肯定有人觉得很麻烦所以还有以下代码

[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
HWND hwnd = CreateDialogParam(h_Module, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc,NULL);
        ShowWindow(hwnd, SW_SHOW);
        MSG msg;
        while (GetMessage(&msg, NULL, NULL, NULL))
        {
                if (!IsDialogMessage(hwnd, &msg))// 如果消息没有被处理, 返回值为0 
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }


进入一个循环一直获取消息
再调用函数:
IsDialogMessage
该函数决定一个消息是否指定给指定的对话框,如果是,则处理消息给函数指针DlgProc处理
如果不是就调用TranslateMessage和DispatchMessage把消息给系统处理
这样的话就可以防止DLL注入到某个程序的时候,窗口一闪而过
DlgProc函数:

[Asm] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_INITDIALOG:
                return TRUE;
 
        }
        return FALSE;
}


自己在这个函数添加
我给一个完整的代码

[Asm] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
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
HMODULE h_Module;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_INITDIALOG:
                return TRUE;
 
        }
        return FALSE;
}
void __cdecl MyThread(void * a)
{
        HWND hwnd = CreateDialogParam(h_Module, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc,NULL);
        ShowWindow(hwnd, SW_SHOW);
         
        MSG msg;
        while (GetMessage(&msg, NULL, NULL, NULL))
        {
                if (!IsDialogMessage(hwnd, &msg))// 如果消息没有被处理, 返回值为0 
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                h_Module = hModule;
                _beginthread(MyThread, 0, NULL);
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}


各位看官,快给我热心CB,给我动力,大腿们快出来让我抱住
如果有什么不对的,请给与指正,我一定虚心学习

你可能感兴趣的:(【笔记】注入DLL创建窗口闪退的问题)