Yoda's Crypter 1.3.e 加密壳脱壳

前言:Yoda's Crypter1.3.e脱壳笔记

逆向过程

首先载入OD,界面为如下,并且红标处有pushad,尝试进行ESP定律脱壳,进行硬件断点

F9第一次来到popad的后面,如下图,那么里OEP也不远了,然后尝试对代码code段进行内存访问断点

然后继续F9,发现到了OEP处,那么此时脱壳的工作已经完成了

OEP为 004271B0 . 55 PUSH EBP

进行转储存储,这里自己使用的pe tools,打开发现错误,那么还需要进行相应的IAT修复

重新载入转储的程序,发现OEP无法到达,直接报错,跟随到OEP 004271B0,查看IAT表是否正确,我们知道正常的IAT表其中存放着各个函数的地址,而经过重定向的IAT表,其中并不是存放着地址,而是一个指针,这个指针,指向壳的某个内存空间中,然后在壳中代码片段将地址返回回去

如如下的图,经过重定向之后,IAT表地址中保存的就不是API函数地址了,而是被覆盖了重定向后的地址

所以我们处理这些被加密IAT的地址的办法是找到加密这些IAT的地址的跳转(就是Magic Jump),将它修改为强制跳转(JMP),使之无法加密IAT,从而达到脱壳修复的目的!

我们需要知道IAT表的起始地址和结束地址,在原来脱壳完之后进行寻找

起始地址->00460818 值->0014329A

结束地址->00460F28 值->00000000

差值为:710

然后重新载入一个有壳的程序,我们需要给它的IAT表的地址进行定位,数据窗口查找表达式460818,然后在460818到460F28设置内存写入断点,原因是一开始我们加载进入还是有壳的情况下,都是被加密过的,如果当程序运行起来的时候,iat表的地址就会被覆盖成重定向后的地址,那就会写入,所以这里设置内存写入断点,设置完了之后F9运行程序,如下图,来到了第一个要被修改的api地址

00465730 8902 MOV DWORD PTR DS:[EDX],EAX ; WINMM.PlaySoundA

继续F8走到如下图中,红标处就是IAT表中的地址被重新修改为重定向的地址,所以我们需要进行NOP,让下面的跳转进行跳过,使其不进行重定向

然后进行F9运行程序,发现程序直接中断,但是还是可以获取当前程序的IAT表,此时的IAT是正确的,所以可以进行修复成功!

posted @ 2019-12-28 13:33  zpchcbd  阅读(796)  评论(0)    收藏  举报