使用方法:双击破解补丁打开
[attachment=210727]
然后选择“官方接口”模式,即可正常使用(另外一种模式没破解,留个作业?)
[attachment=210728]
教程开始
1.使用Exeinfo查壳:VMProtect v.1.6x - 2.03
[attachment=210729]
不要看见VMP就慌张,很多作者都不知道VMP的厉害之处在于代码混淆虚拟,以为加个壳就万事OK了,其实不然,没有使用SDK进行代码保护的壳形同虚设,一个内存补丁就搞定了(甚至可以脱掉,本教程不讨论)
2.载入OD,运行分析
点击菜单,注册激活,弹出注册界面,随便输入一个注册码,点击注册按钮,弹出错误提示:
[attachment=210730]
像这种弹出消息框的程序一般比较容易搞定,方法是:弹出提示框以后,点击OD的暂停按钮,如图所示:
[attachment=210731]
这样程序就暂停下来了,再点击右面的K按钮,也就是查看堆栈,如图所示:
[attachment=210732]
这样即可打开堆栈窗口,右键点击MessageBoxExA这一行,选择“显示调用”即可来到user32.dll的领空(也就是找到这个消息框的来源)
[attachment=210733]
在call语句的下一行下断点(先点击这一行,然后按F2)
[attachment=210734]
再点运行按钮,程序就正常运行了
[attachment=210735]
再点击注册码错误提示的“确定”按钮,程序即可中断在刚才我们下断点的那一行:
[attachment=210736]
现在是系统的领空(OD的标题显示的是“模块-user32”),我们要找的是程序里面谁调用了这个MessageBoxExA函数,所以我们按alt+F9可以执行到程序的领空(OD标题显示“模块-软件的文件名”,即说明执行到了程序领空)
[attachment=210737]
完了,这回发现没有代码了,别急,右键点击主窗口,选择“分析--分析代码”即可出现正常代码
[attachment=210738]
我们可以看到弹出注册码错误提示的地方了,从上面找找有没有关键跳,发现没有可以跳过这个调用的地方,显然这是一个里层封装,若想跳过,我们需要继续执行到上一层调用,按F8单步执行,一直到retn语句,再按一次F8即可返回到上一层调用
[attachment=210739]
还是没有看到能跳过这里的跳转语句,再返回一次
[attachment=210740]
这回可看到关键代码了,但是不要着急改这个jnz语句,继续往上翻翻看
[attachment=210741]
这里才是关键跳,而且代码非常清晰,完全没有虚拟变形的痕迹,看来作者果然没有vmp的SDK去保护代码,暗暗偷笑吧
理论上把这个je语句(等于则跳转)nop掉即可完成爆破(也就是不让它跳了),我们试下,右键这条语句,选择“二进制--用nop填充”
[attachment=210743]
这时按F9或点击运行按钮,即可再次恢复程序的运行,随便输入注册码,再点注册按钮,看看效果
[attachment=210744]
哈哈,注册成功了,等等,别高兴的太早,软件提示说请重启软件解除限制,也就是说程序是重启验证型,就算在这爆破成功了,也没什么卵用。。。
别灰心,我们继续来,先猜测一下程序的注册流程:
1.输入注册码注册
2.判断注册码是否正确,正确的话存入注册表
3.重启软件,读取注册表里的注册码,联网验证,正确的话解除限制
那么也就是说我们如果把步骤3里的联网验证爆破掉,那么就肯定注册成功了,这样的话该从哪儿下手呢?
既然是联网验证,那么肯定会调用send这个API函数,那么我们可以下API断点,让程序联网的时候中断
重新载入程序,先不要运行,在OD的命令窗口输入:bp send 回车,再运行程序,发现程序并没有断下,点击“官方接口”按钮,这时程序断下了:
[attachment=210745]
现在依然是系统的领空,我们执行到程序领空再来看:
[attachment=210746]
这里还是里层封装,连续几次返回后,来到这里:
[attachment=210747]
这里非常可疑的,因为前面已经看到了作者认证服务器的网址和注册表位置信息(用于向服务器验证注册码),理论上我们应该修改下面的几个关键跳,让它认证失败的时候依然执行正确的代码,
继续单步执行到这里:
[attachment=210748]
显然这个jnz就是一个关键跳,必须让它成立才能跳过“未注册用户”这段代码,我们直接将jnz(不相等则跳转)改成jmp(无条件跳转):
[attachment=210749]
这时这个跳转就永远成立了,箭头也变成了红色,再继续F8单步执行,发现这里有一个判断注册码过期的关键跳:
[attachment=210750]
但是这里跳转已经实现了,我们不用管,继续往下分析:
[attachment=210751]
这里又是一个关键跳,如果跳转成立的话,程序将会跳转到连接服务器失败的错误提示处,所以我们不能让它跳过去,遂将它nop掉:
[attachment=210752]
再往下分析,发现没有什么让程序走向错误提示的语句了,直接F9将程序跑起来,再试着点击注册按钮:
[attachment=210753]
这回应该没有问题了,测试了下功能,果然都能用,看来程序没有暗桩
程序已经爆破成功了,但是还有一个问题:在OD里修改成功的代码无法另存为exe文件(因为有壳),难道每次都要再OD里运行然后修改才能正常使用吗?答案当然是否定的,虽然我们无法直接修改exe文件,但是我们可以制作内存补丁来解决这个问题,下面我以樱花补丁为例,教大家如何制作内存补丁:
补丁的原理就是等程序运行起来以后,在内存中修改指定的关键代码,达到爆破的目的(也就是相当于我们手动在OD里修改的工作)
所以在打补丁之前,必须总结一下要修改的地址是什么,修改的代码原来是什么,现在又改成了什么,首先回顾下我们刚才修改了哪些代码,一个jnz改成jmp,另外一个jnz给nop掉了,我们回到OD找到我们第一处修改的地方,记住新代码(红色部分的机器码):
[attachment=210754]
也就是EB7A90909090,那么原代码是多少来着?我们肯定忘记了,没关系,我们选择这部分红色代码然后右键选择“撤销此处修改”,这样代码又改回来了:
[attachment=210755]
这次重新记录原来的代码:0F8576000000(长度一定要和上面记录的新代码长度相同,这里都是6个字节)
用同样的方法,找出第二处代码修改并记录(我这里就不演示了),最后总结出两处修改:
1.地址:40C9B7,原代码:0F8576000000,新代码:EB7A90909090
2.地址:40CAF3,原代码:0F85DD000000,新代码:909090909090
总结好了以后,我们打开樱花补丁工具,程序名称那里选择要破解的程序,内存地址,原始指令,修改指令这三处分别填写我们上面总结的三个数据(这里先填写第一处修改):
[attachment=210756]
再点击添加按钮,再用同样的方法添加第二条修改,完成以后如图所示:
[attachment=210757]
这时,我们可以点击“生成补丁”按钮制作内存补丁了,将补丁文件保存到待破解文件同一文件夹下即可,名字随便起:
生成成功以后,我们从此就可以通过打开破解补丁来完成程序的运行并破解,赶紧试试吧
教程结束