本次逆向分析仅供学习交流之用
这次算是本菜鸟第一次在论坛发逆向帖,如果文章有疏漏之处还请各位指出
因为以前看大神分析的时候,很多东西大神都是一语带过,导致很多地方看不懂,我深受其苦
因此这篇分析会写得比较详细,我会尽量把分析过程中的各种尝试都写出来,供大家作参考
这个软件以前也有人发过类似的帖子,但破解不完全,这次发的是完全破解的
第一步
这个软件有一个试用功能,每天可以领取一小时的试用时间,我从这个方面着手进行破解
点击连接之后,会弹出如下界面:
有了弹出框就好办了,用OD打开,对MessageBoxW和MessageBoxA分别下断,然后点击连接
发现OD断在了MessageBoxW,把MessageBoxA的断点取消,然后用ctrl+f9执行到返回,然后f8,返回到上一层代码
发现还是在系统领空,重复这个过程,直到返回到用户空间
(对了,我的OD的执行到用户代码经常使用不了,每次都是只单步执行,不知道是哪里出了问题,有知道的大神烦请指出)
到达上图所示的位置之后,就开始在前面的代码找关键跳了
一共找到两个可能会跳过这个MessageBox的跳转,00B24BB3和00B24BAD:
分别在这两个跳转上下断,重新运行程序,看程序的运行过程
发现在第一个跳转里没有进行跳转,继续运行
发现在第二个跳转里也没有进行跳转,在第二个跳转的时候,把寄存器Z标志的值改一下,使其跳转,继续运行:
发现程序没有再弹出提示框,但也没有进行连接
再次点击连接,使其断在第一个跳转上,这次改第一次跳转时寄存器的值,使其跳转
发现程序连接上了,可以确定第一个跳转就是我们要找的关键跳,将其汇编代码改为jmp,
然后选中修改后的代码,右键->复制到可执行文件->选择,进入如下窗口,右键->保存文件
起个新名字,然后保存,再运行一下,发现可以正常运行
至此,第一步破解就完成了,第一步的破解非常简单,第二步才是真正的难点
第二步
在程序连接之后,过两分钟,发现程序会自动断开,并且没有任何提示
初步猜测是有一个定时器或是无限循环的sleep函数,会每过两分钟就检测剩余时间,如果为0就断开连接
先把这个猜测抛到一边,我们先来看看能不能直接查找字符串找到关键的跳转
在汇编代码窗口右键->中文搜索引擎->智能搜索
找到的带中文的字符串如下:
发现红笔圈出来的字串比较可疑,点进去看看,然后下断,再在程序中点击连接,并等待两分钟,待其自动断开,没现没有断在断点处
再回头看看下断的地方:
发现前面出现的中文字符都在一起
再把程序重新运行一下,发现断下来了,猜测其是在程序运行最开始的时候一并进行加载的
再在字串参考里查找其他中文字串,发现下述字符串:
尝试下断,发现还是在程序开始运行时一并加载的
然后尝试对sleep和setTimer下断,断下之后返回用户空间,尝试修改了sleep前面的跳转,发现都没什么用
setTimer也没有什么发现,至此,放弃这个思路。
过了几天,突然想到程序可能是联网在服务器端进行验证时间的,那么能不能抓包看看呢?
用WinSock expert(至于为什么不用WireShark,因为WireShark不能单独对某程序进行分析,干扰项太多)分析一下这个程序的收发包情况
发现程序断开连接的时候,客户端向服务器端发了一个post,然后服务器返回了一个response
根据WinSock中看到的IP地址,使用WireShark进行过滤,找到对应的包
查看一下post和 response里的内容,发现都被加密了:
尝试用base64解密,发现无效,猜测是用的RSA之类的需要公钥进行解密的加密方式
那么,我们能不能在程序里找到他的加密方式?这样我就能知道他是用的什么进行验证了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课