最近无聊在写一个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参数中的对话框过程的值。
返回值窗口句柄
在创建非模态对话框的时候需要使用多线程创建,不然注入的主程序会卡死,因为他会创建成功后直接返回,导致资源被释放,所以窗口会直接闪退。
解决方案看代码:
|
1
2
3
|
HWND hwnd = CreateDialogParam(h_Module, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc,NULL);
ShowWindow(hwnd, SW_SHOW);
MessageBox(hwnd, _T("停住了"), _T("停住了"), MB_OK);
|
这段代码最主要的是消息框这个代码,他也创建了一个非模态的对话框,所以在执行这一句的时候他是不会立即返回,所以我们的窗口不会直接闪退,直到你关闭消息框
这么做肯定有人觉得很麻烦所以还有以下代码
|
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函数:
|
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;
}
|
自己在这个函数添加
我给一个完整的代码
|
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注入过程中正确创建非模态对话框,避免窗口一闪即逝的问题。通过使用多线程及特定消息循环,确保对话框在注入后能够稳定显示,附带示例代码。
1416

被折叠的 条评论
为什么被折叠?



