修改RAD类VB6、Delphi、BCB、.Net等开发软件写窗口程序类名

文章资讯 2020-02-22 11:17:30

修改RAD类VB6、Delphi、BCB、.Net等开发软件写窗口程序类名

逆向调试
        使用工具
                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
初始化对象实例

void* WINAPI clsSec(){
        cls=new TclsSec;
        return cls;
}

注册需要Hook的类名称

int WINAPI clsSec_Hook(char *onm,char *nnm){
        return cls->hook(onm,nnm);
}

把这些需要被Hook的类名称和相替换的类名称,映射关系,存入map<string,string>对象

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

int WINAPI clsSec_Start(){
        *(void**)&oRegisterClassA=setHook(
                GetProcAddress(LoadLibrary("user32"),"RegisterClassA"),nRegisterClassA,5
        );
        return 1;
}

被Hook的API过程中,对类名称做检测,并返回char*指针

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位
                未实现

随机窗口类名和随机窗口名。