前言
主要是前面我写的这篇内容,引发我的深思。.Net开发的WinForm程序,类名无法改变?
教熊孩子8种方法破解父母给他们设置的重重关卡2
https://www.52pojie.cn/thread-1110244-1-1.html
(出处: 吾爱破解论坛)
那么,我常用的VB6(古老开发工具),包括爱坛各人最爱的易语言(我猜的),以及大多数的RAD开发软件开发的窗口程序,可能都无法改变窗口类名吧(大概
以是,我花了半天时间研究,并实现可以随意改变窗口类名。

逆向调试
利用工具
VB6
Spy++
OllyICE
详细内容
以VB6为例,不要问我为什么,我特么只会VB啊
VB窗口程序一般初始化有两个可以自界说的过程,分别是Form_Initialize和Form_Load,(除此外还能用模块过程启动,这里不探讨)
然后分别对两个过程,插入MsgBox来中断程序,上OllyICE调试器
Form_Initialize

Form_Load

可以看到此时,主窗口的类名以及出现了,在Form_Load过程之前,类已经注册。

以是我们要深入Form_Initialize过程之后Form_Load过程之前,程序做了什么
调试器,对Form_Initialize弹框之后,进行下断

可以看到RegisterClassA断到了,我们跟进参数pWndClass中,并跟随红圈中的地点

可以看到这个指针指向了ClassName,我们把窗口类名做个篡改

篡改完之后,利用Spy++检察,可以看到窗口的类名已经改变

就此,我们确定了此方法可行,那么我们只需要对这个API进行Hook,并替换掉这个指针的指向地点就OK。
按照老习惯,写一个DLL,Hook API

初始化对象实例
[C++] 纯文本检察 复制代码void* WINAPI clsSec(){ cls=new TclsSec; return cls;}
注册需要Hook的类名称
[C++] 纯文本检察 复制代码int WINAPI clsSec_Hook(char *onm,char *nnm){ return cls->hook(onm,nnm);}
把这些需要被Hook的类名称和相替换的类名称,映射关系,存入map对象
[C++] 纯文本检察 复制代码int TclsSec::hook(string onm,char *nnm){ if(nnm){ dic.insert(pair(onm,nnm)); }else{ new_seed(); stringstream ss; for(int i=0;icheck(p); return oRegisterClassA(lpWndClass);}
[C++] 纯文本检察 复制代码char* TclsSec::check(char *nm){ map::iterator it; it=dic.find(nm); if(it!=dic.end()){ return (char*)it->second.c_str(); }else{ return nm; }}

功能实现
32位
多字节
自界说类名
超长类名
随机类名
宽字符
未实现
64位
未实现
随机窗口类名和随机窗口名

自界说类名

超长类名

创建窗口以及调用方法




利用例子详见附件(VB6和易语言例子)
<strike>感爱好的网友可以写个易语言的例子,这个我不会(捂脸</strike>
装了个易语言,学习了下,好像易语言本来就能自界说类名,强大!
源码已托管GayHub https://github.com/JuncoJet/clsSecRelease.zip
13.33 KB, 下载次数: 11, 下载积分: 吾爱币 -1 CB
DLL+VB6例子
类安全E语言.rar
297.52 KB, 下载次数: 13, 下载积分: 吾爱币 -1 CB
易语言随机类名例子
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |