本帖最后由 奋斗丶小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,给我动力,大腿们快出来让我抱住
如果有什么不对的,请给与指正,我一定虚心学习
|