本帖最后由 JuncoJet 于 2020-2-22 20:59 编辑
前言
主要是前面我写的这篇内容,引发我的深思。.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<string,string>对象
[C++] 纯文本查看 复制代码 int TclsSec::hook(string onm,char *nnm){
if(nnm){
dic.insert(pair<string,string>(onm,nnm));
}else{
new_seed();
stringstream ss;
for(int i=0;i<8+rand()%(50-8);i++){
ss<<tpl[rand()%64];
}
dic.insert(pair<string,string>(onm,ss.str()));
}
return 0;
}
开始Hook
[C++] 纯文本查看 复制代码 int WINAPI clsSec_Start(){
*(void**)&oRegisterClassA=setHook(
GetProcAddress(LoadLibrary("user32"),"RegisterClassA"),nRegisterClassA,5
);
return 1;
}
被Hook的API过程中,对类名称做检测,并返回char*指针
[C++] 纯文本查看 复制代码 DWORD (WINAPI *oRegisterClassA)(WNDCLASSA *lpWndClass);
DWORD WINAPI nRegisterClassA(WNDCLASSA *lpWndClass){
char *p=(char*)lpWndClass->lpszClassName;
lpWndClass->lpszClassName=cls->check(p);
return oRegisterClassA(lpWndClass);
}
[C++] 纯文本查看 复制代码 char* TclsSec::check(char *nm){
map<string,string>::iterator it;
it=dic.find(nm);
if(it!=dic.end()){
return (char*)it->second.c_str();
}else{
return nm;
}
}
功能实现
32位
多字节
自定义类名
超长类名
随机类名
宽字符
未实现
64位
未实现
随机窗口类名和随机窗口名
自定义类名
超长类名
创建窗口以及调用方法
使用例子详见附件(VB6和易语言例子)
感兴趣的网友可以写个易语言的例子,这个我不会(捂脸
装了个易语言,学习了下,好像易语言本来就能自定义类名,强大!
源码已托管GayHub https://github.com/JuncoJet/clsSec |