首页
社区
课程
招聘
[原创]小技巧:MFC对话框动态类名
发表于: 2014-11-22 11:09 12817

[原创]小技巧:MFC对话框动态类名

2014-11-22 11:09
12817
网上关于MFC对话框类名的帖子基本上都是静态改变,然后重新编译的方式。
但是如果需要每次运行时类名都变化一下,就非常不方便了。

想要做到动态改变类名,首先我们要对MFC的实现进行一些了解(MFC代码是开元的,所以这类不重复了)。

通过使用VS自带的调试功能分析一个对话框在调用DoModel之后和PreInitDialog之前的代码。
跟踪对话框类名初始化等过程。
最后发现对话框是根据资源里读取的对话框定义中的CLASS进行使用类名创建XXOO的~

所以先创建一个对话框,然后资源属性,讲MFC Mode改成false
然后选中对话框,属性修改ClassName为随便写的至少3个字符的字符串,比如123,想随机长点就写长点的字符串。

然后类向导,在虚函数一项上添加一个DoModal的实现。
实现的代码如下:
typedef struct _DLGTEMPLATE_EX{
	DWORD style;
	DWORD dwExtendedStyle;
	DWORD cdit;
	short x;
	short y;
	short cx;
	short cy;
	short width;
	short px;
	short high;
	short py;
	TCHAR mText[1];
} DLGTEMPLATE_EX;
typedef CONST DLGTEMPLATE_EX *LPCDLGTEMPLATE_EX;
typedef LPCDLGTEMPLATE_EX LPCDLGTEMPLATE_EX;

INT_PTR CDynMfcClassDlg::DoModal()
{
	// TODO:  在此添加专用代码和/或调用基类
	
	LPCDLGTEMPLATE_EX lpDialogTemplate = NULL;
	HGLOBAL hDialogTemplate = NULL;
	HINSTANCE hInst = AfxGetResourceHandle();
	if (m_lpszTemplateName != NULL)
	{
		hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
		HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
		hDialogTemplate = LoadResource(hInst, hResource);
	}
	if (hDialogTemplate != NULL)
		lpDialogTemplate = (LPCDLGTEMPLATE_EX)LockResource(hDialogTemplate);

	if (lpDialogTemplate!=NULL)
	{
		AfxMessageBox(lpDialogTemplate->mText);
		//根据原始mText长度生成mText随机字符创
		DWORD old;
		TCHAR *mText = (TCHAR *)lpDialogTemplate->mText;
		UINT mTextLen = _tcslen(mText);
		::VirtualProtect(mText, mTextLen*sizeof(TCHAR), PAGE_READWRITE, &old);
		{
			const TCHAR szText[] = TEXT("qwertyuiopasdfghjklzxcvbnm1234567890");
			std::random_device rd;
			std::mt19937 mt(rd());
			std::uniform_int_distribution<> dist(0, _tcslen(szText) - 1);
			for (UINT i = 0; i < mTextLen;i++)
			{
				int m= dist(mt);
				mText[i]=szText[m];
			}
		}
		//////////////////////////////////////////////////////////////////////////
		AfxMessageBox(lpDialogTemplate->mText);
		WNDCLASS  wc = { 0 };
		::GetClassInfo(AfxGetInstanceHandle(), TEXT("#32770"), &wc);
		wc.lpszClassName = lpDialogTemplate->mText;
		AfxRegisterClass(&wc);
	}

	if (lpDialogTemplate!=NULL)
	{
		UnlockResource(hDialogTemplate);
	}
	if (hDialogTemplate!=NULL)
	{
		::FreeResource(hDialogTemplate);
	}
	
	
	return CDialogEx::DoModal();
}


附件pdf,图文说明,尽在VS2013中实验。
图文.pdf

附加完整工程:
DynMfcClass.zip


[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (29)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
老V起来就发帖!!!

支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支持支持
支持支持支持支持▓▓▓▓▓▓▓支▓▓▓支持▓▓▓▓▓支持支持支持支持支持支
支持支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支▓▓▓▓▓▓▓▓▓▓▓支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持▓▓▓▓支持支持支▓▓▓▓支持支持支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓支持支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓支持▓▓▓▓支持▓▓▓▓▓支持支持支
支持▓▓支持支▓▓▓▓▓支持支持▓▓▓支持▓▓▓支持支▓▓▓▓▓支持支持支
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓支持▓▓支持支持▓▓▓▓▓支持支持支
支持支▓▓▓▓▓▓▓▓▓支持支持支持支持▓▓▓支持支持支▓▓▓▓支持支持支
支持支持支▓▓▓▓▓▓▓支持支持支持支持▓▓▓支▓▓▓▓支持支持支持支持支
支持支持支持▓▓▓▓▓▓支持支持支持支▓▓▓▓支持▓▓▓▓▓支持支持支持支
支持支持支持支持支▓▓▓支持支持支持▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓支持支
支持支持支持支持支持支持支持▓▓▓▓▓支持支持支持支持支▓▓▓▓▓▓支持支
支持支持支持支持支持支持支▓▓▓▓▓支持支持支持支持支持支▓▓▓▓支持支持
支持支持支持支持支持支持▓▓▓支持支持支持支持支持支持支持支▓▓▓支持支持
2014-11-22 11:17
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
最近在研究关于MFC的那些事情。
2014-11-22 11:23
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
路过支持!
2014-11-22 11:23
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
老V最近很勤快啊。
2014-11-22 11:24
0
雪    币: 341
活跃值: (133)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
...
2014-11-22 12:55
0
雪    币: 341
活跃值: (133)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
收藏。。。
2014-11-22 12:57
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这有啥用?
2014-11-22 13:22
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
这个和静态貌似是一个意思吧? 都是在窗口创建之前修改的 你能在窗口创建后 动态修改吗?比如每一秒换一个名字?
懂你的意思,你的初衷是每次打开程序,那个密码框或者xxx的类名是不一样的,防止别人获取信息吧
2014-11-22 13:32
0
雪    币: 229
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢分享,试一下
2014-11-22 13:54
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
有意思!!!!
2014-11-22 14:13
0
雪    币: 576
活跃值: (1500)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
12
学习了,涨知识。
2014-11-22 16:38
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
这个正是我昨天研究一晚上没高懂的问题
2014-11-22 18:37
0
雪    币: 5
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大神就是大神,这么一个小程序也写得这么高大上
2014-11-22 18:47
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
老V最近 改用 这么高大上的语法了.
2014-11-22 20:58
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
老v逆向时看到 #32770 是哪里冒出来的了吗?
2014-11-22 21:23
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
17
调试的时候就是看了怎么来的,才做出来修改~
因为不写占坑字符串名字,就没法~~~
2014-11-23 00:13
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
18
顶 这个真不错 我以前都是HOOK的修改类名
2014-12-21 09:46
0
雪    币: 325
活跃值: (650)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
make
2015-12-17 02:35
0
雪    币: 32
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
大神就是大神,这么一个小程序也写得这么高大上
2015-12-17 20:07
0
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
21
老V起来就发帖!!!

支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支持支持
支持支持支持支持▓▓▓▓▓▓▓支▓▓▓支持▓▓▓▓▓支持支持支持支持支持支
支持支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支▓▓▓▓▓▓▓▓▓▓▓支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持▓▓▓▓支持支持支▓▓▓▓支持支持支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓支持支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓支持▓▓▓▓支持▓▓▓▓▓支持支持支
支持▓▓支持支▓▓▓▓▓支持支持▓▓▓支持▓▓▓支持支▓▓▓▓▓支持支持支
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓支持▓▓支持支持▓▓▓▓▓支持支持支
支持支▓▓▓▓▓▓▓▓▓支持支持支持支持▓▓▓支持支持支▓▓▓▓支持支持支
支持支持支▓▓▓▓▓▓▓支持支持支持支持▓▓▓支▓▓▓▓支持支持支持支持支
支持支持支持▓▓▓▓▓▓支持支持支持支▓▓▓▓支持▓▓▓▓▓支持支持支持支
支持支持支持支持支▓▓▓支持支持支持▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓支持支
支持支持支持支持支持支持支持▓▓▓▓▓支持支持支持支持支▓▓▓▓▓▓支持支
支持支持支持支持支持支持支▓▓▓▓▓支持支持支持支持支持支▓▓▓▓支持支持
支持支持支持支持支持支持▓▓▓支持支持支持支持支持支持支持支▓▓▓支持支持
2015-12-17 20:26
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
如果是
__declspec(dllexport) int __stdcall ABC(int a, int b)

怎么样让ABC这三个字符每次编译都不一样?求教
2015-12-19 11:45
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
6666,向您学习!
2016-5-13 19:27
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mack,学习
2017-9-4 11:23
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
看起来挺不错啊,学习一下
2017-9-4 21:15
0
游客
登录 | 注册 方可回帖
返回
//