逆向调试
使用工具
VB6
Spy++
OllyICE
详细内容
以VB6为例,不要问我为什么,我特么只会VB啊
VB窗口程序一般初始化有两个可以自定义的过程,分别是Form_Initialize和Form_Load,(除此外还能用模块过程启动,这里不探讨)
然后分别对两个过程,插入MsgBox来中断程序,上OllyICE调试器
可以看到此时,主窗口的类名以及出现了,在Form_Load过程之前,类已经注册。
所以我们要深入Form_Initialize过程之后Form_Load过程之前,程序做了什么
调试器,对Form_Initialize弹框之后,进行下断
可以看到RegisterClassA断到了,我们跟进参数pWndClass中,并跟随红圈中的地址
可以看到这个指针指向了ClassName,我们把窗口类名做个篡改
篡改完之后,使用Spy++查看,可以看到窗口的类名已经改变
就此,我们确定了此方法可行,那么我们只需要对这个API进行Hook,并替换掉这个指针的指向地址就OK。
按照老习惯,写一个DLL,Hook API
初始化对象实例
注册需要Hook的类名称
void
* WINAPI clsSec(){
cls=
new
TclsSec;
return
cls;
}
把这些需要被Hook的类名称和相替换的类名称,映射关系,存入map<string,string>对象
int
WINAPI clsSec_Hook(
char
*onm,
char
*nnm){
return
cls->hook(onm,nnm);
}
开始Hook
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的API过程中,对类名称做检测,并返回char*指针
int
WINAPI clsSec_Start(){
*(
void
**)&oRegisterClassA=setHook(
GetProcAddress(LoadLibrary(
"user32"
),
"RegisterClassA"
),nRegisterClassA,5
);
return
1;
}
DWORD
(WINAPI *oRegisterClassA)(WNDCLASSA *lpWndClass);
DWORD
WINAPI nRegisterClassA(WNDCLASSA *lpWndClass){
char
*p=(
char
*)lpWndClass->lpszClassName;
lpWndClass->lpszClassName=cls->check(p);
return
oRegisterClassA(lpWndClass);
}
功能实现
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位
未实现
随机窗口类名和随机窗口名。