吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7283|回复: 10
收起左侧

[调试逆向] 修改RAD类(VB6、易语言、Delphi、BCB、.Net等)开发软件写的窗口程序类名

[复制链接]
JuncoJet 发表于 2020-2-21 14:18
本帖最后由 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
Image 544.jpg

Form_Load
Image 545.jpg

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

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

可以看到RegisterClassA断到了,我们跟进参数pWndClass中,并跟随红圈中的地址
Image 537.jpg

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

篡改完之后,使用Spy++查看,可以看到窗口的类名已经改变
Image 548.jpg

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

初始化对象实例
[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位
                未实现

随机窗口类名和随机窗口名
Image 538.jpg

自定义类名
Image 539.jpg

超长类名
Image 540.jpg

创建窗口以及调用方法
Image 542.jpg
Image 543.jpg

Image 536.jpg



使用例子详见附件(VB6和易语言例子)
感兴趣的网友可以写个易语言的例子,这个我不会(捂脸
装了个易语言,学习了下,好像易语言本来就能自定义类名,强大!
源码已托管GayHub https://github.com/JuncoJet/clsSec

Release.zip

13.33 KB, 下载次数: 18, 下载积分: 吾爱币 -1 CB

DLL+VB6例子

类安全E语言.rar

297.52 KB, 下载次数: 49, 下载积分: 吾爱币 -1 CB

易语言随机类名例子

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
朱朱你堕落了 + 1 + 1 用心讨论,共获提升!
女萝岩 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bester 发表于 2020-2-21 14:30
本帖最后由 bester 于 2020-2-21 14:36 编辑

你会这么多种语言脚本,shellcode改写指向字符串的指针不香?
 楼主| JuncoJet 发表于 2020-2-21 14:36
bester 发表于 2020-2-21 14:30
你的dll inline hook感觉太麻烦了,事实上,RegisterClassA的参数是一个结构体,类名在这个结构体是一个指 ...

易用性不强吧,shellcode哪是人人会写的
bester 发表于 2020-2-21 14:38
JuncoJet 发表于 2020-2-21 14:36
易用性不强吧,shellcode哪是人人会写的

我觉得对于你来说没难度,而且你把shellcode准备好,任何语言直接可以拿来写内存的
 楼主| JuncoJet 发表于 2020-2-21 14:41
bester 发表于 2020-2-21 14:38
我觉得对于你来说没难度,而且你把shellcode准备好,任何语言直接可以拿来写内存的

涉及时间问题的,很多语言动态特性,只有在调用API前才会生成结构体并填充内容。
结构体内存中的地址也不固定,要实现难度不小呢

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
alittlebear + 1 + 1 萌新懵x中...

查看全部评分

bester 发表于 2020-2-21 14:57
JuncoJet 发表于 2020-2-21 14:41
涉及时间问题的,很多语言动态特性,只有在调用API前才会生成结构体并填充内容。
结构体内存中的地址也 ...

我等会试一下,看看会有什么结果

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
JuncoJet + 3 + 1 赞大佬

查看全部评分

冥界3大法王 发表于 2020-2-21 16:17
@JuncoJet
楼主能不能把x32dbg/x64dbg
的类名搞死?
 楼主| JuncoJet 发表于 2020-2-21 16:32
冥界3大法王 发表于 2020-2-21 16:17
@JuncoJet
楼主能不能把x32dbg/x64dbg
的类名搞死?

的类名搞死?啥意思
雨落惊鸿, 发表于 2020-2-21 17:20
vb  好古老。。
Windows10 发表于 2020-2-21 21:47
VB6我的最爱!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表