最近无聊在写一个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,给我动力,大腿们快出来让我抱住
如果有什么不对的,请给与指正,我一定虚心学习