-
-
[原创]Win32&MFC DLL被动加载完美显示对话框并对应热键呼入呼出
-
发表于: 2015-11-30 17:32 5406
-
本人小菜菜,大神勿喷。
只是对于这几天来鼓捣DLL如何使用对话框并且在被动加载的时候正确显示出来做出以下总结(因为网上大部分都没达到我的要求):
首先说下自己想要实现的效果:
将制作好的DLL注入宿主程序(被动加载)后立马显示此对话框,并且在对话框的初始化函数处设置键盘钩子用来呼入呼出此窗口。
要实现上面的效果会遇到以下难题:
1.win32和MFC(规则)的DLL如何使用对话框资源。
2.目标程序(暂且称为宿主程序)在加载此DLL(可能主动 可能被动)的时候显示此对话框并设置键盘钩子使其有效。
1.先介绍Win32程序:
对于上面第1点 Vc驿站的Syc老大 有两篇帖子讲过
http://www.cctry.com/thread-5516-1-1.html
http://www.cctry.com/thread-5517-1-1.html
但是他是下面这种方式进行调用的即导出方式,
extern "C" __declspec(dllexport) void ShowDlg()
{
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW),NULL,(DLGPROC)DlgProc);
ShowWindow(hwndDLG, SW_SHOW)
}
得专门写个对应的DLL 注入工具并调用DLL导出函数,此时大部分同学可能会想到把此导出函数ShowDlg直接放到DLL_PROCESS_ATTACH:后面会不会行呢?
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hinst = (HINSTANCE)hModule;
ShowDlg() ;//放这
case DLL_PROCESS_DETACH:
break;
}
答案是: 如果宿主程序主动加载此Dll的话是可以的,但是通过远程线程注入的话貌似是不显示的具体原因不得而知。
但是这里有个方法可以解决被动加载DLL的时候让对话框显示,就是在DLL中创建线程让新线程去创建窗口具体做法是:
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hinst = (HINSTANCE)hModule;
CloseHandle(CreateThread(NULL, 0, ThreadProc, this, 0, &ThreadID)); //这里创建线程具体看线程回调函数
case DLL_PROCESS_DETACH:
break;
}
//这里是线程回调函数
DWORD WINAPI ThreadProc(PVOID pArg)
{
//这里创建并显示对话框
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
ShowWindow(hwndDLG, SW_SHOW);
//这里函数很重要,这是新开的线程执行函数 要想显示上面创建的对话框 就必须加上下面的消息loop
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
很多同学上面不加消息循环也会不显示,具体也可以看这篇帖子:http://blog.csdn.net/norains/article/details/2023957
差不多就这样 对于MFC DLL可以参考Win32的 原理一样。
最后附上我的源码包含HOME键呼入呼出对话框.
Src.7z
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]一款Swift写的软件逆向分析 19300
- [求助][讨论]ida 导入头文件 14507
- [原创]Win32&MFC DLL被动加载完美显示对话框并对应热键呼入呼出 5407
- [求助]IDA F5分析一个函数esp定位不正确 3810
- [求助].Net的一个DLL不知道被啥保护软件处理的 3572