【工具】
dnSpy-Chinese.zip
SocksCap64.rar
ScanId_1_5.rar
de4dot-Reactor5.0.rar
【环境】 Windows 10 x64
【程序】VBA代码宝-2018.rar
一、初探脱壳
1.安装VBA代码宝,打开EXCEL的VB编辑器,点击VBA代码的关于界面,可以看到还剩余0天可用
2.点击一下激活
3.随意输入激活码,点击激活测试,提示”激活码无效”<—-这个提示的关键字就是我们的逆向的切入点
4.打开x64DBG启动EXCEL,点击符号窗口,查找带有Home的模块(因为VBA代码宝它的安装路径里面包含ExcelHome),过滤出来3个发现有一个VBAHelper.dll,没错就是它了,其它2个模块是程序辅助模块。
5.在VBA代码的根目录找到VBAHelper.dll,将它托到.Net工具里面进行查壳,它是加了.Net Reactor的壳子
6.经测试使用de4dot-Reactor5.0可以将程序脱壳,使用方法:直接将vbahelper.dll拖到de4dot-x64.exe上即可
7.脱壳后的程序名字后面带一个cleaned
8.现在将脱壳后的DLL再用ScanId查一下壳,发现扫描结果显示没有混淆了
9.将原来的后面加个old,脱壳后的dll名改成原dll名
二、破解方式1(修改内存数据)
2.1、分析激活点(静态)
1.将VBAHelper.dll载入到dnSpy_x64中,按快捷键**Ctrl+Shift+K**搜索激活字符串,发现出来有4个搜索结果
2.点击Do方法进去看看,它的提示的激活还没有过期,并不是激活失败,但是相关,我们再继续找找
3.点击第一个搜索结果,跟随过去看看,发现有一个”激活码无效”的赋值语句
4.双击跟随这个成员,右键分析,看看哪些地方引用了它
5.发现它被两个方法引用了
6.跟随btnOK_Click方法,在方法开头下个断点
7.跟随btnOK_Click方法,在方法开头下个断点
2.2、分析激活点(动态)
1.下好断点后点击启动,程序集路径为Excel路径,点击ok
2.输入一大串1点击激活
3.程序段到了btnActive_Click,它这里又调用了Active方法,我们跟随过去看看
4.Active方法里面又调用了ActiveTool方法,我们继续跟随过去看看
5.发现ActiveTool方法里面又调用了HttpGetStrng方法
6.在方法头部下一个断点
7.按下F9运行,F10单步一直到这里来,观察result的返回值
8.将它复制出来格式化一下,我们关注两个属性即可,具体如下图
9.将无效激活改成假,下一个激活时间改成2099年12月31号
10.编辑这个值,改成如上一步骤图中的值
11.改好以后直接运行,再点击关于,发现现在剩余天数还有28529天
12.打开代码库管理,发现打开时不会弹出提示激活,使用没有任何限制
三、破解方式2(修改注册表)
3.1、监控进程动作
1.打开火绒剑监控Excel进程
2.打开VBA代码宝的关于界面,去到火绒剑中搜索Date(时间),可以看到程序读取了一个**active_nextActiveDate**的注册表现的值
3.复制火绒剑过滤出来的注册表路径,打开注册表工具,跳转到对应目录,观察**active_nextActiveDate**的值,发现是经过加密
3.2、分析加密方式
1.打开dnSpy_x64加载VBAHelper.dll,搜索**active_nextActiveDate**字符串,看看哪里引用了它,目的是分析它是如何加/解密的
2.点击**ReadNextActiveDate**方法,按下快捷键Ctrl+Shift+R分析,看看谁调用了它
3.来到这个地方,发现调用完**GetNextActiveDate**接着就是调用**Decrypt**方法对它进行解密
4.跟随Decrypt方法,在头部下个断点,让程序跑到这里来,可以看到首先程序将密钥转成unicode形式,之后将注册表中的值进行base解码,之后再des解码
3.3、编写脚本解密
1.编写python3脚本,模拟程序加解密
# 编码参考# https://docs.python.org/3.7/library/codecs.html#standard-encodingsfrom Crypto.Cipher import DESimport base64# 将时间进行加密def date_enc(date):# 将时间转成unicode-16小端序date = date.encode('utf-16-le')# 将kong转成unicode-16小端序key = 'kong'.encode('utf-16-le')iv = key# 创建DES对象des = DES.new(key=key,iv=iv,mode=DES.MODE_CBC)# 加密时间enc = des.encrypt(date)# 返回base64编码后的内容return base64.b64encode(enc).decode()# 将时间进行解密def date_decrypt(value):# 首先base64解码buf = base64.b64decode(value)# 将kong转成unicode-16小端序key = 'kong'.encode('utf-16-le')iv = key# 创建DES对象des = DES.new(key=key,iv=iv,mode=DES.MODE_CBC)# 解密数据ret = des.decrypt(buf).decode('utf-16_le')return retvalue = "1vTyi1McS6Vxz3HHiubC8zXpUqzFN+06"# 解密数据ret = date_decrypt(value)print("[+]解密后时间:",ret)# 加密测试enc = date_enc(ret)print("[+]时间[20991229]加密后:",enc)
2.输出结果,与程序解出来的一致
[+]解密后时间: 20991229[+]时间[20991229]加密后: 1vTyi1McS6Vxz3HHiubC8zXpUqzFN+06
四、破解方式3(抓包改包)
4.1、开启监听
1.打开Fiddler,设置监听端口(默认就是8888)
2.打开SocksCap64配置代理添加8888端口并将EXCEL程序拖入到代理面板来
4.2、抓包改包
1.输入任意注册码测试,观察在FD中发送的请求数据包
2.下一个断点,然此请求要响应时就断下来
3.与破解方式1一样修改返回的字段值一个是注册码是否有效,另一个是使用期限
4.3、验证效果
1.改完以后点击运行到完成,提示激活成功
2.查看剩余时间,可用大约1093多年,已经够用了
