吾爱破解培训第四课:击破程序最坚固的堡垒--实战去程序自校验

Author Avatar
kabeor 3月 31, 2019

吾爱破解培训第四课:击破程序最坚固的堡垒–实战去程序自校验

常见自校验方法

1.最简单的校验

最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。

2.CRC(Cyclic Redundancy Check,循环冗余校验)循环冗余校验

利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

3.MD5、SHA、MAC等摘要算法

摘要算法用于数据量比较大的场合。它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。

笔记

一、查壳加区段

安装豪迪QQ群发器2017.7.9版本。
首先使用ExeinfoPE查壳,发现程序无壳,为Delphi编写程序,此图省略
使用StudyPE增加一个qqqf区段,同时得到内存偏移地址:0062D000
加区段是为了修改代码方便

二、破解注册码本地验证

首先根据小生我怕怕教程,我们知道先搜索一下UNICODE,查找 已注册版本
image
这里我们发现一处内存地址比较 0x5950CC 如果为1,则为注册版本

于是我们查找此地址所有常量,均下断点后,逐个分析
image
在以上查到的7处中,其中有2处为直接赋值,那么我们果断直接改为1

也就是将

mov byte ptr ds:[0x5950CC],0x0

直接改为

mov byte ptr ds:[0x5950CC],0x1

3处CMP比较位置不做修改

剩余2处间接赋值语句在同一个代码段,通过分析处理,进行修改
image
二、破解自动更新及网络验证

因近期新版本会自动进行更新,所以先使用网络工具Smsniff检测自动更新等信息。

先运行smsniff,启动抓包功能,然后运行主程序 qqqf.exe

程序运行起来后,停止抓包,得到如下结果
image
这里发现程序启动后会有两次http访问获取,地址分别为:

http://www.hd466.com/reg/gm2.txt
http://www.hd466.com/update/02.txt

打开OD,载入程序后中文搜索,搜索ASCII,查找 reg/gm2.txt

在代码首下断点后运行程序,断点后单步跟入观察,首先我们发现
image
从代码可以分析得到 先从 0x590FD0 地址取出 0x5950CC 我们第一步得到的注册码验证地址,然后进行比较

那么我们查找此地址所有常量,下断点
image
逐个跟入地址进行分析

第1处 00552F9A 取出后直接赋值 1 ,所以不做修改

第2处 00553240 取出后直接赋值 0 ,果断改为 1 此处包含注册码已经作废,虽然无用,但也修改下吧

第3处 0055467B 取出后直接赋值 0 ,果断改为 1

第4处 005546A4 取出后直接赋值 1 ,所以不做修改

第5处 00554712 取出后直接赋值 0 ,果断改为 1

第6处 00554C49 取出后进比较,分析此代码段发现 “正在验证,验证失败”等字样,

竟然和入门教学培训大神小生我怕怕讲解过验证时一样的代码段

于是果断找到段首,直接 retn 所以第6处代码不做修改
image

第7处 00554E04 取出后直接赋值 0 ,果断改为 1 (此代码为验证失败后赋值)

第8处 00576171 取出后进行比较,出现检查新版本字样,为防止意外更新,我们进行处理下 强行NOP掉更新,同时强行再赋值 1
image

这样处理只是为了安全起见,强行改为1也是为了加强一下保险,哈哈

第9处 00576E5C 取出后进比较,查看下面代码,初步不做修改

第10处 00579359 取出后进比较,查看下面代码,初步不做修改

第11处 0057EEC3 取出后进比较,查看下面代码,初步不做修改

第12处 0057EEF0 取出后进行判断,强行改代码为 mov byte ptr ds:[eax],0x1

第13处 0057F543 取出后进行比较 程序运行后发现,此处下面的 CALL 为检测注册码段,

我们将 call 0057F46C 和 test al,al 直接NOP掉,同时将下方的JNZ直接改为JMP
image
第14处 00580AE5 发现将地址传给了EBX 于是向下查看代码段,发现两次设置EBX的值,果断将 CMP 和 SETE 两行NOP
imageimage

注:后期跟踪发现,此两处是对注册码位数进行比较,是12位则设置为1,否则为0

至此,14处地址全修改完毕,保存文件!

注:后来分析发现,gm2.txt 为一加密文件,程序获取后进行解密,得到一系列网址

既然我们直接把第一步验证给过掉了,那些也就不存在自动更新了。

gm2.txt 解密后内容应该为:

http://www.hd466.com/check.cgi/Check|http://www.hd466.com..http://www.8222.com/reg/|http://www.8222.com..http://s.hdrj.cn/reg/| http://s.hdrj.cn..http://www.h8855.com/reg/|http://www.h8855.com..http://s.8222.com/reg/|http://s.8222.com

重新打开 smsniff 抓包,发现再运行程序,已经不再连接网络。

重新OD载入,运行程序,点击注册按钮,我们会发现 程序显示为 “已注册版本” 程序状态栏也显示 “已注册!”
image
三、破解注册窗口输入注册码点确定后网络验证注册码

OD运行脚本 各语言按钮事件 “Delphi & VB事件断点查找脚本.osc”

运行程序,进入注册窗口,输入12位数字,点击确定后OD中断在 00556054

单步跟入会发现连接网址

http://www.hd466.com/check.dll?id=0258536384&sn=123654789012

进行验证

通过网站返回信息进行验证。
image

通过分析可以确定,上图中标注的行为进行网络验证行,跟随进入后发现有多处调用,直接 retn 掉

运行程序后 再点注册确定按钮,出现提示说明程序完全正常,点确定后会重启程序,不知道正常注册后会不会自动重启程序。
image
四、破解程序自校验

通过教程我们知道,程序有自校验功能,如果不修复的话,插入一些功能会出现乱码

OD运行脚本 各语言按钮事件 “Delphi & VB事件断点查找脚本.osc”

运行程序,需要插入个随机数字 00582BFC 程序执行此处代码段

单步进入,跟踪到执行 Desklog.dll 代码段
image
继续跟入,找到自校验代码段
image
跟入找到获取自身验证码段 004B46D6
image
新开OD,载入原版程序,运行程序,在004B46D6处设置断点,然后插入一次随机数字

程序断下来后,数据跟随,得到数据:0D 74 66 3D 3C 47 B4 95 E3 E6 19 97 85 8E 4A 84

回到OD修改程序处,反复运行程序跟踪数据,发现 当操作插入随机数字或字母等信息时,EBX值为10

所以跳到新区段处,修改代码对写入原版本校验数据:
image
image
至此破解工作已经全部完成,打开QQ,发送信息测试一切正常。

五、其他修改

修改注册窗口,修改程序标题,修改部分按钮无效。

From https://kabeor.github.io/吾爱破解培训第四课:击破程序最坚固的堡垒–实战去程序自校验/ bye

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://kabeor.github.io/吾爱破解培训第四课:击破程序最坚固的堡垒--实战去程序自校验/