【工具】
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天可用
VBA代码宝-2018版 - 图1
2.点击一下激活
VBA代码宝-2018版 - 图2
3.随意输入激活码,点击激活测试,提示”激活码无效”<—-这个提示的关键字就是我们的逆向的切入点
VBA代码宝-2018版 - 图3
4.打开x64DBG启动EXCEL,点击符号窗口,查找带有Home的模块(因为VBA代码宝它的安装路径里面包含ExcelHome),过滤出来3个发现有一个VBAHelper.dll,没错就是它了,其它2个模块是程序辅助模块。
VBA代码宝-2018版 - 图4
5.在VBA代码的根目录找到VBAHelper.dll,将它托到.Net工具里面进行查壳,它是加了.Net Reactor的壳子
VBA代码宝-2018版 - 图5
6.经测试使用de4dot-Reactor5.0可以将程序脱壳,使用方法:直接将vbahelper.dll拖到de4dot-x64.exe上即可
VBA代码宝-2018版 - 图6
7.脱壳后的程序名字后面带一个cleaned
VBA代码宝-2018版 - 图7
8.现在将脱壳后的DLL再用ScanId查一下壳,发现扫描结果显示没有混淆了
VBA代码宝-2018版 - 图8
9.将原来的后面加个old,脱壳后的dll名改成原dll名
VBA代码宝-2018版 - 图9

二、破解方式1(修改内存数据)

2.1、分析激活点(静态)

1.将VBAHelper.dll载入到dnSpy_x64中,按快捷键**Ctrl+Shift+K**搜索激活字符串,发现出来有4个搜索结果
VBA代码宝-2018版 - 图10
2.点击Do方法进去看看,它的提示的激活还没有过期,并不是激活失败,但是相关,我们再继续找找
VBA代码宝-2018版 - 图11
3.点击第一个搜索结果,跟随过去看看,发现有一个”激活码无效”的赋值语句
VBA代码宝-2018版 - 图12
4.双击跟随这个成员,右键分析,看看哪些地方引用了它
VBA代码宝-2018版 - 图13
5.发现它被两个方法引用了
VBA代码宝-2018版 - 图14
6.跟随btnOK_Click方法,在方法开头下个断点
VBA代码宝-2018版 - 图15
7.跟随btnOK_Click方法,在方法开头下个断点
VBA代码宝-2018版 - 图16

2.2、分析激活点(动态)

1.下好断点后点击启动,程序集路径为Excel路径,点击ok
VBA代码宝-2018版 - 图17
2.输入一大串1点击激活
VBA代码宝-2018版 - 图18
3.程序段到了btnActive_Click,它这里又调用了Active方法,我们跟随过去看看
VBA代码宝-2018版 - 图19
4.Active方法里面又调用了ActiveTool方法,我们继续跟随过去看看
VBA代码宝-2018版 - 图20
5.发现ActiveTool方法里面又调用了HttpGetStrng方法
VBA代码宝-2018版 - 图21
6.在方法头部下一个断点
VBA代码宝-2018版 - 图22
7.按下F9运行,F10单步一直到这里来,观察result的返回值
VBA代码宝-2018版 - 图23
8.将它复制出来格式化一下,我们关注两个属性即可,具体如下图
VBA代码宝-2018版 - 图24
9.将无效激活改成假,下一个激活时间改成2099年12月31号
VBA代码宝-2018版 - 图25
10.编辑这个值,改成如上一步骤图中的值
VBA代码宝-2018版 - 图26
11.改好以后直接运行,再点击关于,发现现在剩余天数还有28529天
VBA代码宝-2018版 - 图27
12.打开代码库管理,发现打开时不会弹出提示激活,使用没有任何限制
VBA代码宝-2018版 - 图28

三、破解方式2(修改注册表)

3.1、监控进程动作

1.打开火绒剑监控Excel进程
VBA代码宝-2018版 - 图29
2.打开VBA代码宝的关于界面,去到火绒剑中搜索Date(时间),可以看到程序读取了一个**active_nextActiveDate**的注册表现的值
VBA代码宝-2018版 - 图30
3.复制火绒剑过滤出来的注册表路径,打开注册表工具,跳转到对应目录,观察**active_nextActiveDate**的值,发现是经过加密
VBA代码宝-2018版 - 图31

3.2、分析加密方式

1.打开dnSpy_x64加载VBAHelper.dll,搜索**active_nextActiveDate**字符串,看看哪里引用了它,目的是分析它是如何加/解密的
VBA代码宝-2018版 - 图32
2.点击**ReadNextActiveDate**方法,按下快捷键Ctrl+Shift+R分析,看看谁调用了它
VBA代码宝-2018版 - 图33
3.来到这个地方,发现调用完**GetNextActiveDate**接着就是调用**Decrypt**方法对它进行解密
VBA代码宝-2018版 - 图34
4.跟随Decrypt方法,在头部下个断点,让程序跑到这里来,可以看到首先程序将密钥转成unicode形式,之后将注册表中的值进行base解码,之后再des解码
VBA代码宝-2018版 - 图35

3.3、编写脚本解密

1.编写python3脚本,模拟程序加解密

  1. # 编码参考
  2. # https://docs.python.org/3.7/library/codecs.html#standard-encodings
  3. from Crypto.Cipher import DES
  4. import base64
  5. # 将时间进行加密
  6. def date_enc(date):
  7. # 将时间转成unicode-16小端序
  8. date = date.encode('utf-16-le')
  9. # 将kong转成unicode-16小端序
  10. key = 'kong'.encode('utf-16-le')
  11. iv = key
  12. # 创建DES对象
  13. des = DES.new(key=key,iv=iv,mode=DES.MODE_CBC)
  14. # 加密时间
  15. enc = des.encrypt(date)
  16. # 返回base64编码后的内容
  17. return base64.b64encode(enc).decode()
  18. # 将时间进行解密
  19. def date_decrypt(value):
  20. # 首先base64解码
  21. buf = base64.b64decode(value)
  22. # 将kong转成unicode-16小端序
  23. key = 'kong'.encode('utf-16-le')
  24. iv = key
  25. # 创建DES对象
  26. des = DES.new(key=key,iv=iv,mode=DES.MODE_CBC)
  27. # 解密数据
  28. ret = des.decrypt(buf).decode('utf-16_le')
  29. return ret
  30. value = "1vTyi1McS6Vxz3HHiubC8zXpUqzFN+06"
  31. # 解密数据
  32. ret = date_decrypt(value)
  33. print("[+]解密后时间:",ret)
  34. # 加密测试
  35. enc = date_enc(ret)
  36. print("[+]时间[20991229]加密后:",enc)

2.输出结果,与程序解出来的一致

  1. [+]解密后时间: 20991229
  2. [+]时间[20991229]加密后: 1vTyi1McS6Vxz3HHiubC8zXpUqzFN+06

3.导出注册表项,可以给其它电脑使用
VBA代码宝-2018版 - 图36

四、破解方式3(抓包改包)

4.1、开启监听

1.打开Fiddler,设置监听端口(默认就是8888)
VBA代码宝-2018版 - 图37
2.打开SocksCap64配置代理添加8888端口并将EXCEL程序拖入到代理面板来
VBA代码宝-2018版 - 图38

4.2、抓包改包

1.输入任意注册码测试,观察在FD中发送的请求数据包
VBA代码宝-2018版 - 图39
2.下一个断点,然此请求要响应时就断下来
VBA代码宝-2018版 - 图40
3.与破解方式1一样修改返回的字段值一个是注册码是否有效,另一个是使用期限
VBA代码宝-2018版 - 图41

4.3、验证效果

1.改完以后点击运行到完成,提示激活成功
VBA代码宝-2018版 - 图42
2.查看剩余时间,可用大约1093多年,已经够用了
VBA代码宝-2018版 - 图43