使用OllyDbg从零开始Cracking 第四十八章-PeSpin V1.3.04脱壳-Part1
第四十八章-PeSpin V1.3.04脱壳-Part1如果有的童鞋看了前两个章节,还是没有搞定那个CrackMe的话,可能考虑先跳过这两章从第48章开始看,可能确实这两章难度有点大。(PS:其实还好,基础扎实的话,看起来还是没有问题的)本章我们来脱PeSpin这款壳,版本是1.3.04。首先我们来定位该壳的OEP。我们用专门定位OEP的OD(olly_parcheado_para_vb)来加载它,断在了入口点处。接着我们单击工具栏中的M按钮打开区段列表窗口,我们对主程序的代码段设置内存访问断点,大家还记得这个内存断点吧,这个OD的内存断点被Patch过,其仅仅是内存执行断点,只有执行才会断下,读取和写入并不会断下。这里检查下看看要忽略的异常选项是否都勾选上了。我们运行起来。这里大家需要等待一段时间,不一会儿工夫断在了这里,应该是OEP,但是入口点特征又不太像,应该是存在Stolen Bytes。我们来看看堆栈:从堆栈中我们可以看到在到达伪造的OEP之前经过了多层函数调用,执行了很多代码,这些代码应该就是我们要找到的stolen bytes。这里我们在反汇编窗口中单击鼠标右键选择Search for-All intermodular calls,查看下主模块调用了哪些API函数。我们可以看到只有少量调用处显示了API函数名称,我们随便选择一个。这里可以看到少量的间接调用API函数的指令-跳转表,我们任选一项定位到IAT。这里我们可以看到IAT的结束地址为460F28,我们往上拉。我们可以看到这些IAT项好像是经过重定向的,我们随便选中一项查看一下参考引用。我们会发现这些项并没有参考引用处,我们继续往上翻,马上就可以看到IAT的起始地址了,所以说明刚刚这些查不到参考引用的项的确是IAT项,这些项被该壳重定向过了而已。现在我们IAT的起始地址和结束位置都知道了,起始地址为460818,结束地址为460F28,下面我们的任务就是要修改IAT以及stolen bytes了。首先我们来定位stolen bytes,定位到伪造的OEP处,往上拉,可以看到一片零区域。下面我们重启OD,看下堆栈。这里我们可以首次断在壳的入口点处时,栈顶指针指向了12FFC4,也就是说,基于堆栈平衡的原理,当壳解密区段完毕,跳往真实的OEP处时,此时的栈顶指针也应该是指向的12FFC4。我们知道通过情况下OEP处的第一个指令为PUSH EBP,执行了这条指令后,栈顶指针应该指向的是12FFC0,所以在数据窗口中定位到12FFC0,给该内存单元设置硬件写入断点。如果该壳对硬件断点没有检测,我们这么做就没有问题,如果该壳对硬件断点有检测的话,就另当别论了。我们运行起来。断在了这里,这里壳还没有解密完毕,我们继续按F9键运行。断在了这里,这里有条PUSH EBP指令,有点像OEP处的指令,嘿嘿,我们继续往下单步跟踪,验证一下看看到底是不是OEP处的指令,对于无JMP指令我们并不会感兴趣,因为其并不影响寄存器组以及堆栈的状态。这里我们可以看到PUSH FBF7BA08这条指令,FBF7BA08被压入堆栈以后,下面又要加上44D5458这个值。我们来看看相加的结果等于多少。这里我们可以看到相加的结果等于450E60,以上两条指令的作用等价于PUSH 450E60。接下来两条指令是类似的,等价于PUSH 4292C8。我们继续。这里又是一条语句,我们继续。继续:这里应该是调用一个API函数,等我们修改了IAT就可以看出来了。跟到了这里,可以看到这里将要跳往伪造的OEP了,嘿嘿,stolen bytes都知道了。我们将stolen bytes都拷贝到OEP处。好了,我们可以看到空间刚刚好,这里stolen bytes我们就修复完毕了,下一章节我们来修改IAT。
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv
[快捷回复]-感谢楼主热心分享! 精彩文章希望继续努力 谢谢分享,学习 学习学习。。 这个不错谢谢,看一下
页:
[1]
2