一、前言
本次学习的破解的目标是一个ReverseMe,这个程序的特殊之处是它被加密了,而且有些许干扰代码。
二、破解过程
(一).ReverseMe
1.运行程序,弹窗,这个ReverseMe的目的是移除这个弹窗,如下图
点击确定之后显示的代码如下图
2.在x32dbg中载入程序,并且查找字符串,如下图
双击进入这个字符的调用区域,并在这个区域下断点
3.重新运行程序,会发现程序根本没有停在断点处,这就需要重头开始分析了。
到达入口点处,可以看到上面有个对edi的赋值,可能要进行大量的数据改变,所以进入这个call调用中查看。
进入这个call调用之后,首先遇到了个循环,这个循环的意思是对00401000到0x401218处的数据解密(异或上0x5A)
解密前的内存窗口
解密前的汇编窗口
将这个循环执行完,得到解密后的内存区域
解密后的反汇编区域
4.继续运行程序,知道程序到达以下区域,这篇区域是将00403000到00403128处的代码解密(异或上0xB3)
等这个区域解密完成之后,真正的弹窗区域就会出现了
5.找到弹窗区域了,进行修改,将push 0x0,修改为跳转语句
6.但是修改之后,我发现程序无法运行了,在这个地方下硬件断点之后,才发现,这个地方的代码是修改过得
0x401013处的代码用于给0x00401011赋值为6A 00,也就是push 0x0语句,
也就说说我们要在加密的情况下,修改0x00401016、0x00401017的值为B1,0D(EB、57分别异或上5A)
修改如下图
7、保存再次运行,程序没有弹窗了。
三、总结
1.排除一些无用代码。
2.了解代码变形的处理方式
3.代码多态,加密等方式