X86逆向练习5:破解程序的自效验

在软件的破解过程中,经常会遇到程序的自效验问题,什么是自效验?当文件大小发生变化,或者MD5特征变化的时候就会触发自效验暗装,有些暗装是直接退出,而有些则是格盘蓝屏等,所以在调试这样的程序的时候尽量在虚拟机里面进行吧。

 

这里作者编写了一个文件自效验的例子,并且使用UPX进行了加壳处理,这个CM程序,如果不脱壳的情况下是可以正常执行的,但只要一脱壳程序就废了,这也是大多数程序作者惯用的反破解手法,今天我们就来搞一搞,最终实现的效果是,软件被脱壳,并且程序还照样正常的执行,好了废话不多说,直接开搞。

------------------------------------------------------------

本章难度:★★★☆☆☆☆☆☆☆

课程课件:https://pan.baidu.com/s/1XBnNBO-9ZMkBHAoBRKYqeA   提取码:4a8z

------------------------------------------------------------

1.首先将程序载入OD中,默认会出现一个提示窗口,一般看到这个窗口就说明软件被压缩了,这里点是点否都可以,为了节约时间我就点否了哈。

 

 

2.然后直接运行程序,观察程序的OEP位置,会发现有壳,一般情况下看到【pushad】之类的指令开头,八成是压缩壳。

 

3.先来脱壳,直接上ESP定律,按下【F8】单步一次,观察右侧寄存器窗口,只用ESP寄存器变红,就可以使用ESP定律。

 

4.右键点击ESP寄存器中的数值,直接选择最下方的【HW break [ESP]】,然后点击运行程序。

 

5.然后单步【F8】,或者在sub esp的位置按下【F4】,然后直到jmp跳转。

 

6.会看到下面就是程序的OEP位置了,你或许会有疑问,我咋知道这是OEP呢?原因很简单,看多了就记住了,就像老司机,开车开多了啥都懂了,这些特征需要自己熟记。

 

上图我们需要记住一个关键数据【0045FB81】,这个地址是程序的OEP地址,我们要减去【00400000】,也就是只要记住【5FB81】就好,为啥要减去00400000 ?

哈哈,回到OD,按下【Alt +E】,看到了吧,基地址也就是程序在编译时指定的一个地址段,我们只需要得到偏移地址就好。

 

7.现在OD程序不要动,我们接着打开神器【LordPE】,来完整转存一份镜像。

 

8.接着打开【Import REC】来进行脱壳修复。

 

 

9.删除无效函数,和可疑函数,然后点击【修复转存文件】,然后转存到【dumpe.exe】上面。

 

10.此时在桌面生成了一个dumped_.exe文件,这就是我们脱壳后的程序,程序可以照常运行了并没有出现错误,说明程序脱壳顺利,但是程序内部存在暗装,由于我们脱掉了他的衣服,所以触发了暗装程序被迫终止了。下一步是直接破解跳过这个暗装。

这个程序其实有很多种破解思路,如果用MessageBox信息框的方式来解决是很简单的,但是有些程序在脱壳后,是不会有任何提示的,程序会直接终止执行,本章我不打算使用信息框断点来拦截,我们得想一种新的思路,确保在程序没有任何提示的情况下依然能够破解程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.接着使用ESP定律,快速定位到程序的OEP位置,这里没啥可解释的,如果有疑问可以先去看一下脱壳的文章。

到达程序OEP处,我们记录下修正后的镜像大小,此处直接取消。这里不使用OllyDump脱壳。

 

3.打来LordPE,选择修正镜像大小,然后选择完整脱壳。

 

4.接着使用importREC修复下文件,先将前面的OEP地址复制到OEP处,然后点击自动搜索,然后获取输入表,显示无效函数,和显示可疑函数,可以看到2个可疑函数。

 

5.直接右键,删除指针数据,然后点击右下角的修复转存文件。直接保存到dumped.exe 上面

 

6.此时在桌面生成了一个dumped_.exe文件,这就是我们脱壳后的程序啦,程序可以照常运行了并没有出现错误,说明程序脱壳顺利,但是程序内部存在暗装,由于我们脱掉了他的衣服,所以触发了暗装程序被迫终止了。下一步是直接破解跳过这个暗装。

 

7.先来观察一下脱壳前和脱壳后的文件大小的变化,后期我们可能会用到这个变化后的数值。

脱壳前的大小是:466432  而脱壳后的大小变成了:929792   文件变大了,压缩壳就是如此。

 

8.使用OD载入这个脱壳后的程序,由于程序运行后会提示一个MessageBox信息框,那么我们就拦截这个API,当然也可以拦截ExitProcess这个API,此处们就下一个MessageBoxA断点吧。

 

9.直接运行程序,会断在MessageBox上,我们单步F8步过,然后点击弹窗中的确定,然后ret返回到程序领空。

 

10.回到程序领空之后,向上找,看有没有能跳过弹窗的call,很明显,这一层并没有,我们继续F8单步执行,直到遇到ret返回。

 

 

11.返回之后,会发现代码如下,本层代码简短没有跳转指令,我们继续ret返回到上一层看看。

 

12.上面的图中,返回之后会看到以下代码,这里已经找到了弹窗的调用位置了。

 

13.在CMP处下一个断点,然后从新载入程序。

 

14.重载后发现,程序在cmp处断下来了,我们计算一下十六进制0x71E00等于十进制的多少。等于十进制的466432,刚好是脱壳前的文件大小。

 

15.将其改为脱壳后的文件大小试试。脱壳后的大小是929792也就是十六进制的E3000,我们直接改成E3000

 

16.发现跳转便成了红色,跳转实现了,没错了

 

17.直接复制可执行文件,选择性保存

 

18.打开破解版本,看看,成功啦,软件成功被脱壳,而且程序正常启动了。

 

写教程不容易,转载请加出处,您添加出处,是我创作的动力!

转载于:https://www.cnblogs.com/LyShark/p/11145031.html

程序载入OD   下断bp CreateFileA,F9运行   OD中断,ALT+F9执行到用户代码      下面就是F8单步跟踪了      程序在0048EE23处出现对话框,很明显,在0048EDF9处的跳转就是关键跳了   直接将0048EDF9  /7E 38        jle short dumped_.0048EE33   改成0048EDF9  /7E 38         jmp dumped_.0048EE33   保存下,运行成功   把脱好的程序载入ResScope,发现有非标准资源结构,那就用Fix Resource修正下资源,再次再入ResScope,这次可以修改资源了,但是问题又来了。。。   打开修正好的程序程序只是一闪而过就自动关闭了,看来还有校验,继续操起OD,再次载入程序   下断bp CreateFileA,F9运行   OD中断,ALT+F9执行到用户代码,继续F8单步走      0048EE5F出OD就会跑飞了,显然0048EE5D处的跳转又是关键跳啦,   把0048EE5D  /74 05        je short 1.0048EE64   改成0048EE5D  /74 05        jmp 1.0048EE64   就OK了,保存,运行一切正常   现在程序太大,我们再用CxLrb大侠汉化的Resource Binder V2.6处理一下!   挖塞,程序一下从154M缩小到1.13 MB,这样的结果还是让人满意的   但是一运行,程序又是一闪而过,还有校验,OK,继续   OD载入程序,这次可能会比较卡   下断bp CreateFileA,F9运行   OD中断,ALT+F9执行到用户代码,继续F8单步走      0048EE3F处OD跑飞,也很明显了0048EE3D处就是关键跳啦,   把0048EE3D  . /74 05       je short 2.0048EE44   改成0048EE3D  . /74 05       jmp 2.0048EE44   保存,运行成功,感觉048EE4A处的跳转应该也是个校验吧,只是没用到,程序处理到这里就差不多了,有是不妥之处还望大侠们指点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值