此前一直从事iOS方面的逆向工作,有强烈的兴趣了解一下Windows逆向,所以就从这160个CM开始。
今天要分享的是160个CM第一个Acid burn,也算是对第一次Windows逆向分析的总结。话不多说,下面开始正文。
0x1 环境与工具
0x2 查壳
- 注:作为CM的第一个程序,有壳的概率很小,但是逆向分析前查壳是个好习惯。
PEID查壳
0x3 去除NAG窗口
- 双击程序启动会有如下的NAG窗口
启动NAG窗口
- 用OD加载程序,然后F9使程序进入运行状态,程序会显示NAG窗口,然后F12暂停程序运行,Alt + F9使程序重回运行态,点击NAG窗口的【确定】按钮,程序将断下,并回到用户程序空间。
- 发现这里并没有爆破常用的点(跳转),因此沿着堆栈继续回溯。
0x42A1AE --> 0x42A170 --> 0x42F79C --> 0x42F784 --> 0x425643
- 回溯到0x425643时,可以在0x42562F处找到爆破点,修改je为jmp,NAG窗口成功去掉。
NAG窗口爆破点
0x4 注册算法
- 随意输入用户名和序列号,点击【check】按钮,弹出错误提示对话框。采用去除NAG窗口的方式使程序断在用户程序空间。我们发现断点断在了NAG窗口相同的位置,所以我们推测,断下来的位置是对MessageBox的封装函数,回溯堆栈到上层。
0x42A1AE --> 0x42A170 --> 0x42FB32
name_serial窗口
- 回溯到0x42FB32时,我们可以在0x42FB03处找到关键跳转,那么我们推测0x42FAFE处为序列号验证函数。
关键算法1
- 我们在0x42FAFE处下断点,重新触发验证流程,我们在寄存器EAX和EDX中看到了两个可疑的字符串,EDX是我们输入的序列号,EAX我们猜测就是我们要找的序列号。
关键算法2
- 接下来我们重点关注EAX的来源,EAX来源于[local.3],上翻代码,看到0x42FAE5的调用,我们看到0x42FADD的传参与[local.3]有关,那么我们在0x42FAE5下断点,然后在数据窗口监视[local.3]的内存,F8观察数据窗口
- 至此我们确定了0x42FAE5为生成序列号的算法函数,但是这只是个拼装算法,观察堆栈,关键数据已经在堆栈中,我们查看数据来源于[local.6],继续上翻代码,在0x42FACD处看到了[local.6]的传参,在0x42FACD处下断点调试。
关键算法3
- 经过调试,我们确定了0x42FACD处即为注册算法的函数调用。此处经过三次硬件断点能快速定位到0x406DDA,我们看到这里已经不是内存拷贝指令,而是寄存器mov到内存,所以我们猜测dl就是保存结果的寄存器。
关键算法4
- 此处代码对EAX的值进行10进制转化,执行的最终结果会保存在ESI指向的内存地址,正是我们要的结果,回溯代码寻找EAX的来源。
- 与查找关键算法点类似,经过三次硬件断点,可以找到以下位置0x42FA8A,此地即为计算EAX的值,结果保存在0x431750
关键算法5
- 至此,算法的破解完成。
0x5 序列号校验
- 这个类似于去除NAG窗口的过程,直接就能定位到爆破点,不再赘述。
总结
通过对Acid burn的分析,目前仍然遗留一个问题尚未解决,在爆破序列号校验的时候,爆破点如果选择下图的位置,重启应用会导致UI的文字全部消失,目前尚不知原因,如果有知道的朋友欢迎下面留言指导,不胜感激。
失败的爆破点
UI文字消失
|