从某加速器的逆向中学习调试分析

2815 字
8 分钟

从某加速器的逆向中学习调试分析

发布于

前言

我电脑上的brew好久没有更新维护了,GitHub也许久没有登录,原因仅有一个,就是登不上去。在这个时代免费、合法的加速器越来越少。好不容易找到了一个加速器,对外声称免费,但打开一看早已因为缺乏资金改成了付费。 软件界面 它就是我们今天破解的目标。

分析

我们可以事先把二进制用Hopper加载,观察软件不难发现,使用C语言写的,UI框架是Qt,而且大部分的方法和符号已经被混淆。这为我们的逆向增加了难度,因此我们把字符串作为逆向的突破口,进行破解。

再次启动软件,观察可能有用的字符串:该软件在启动的时候会显示提示框“套参(原软件参字打错了)已使用完毕,请充值~”,点击“点我加速”按钮时,又会出现提示框“套参已使用完毕,请充值~”。请记住下面的八个字,它们是我们逆向的关键。

套参已使用完毕,请充值~

除了两个弹窗之外,该软件还需要注册。据我观察,在未注册情况下注册弹窗会代替套餐弹窗。(因为一开始下载软件后我直接注册了,所以破解中没发现这一点。)我们希望在不注册的情况下使用。

综上所述我们的破解目标有4点:

  1. 软件启动时的套餐弹窗;
  2. 软件启动时的注册弹窗;
  3. 点我加速时的套餐弹窗;
  4. 点我加速时的注册弹窗。

接下来就是破解过程。

解决编码问题

我在Hopper中搜索字符串的时候,一无所获。往下翻我发现除了一些英文字符串保持原样之外,剩下的都被编码,类似\x97\xE5\x8F\x82\xE5\xB7\x...。 被编码 这种编码就是utf-8编码,必须转换才能成为中文。频繁地使用第三方工具会大大减慢我们的速度。因此我们不妨写一个Hopper插件(见另一篇文章): pc-2 此脚本可以将utf-8转中文,以便调试的时候使用。不过要搜索字符串的时候,只能用Python手动将中文转为utf-8了。

一破点我加速

如题,这两个弹窗应该(事实也验证了)在一个大进程中,咱们一块搞定。尝试搜索一些关键词,例如我搜的“套参已使用完毕”,可以发现 套餐字符串 我们查看行内注释的交叉引用(按X也可以),可以看到有两个地址在引用:

; DATA XREF=sub_100015e10+779, sub_10001f070+1545

这对应的应该是我们之前在软件中看到的两个弹框。**哪个地址是点击一键加速后的进程呢?**首先双击打开第一个引用地址sub_100015e10+779,并跳转到CFG模式。在进程的第一行指令上下断点。运行Debugger,发现软件没有在启动之后立即断下,说明第一个地址的弹窗就是。我们点击点我加速,指令断下,验证了我们的想法。 暂停运行

套餐弹窗

确认了该进程是点我加速后出现的进程后,我们把鼠标放到字符串的引用处。 调试如图,0x000000010001611b是出现套餐充值的指令。我们想尽办法不让这条指令所在的代码块运行(loc_1000160f0)。指向loc_1000160f0的有三个箭头,BCD。因此图最右上的代码应当一路下行不跳转直到A,就再不会回到loc_1000160f0了。

我们直接把BCD上方的三个指令je,jle,je分别反转为jne,jg,jne。我本想用nop,但这对程序有较大的改变。(一开始我只根据调试结果反转了C处的判断指令,然而发现在D处就跳转了,经过多次调试,我得到结论BCD都要改)

先别急着运行,因为运行后会要求登录。咱们一口气搞定登录问题。 要求登录

登录弹窗

因为软件先验证登录,所以我们顺着刚才的地址往上翻: 流程图

如图,根据字面意思很容易判断出逻辑。一开始我只讲判断是否登录处条件进行反转,后来发现下面有二次判断。将这两处的je都改为jne,登录解除。运行,逆向成功! 逆向成功

二破启动弹窗

搞定了“一破”,基本功能可以使用了,但是瑕疵是启动还会弹出注册的弹窗。到哪找呢?还记得这个图吗? 流程图 右下角我们可以看到一个call:

0x00000001000160c5         call       __ZN10CentralMgr15ShowLoginDialogEv

call后的函数就是全局定义的弹窗。查看这个符号的交叉引用,有7处。双击跳转到这个打开弹窗的函数,然后在首行下断点,并运行。 callstack 刚运行就断下了,调用堆栈中第一行就是弹窗函数,第二行就是调用它的进程:CentralMgr::onAfterInit()。通过交叉引用找到这个进程里的call:

                       loc_10000856d:
0x000000010000856d         mov        rdi, r15 ; CODE XREF=__ZN10CentralMgr11onAfterInitEv+1369
0x0000000100008570         call       __ZN10CentralMgr15ShowLoginDialogEv ; CentralMgr::ShowLoginDialog()

在CFG中代码块往上走一层,把逻辑判断je改jne,破解成功。

运行一下,令我们惊奇的是,启动时的套餐充值弹窗,也消失了!大功告成!

END