我在看学雪了,看了一段时间了,发现脱壳的文章不少,但是我个人觉得,对于很多像我这样的小白,也是有一些难度,所以我决定写下这篇文章,分享一下。如有不好的地方,请批评指正。本来想录一个视频,但是没有好的录屏软件,深感抱歉。
实验环境: OllyDBG PEiD teltel超速拨号器9.8.exe
实验流程:1) 运行流程,观察2) 查壳3) 去壳4) 再次运行,如果有问题,需要修复IAT,重新脱壳
弹出了“软件注册失败”的关键字。如果我们需要对该软件进行逆向,则这个关键字,就是一个很好的突破口。
存在ASPack的壳。这个壳比较常见,通常我们可以使用ESP定律,单步跟踪等,方法。
使用OD载入我们的目标软件,发现寄存器窗口一片红,尤其是ESP。所以可以尝试ESP定律来脱壳。具体的步骤,我写在上面了。需要强调的是,HW break(ESP),就是一个硬件断点。断点弄好了后,我们运行程序。一般的,壳运行完后,就会把程序的运行权交还给程序。然后根据堆栈平衡定律,程序就会在断点处停下,这时,就很接近我们的OEP了。然后我们一直单步步入,直到发生很大的跳转后,这个地址就是OEP的地址。这个时候,我们利用OD内置的插件,脱壳调试进程,然后修改入口点地址。具体如图所示。最后,我们选择脱壳。一个完整的ESP定律演示完毕。可是当我们运行程序的时候,发生了错误。这说明,我们没有脱壳成功。
虽然没有脱壳成功,但是我们知道了OEP的确切地址,在14E0处。我们来用lordPE来纠正一下镜像。具体的步骤,如下图的8,9所示。最后我们选择完全脱壳,将程序另存为。其实这个步骤,意义不大。使用ImportREC导入程序,发现,这个地方,有三个数据需要填,分别是OEP,RVA,还有大小。我们先把OEP填上。接下来,需要我们来确定RVA的值。
再次返回到OD中来,在确定的OEP地址处,如果这个时候有乱码,可以如下图所示,分析>删除分析,将代码回归正常。单步向下,找到最近的一个CALL,然后enter进去,就看到了大量的jmp。这个时候,右键,选择数据窗口跟随,内存地址。为什么要这样做,大家可以回忆一下PE文件结构。到内存窗口中,改变字段的显示形式。我们就可以看到正常的地址了。然后就是进入内存地址界面,找到PE文件头部,记下这个地址,这就是基地址。然后用函数段首地址,减去这个基地址,得到16E114。现在我们将这个地址也填入IAT里面,大小选择默认的00001000。点击获取导入表。因为这个时候还有一些无效的指针,所以可以显示无效指针,并删除他们。最后选择修正转储,即可。最后,我们检验一下。成功!!!!!
总结:要学习壳,最关键的,还是对PE文件格式的理解,不然自己很难深入的理解,为什么会这样做。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课