吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8399|回复: 12
收起左侧

[C&C++ 转载] 【笔记】注入DLL创建窗口闪退的问题

[复制链接]
s3233431 发表于 2016-4-27 20:14
本帖最后由 奋斗丶小Z 于 2016-5-1 17:22 编辑

最近无聊在写一个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] 纯文本查看 复制代码
 HWND hwnd = CreateDialogParam(h_Module, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc,NULL);
        ShowWindow(hwnd, SW_SHOW);
        MessageBox(hwnd, _T("停住了"), _T("停住了"), MB_OK);

这段代码最主要的是消息框这个代码,他也创建了一个非模态的对话框,所以在执行这一句的时候他是不会立即返回,所以我们的窗口不会直接闪退,直到你关闭消息框
这么做肯定有人觉得很麻烦所以还有以下代码
[C] 纯文本查看 复制代码
        
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] 纯文本查看 复制代码
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_INITDIALOG:
                return TRUE;

        }
        return FALSE;
}

自己在这个函数添加
我给一个完整的代码
[Asm] 纯文本查看 复制代码
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,给我动力,大腿们快出来让我抱住
如果有什么不对的,请给与指正,我一定虚心学习

免费评分

参与人数 1热心值 +1 收起 理由
Tomatoman + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

风霜 发表于 2016-4-27 22:38
看不到执行结果.很难说明在哪个环节出了问题.没看明白是目标窗口退出还是注入的窗口退出.另外如果是目标窗口退出的话,建议看下当注入的窗口退出的时候目标窗口中的WM_CLOSE消息是不是被执行了.
风霜 发表于 2016-4-27 22:43
本帖最后由 风霜 于 2016-4-27 22:45 编辑

建议去找下VC外挂那些注入DLL窗口的资料.里面有很详细的写法及过程.另外很重要的一点就是.DLL卸载的时候一定要清理.有线程一定要等线程执行完毕后DLL再释放.否则就会出现某些不可预料的问题.
Tomatoman 发表于 2016-4-27 20:21
ゞ洣蔵→ 发表于 2016-4-27 20:48
线程不让自动结束,放个循环或者长延时 行么
shi159753 发表于 2016-4-27 20:50
来参谋,参谋   小弟还不知这是什么那
 楼主| s3233431 发表于 2016-4-27 21:05
ゞ洣蔵→ 发表于 2016-4-27 20:48
线程不让自动结束,放个循环或者长延时 行么

用延迟线程会卡死,一直循环应该可以但是感觉代码不好看
楞枷山人 发表于 2016-4-27 21:12
正是我需要的 多谢楼主
xie83544109 发表于 2016-4-27 21:41

多谢楼主分享哟
 楼主| s3233431 发表于 2016-4-27 21:43

快给我热心热心热心!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 06:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表