使用OllyDbg从零开始Cracking 第五十一章-ASProtect v2.3.04.26脱壳-Part1
第五十一章-ASProtect v2.3.04.26脱壳-Part1从本章开始,我将会换一种讲解的方式,采用互动的方式来讲解。也可以说是引导的方式来讲解。本章我们的脱壳对象是ASProtect最新版(PS:作者当年的最新版)。本章就由我解决简单的部分,大家来完成复杂的部分,嘿嘿,给大家充分练手的机会。这里我们的目标程序UnPackMe_ASProtect.2.3.04.26.a.exe,该目标程序并没有添加全保护。只是较为简单的一个版本。这里大家需要注意一点,如果OD加载目标程序以后,到达OEP之前就由于该壳的保护报错了的话,大家可以将其复制到别的路径下,然后重启加载试试。譬如说如下错误框:(PS:我实验的时候,采用XP SP3的虚拟机,所有异常都忽略了,但是直接运行起来,还是报这个错误框,后来我换成XP SP2的虚拟机,忽略所有异常又是正确的,具体原因还不清楚。所以这里大家遇到这个问题实在搞不定的话,就换XP SP2的系统吧)这里我给大家介绍两款新的插件OllyBone和Weasle。OllyBone这款插件的安装说明如下:Installation:Copy ollybone.dll and i386/ollybone.sys to your OllyDbg directory。安装说明的意思就是说安装OllyBone插件的方法就是将ollybone.dll放到OD目录下的Plugin文件夹下,然后将i386文件夹下的ollybone.sys放到OD的目录下。如上图所示,我们将ollybone.sys置于OD同目录下了,ollybone.dll放到了OD目录下的Plugin文件夹中了。至于Weasle这个插件,我们将Importer.dll置于OD同目录下,然后将RL!Weasle.dll放到OD目录下的Plugin文件夹下。大家在脱ASProtect这款壳的时候要格外小心,因为它会对INT3断点以及硬件断点进行检测,如果检测到的话,就会报错,那我们就只能重新再来了。所以在定位OEP之前,我们需要配置OllyBone这款插件,首先我来给大家介绍一下OllyBone这款插件,首先根据ollybone.sys的扩展名来看就知道这是一个驱动程序,这个插件主要是用来模拟执行断点的,协助我们的OD(我们前面章节介绍的专门用于定位OEP的那款OD)更快的定位到OEP,但是这个插件有个缺点,就是我们不能对程序进行单步,所以说我们在调试之前先要将异常选项中Debugging options-Exceptions-Single-step break 这一项的对勾去掉。关于这一点OllyBone插件的作者的官网给了详细说明,网址如下: 其他的忽略异常选项我们还是勾选上。此时我们处于入口点处,即ASProtect壳的入口点位于第一个区段中,我们单步往下跟踪几步就会跳转到别的区段。我们大概按4,5下F7键就可以由第一个区段跳转到起始地址为460000的这个区段。下面我们打开区段列表窗口,给第一个区段设置break-on execute(执行断点,该功能是OllyBone插件提供的)。断在了这里。这里对于一般的壳来说,我们现在应该就到了OEP处了,但是对于ASProtect来说,我们断在了这里,这里明显不像OEP,这里我们单步执行这个RET指令,会发现还是返回到了壳创建的区段中,接着我们直接运行起来。等了一段时间,就断在了OEP处。(PS:依然是作者定位OEP的方法,我按照作者的方式选择Set break-on-execute这一项,Bingo蓝屏了)怎么会这样呢?其实啊,这是OllyBone插件要求环境导致的。我们来看看官方的说明:可以看到OllyBone的作者在其主页上已经说明清楚了,使用OllyBone插件的时候不能开启DEP,不然会蓝屏。关闭DEP的方法如下:在我的电脑上单击鼠标右键选择属性。我们先来查看一下DEP是不是确实开启了,选择性能的设置按钮。切换到高级选项卡。切换到数据执行保护选项卡。可以看到确实启用了DEP,未启用DEP的时候这个选项卡的对话框是灰下去的,无法选择。下面我们来关闭DEP,选择设置启动和故障修复按钮。选择编辑按钮(即可以编辑boot.ini文件)。接着讲/noexecute这个选项的值由option修改为AlwaysOff即可关闭DEP。修改完毕以后保存文件。然后重启电脑即可关闭DEP了。好了,现在我已经重启电脑了。我来看看DEP是否已经关闭了。可以看到已经灰下去了,说明DEP已经关闭了。下面我们继续使用OllyBone插件来Set break-on-execute。(PS:但是我尝试了多遍,OllyBone压根不起作用,根本断不下来。可能是年代比较久远的原因吧。我查了下资料,softworm大叔09年的时候写了篇帖子提到了OllyBone,说这个插件不大好用,经常断不下来。可能在PTE上做了手脚,softworm大叔就用DEP又实现了一遍BreakOnExecute的功能,贴出来实现代码,等我后面有时间,再来尝试下写BreakOnExecute这个插件吧。具体什么时候,那就不得而知了,哈哈) 好了,下面说说我是怎么定位OEP的吧。我实验的环境是XP SP2。物理地址扩展我是开启的。DEP我也关闭了,这里其实没有什么影响。大家随意。我采用的是最后一次异常法,大家应该很熟悉了吧。直接用专门定位OEP的那款OD(PS:不用我多说的了,内存单元被Patch,之前章节介绍过很多遍了)加载目标程序。停在了壳的入口点处。查看区段列表可以得知,壳的入口点也在于代码段(PS:OEP实际上也位于代码段)。实际上这是ASProtect作者玩的伎俩。接下来我们将忽略异常的选项都勾选上。然后直接运行起来。可以看到,程序直接正常运行起来了。接下来我们打开日志窗口查看下都发生了哪些异常。可以看到最后一次异常是EEC91A处产生的。接下来,我们将忽略内存访问异常这个选项的对勾去掉。重启OD,依然断在了入口点处,然后按F9键直接运行起来。断在了这里,并不是最后一次异常处。我们按shift+F9,忽略掉该异常继续运行。接着断在了这里,还不是最后一次异常处,我们继续按shift+F9,忽略掉该异常继续运行。好,这里就断在了最后一次异常处了。接下来我们给代码段设置内存访问断点(PS:这里该OD的内存访问断点实际上只有执行的时候才会断下来。)然后继续按shift+F9,忽略掉该异常继续运行。好,断在了这里。这里就是OEP了。这里我们在反汇编窗口中单击鼠标右键选择Analysis-Remove analysis from module选项重新分析代码。 好,现在的显示就正常了。啧啧...成功定位到了OEP。下面我们来进行dump,我们打开OllyDump插件,我个人不太习惯用OllyDump来修复IAT,所以这里我不勾选Rebuild Import这个选项。下面我们来定位IAT。这里我们可以看到OEP下方有一条指令调用了GetVersion这个API函数,说明其是IAT中的一项,好了,现在我们在数据窗口中定位到这一项,接着我们来定位IAT的起始地址。这里我们可以看到IAT的起始地址为460818。接着我们可以看出IAT的结束位置为460F28。所以我们可以得到:OEP = 4271B0IAT的起始地址 = 460818IAT的长度 = 710这次我不用IMP REC来修复IAT了。这里我给大家演示如果用Weasle这个插件来修复IAT。我们找到ImpRec Options这一项,填充OEP ,IAT起始地址,IAT大小。这里我们需要将OEP,IAT的起始地址,IAT的大小,以及从什么地址开始搜索,搜索的范围大小是多少都填充上,接着将搜索模式选择为Search+1。这样理论上就可以开始进行搜索了。但是,这款插件有时候会漏掉某些DLL,我们就需要手动将DLL添加上,这里我们单击Add按钮来添加DLL,譬如这里的460F24这个IAT项所在的DLL就被遗漏了。我们来看看该项的参考引用。这里明显我们可以看到oledlg.dll这个DLL被遗漏了。我们添加上这个DLL然后再次单击Search按钮进行搜索。这样就OK了。但是由于这个插件还是一个测试版本,所以可能搜索的结果会有一些错误。我迫不及待的想试试发布版了,嘿嘿。下面我们来看看修复的效果如何。这里我们可以看到提示找到了429处API函数调用处。总共定位到API函数429个。我们直接单击Fix dump按钮修改dump文件。我们运行修复后的dump文件,直接报错了,可以看到错误提示是无法定位在kernel32.dll中定位到RtlSizeHeap这个函数。当然无法定位到啦,RtlSizeHeap这个API函数压根就不是Kernel32.dll导出的,它是ntdll.dll导出的。还好,该插件提供了一个修复ntdll.dll中的API函数的功能,我们单击鼠标右键选择Fix ntdll.dll calls即可。现在我们将刚刚修复的exe后缀的文件删除掉,然后将bak后缀的文件重命名为exe后缀,然后再次单击Fix dump按钮修复dump文件。这里IAT就被修复了。但是我们直接运行修复后的文件发现还是无法正常运行,说明还存在AntiDump。我们再次用OD加载修复后的程序。这里我们可以看到API函数显示正常了,说明IAT已经修复了。我们单击鼠标右键选择Search for-All intermodulate calls查看所有API函数调用处。这里我们可以看到有多处CALL的目标地址都是19B0000(大家的机器上这个地址可能不太一样,以自己机器为准)。下面给大家的任务就是修复AntiDump。大家不必太担心,因为我会给出一些提示。给大家的任务就是15天之内编写出一个脚本来修复AntiDump。完成任务的童鞋可以发邮件给我,我会一个一个的看并进行点评。在下一个章节中,我会给出一个在我看来最简单最高效的脚本。15天以内完成任务的童鞋可以给我发送邮件,附上脚本以及您的ID,修复了AntiDump的童鞋将在下一章节中被提名以资鼓励。下面给大家一点提示。我们用OD加载原程序,并且定位到OEP处。这里我们比较将未dump之前的OEP下方的4272D5这处CALL与dump并修复IAT以后的进行比较会发现下面还存在其他指令。针对于4272D5这一行dump并修复IAT后,我们可以看到调用了GetStartupInfoA这个API函数。4272D5到4272DB一共占6个字节。而未修复IAT之前ASProtect将其替换成了一个占5个字节的CALL(很明显第6个字节是垃圾指令)。未修复IAT的情况下4272D5这个CALL的返回地址处的指令如下:004272D5 E8 268D5801 CALL 019B0000004272DA D9F6 FDECSTP这里我就不给出原作者的提示了,作者的提示比较隐晦。这里我给出我的提示。大家可以给4272D5这一行设置一个断点,运行起来,就断在了这一行。然后我们利用OD自带的跟踪功能来定位修改AntiDump的关键点。我们需要定位处于哪一条指令处时的通用寄存器中保存了GetStartupInfoA这个API函数的地址。跟踪停止后,如果大家感觉停下来的地方不是很像关键点的话,就继续自动跟踪,直到确认是关键点为止。我们还有另一个切入点可以更加精确的定位关键点。就是执行完CALL 019B0000 这条指令后,正常情况下会返回到4272DA这个地址处,但是4272DA处这个字节是垃圾指令。所以ASProtect壳在调用完GetStartupInfoA这个API函数并且返回到之前势必会将4272DA这个字节修改掉,并且将返回地址修改为4272DB,这样接下来才能够正常继续往下执行。所以基于这个切入点,我们可以对4272D5开始的多个字节设置内存访问断点,将这两个切入点结合起来,就可以让大家更加精确的定位关键点了。大家要做的就是尽自己所能在2006年8月17号之前编写能够在各个系统上都能够良好执行的脚本。对于完成任务的童鞋我会在下一章节中予以提名以资鼓励。本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv
我来学习脱壳,帮回复
[快捷回复]-感谢楼主热心分享! [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!做的不错哦,楼主加油,期待更好的作品! 谢谢大佬 不懂,只能看热闹!! 谢谢分享 楼主威武!!!!!! 我来继续学习,谢谢~!
页:
[1]
2