aspack dll脱壳技巧,参见
这里里面输入表(IAT)是通过函数调用查找的,也是一种不错的方法,我这里再介绍一种自己的方法。
aspack 是压缩壳,压缩壳一般主要目的在于压缩,壳在代码还原后,一般都会还原输入表;那么我们按照PE结构中的区块中去查看下输入表的区块,然后在OD中,从dll的这块内存中找,应该就可以找到输入表。
下面详细介绍一下步骤了。
1、用OD载入要脱壳的autoupdate.dll, 然后按照那篇帖子说的,找到重定位表处理模块,断点找重定位表。如下图,重定位表的rva:002E8000。
然后,在00C11243处下断点,同时将00C1128处,破坏重定位表的指令,用NOP填充,如下图。
然后F9运行到断点00C11243处,这里的ESI里面(00B85CBC)就是重定位表的结束地址。
到这里,查看模块的基址为00870000,可以计算重定位表的大小为:
00B85CBC - 00870000 -
002E8000 = 2DCBC
2、用那篇文章的方法,运行到真正的OEP(00B397C8 )后,用LordPE dump出脱壳后的dumped.dll.
OEP 的rva为:
00B397C8-00870000=2C97C8
3. 本文的重头戏,输入表的寻找与恢复。
用PeID查看autoupadte的输入表的rva和大小。如下图
回到OD中,拿模块的基址(00870000)加上输入表的rva就是输入表所在区块的地址(00B53000)
在OD的数据窗口中,Ctrl+G 然后输入00B53000 查看输入表区块内存。
这里没有看到什么函数,都是模块内的函数,我们继续向下滚动,碰碰运气看,反正我们又1000h大小的内存要看呢。
(来啊,反正有大把时光呐。。。。)
看到了没,希望来了,00B53230 7C9313B1 ntdll.RtlDeleteCriticalSection
一直向下滚动,知道没有类似的函数出现为止:
到这里,我们可以知道输入表的结束地址为:00B53CA0
那么输入表的rva :
00B53230-00870000=2E3230 大小:
00B53CA0-00B53230=A70
此时,要打开ImportRec(去掉使用磁盘PE头的选项)来重建dumped.dll的输入表。
填入IAT的信息后,点击获取输入表按钮,然后再修复dumped.dll的输入表和OEP。得到dumped_.dll。
此时,用peid查看,深度扫描下,可以看到,已经脱壳成功,为Delphi开发的dll。
4. 最后一步,修复基址与重定位表。
用LordPe的pe编辑器打开,dumped_.dll。
修复基址为:00870000
修复重定位表。
修复好后,保存,脱壳成功。加载dll可以成功加载。
这里对于寻找输入表,是基于有些PE文件可以直接从区块的名字(如.idata)区分出来输入表, 而达到快速寻找输入表位置的。对于一些区块名字不按套路出牌的PE文件,此法不太适用。
文中提及的文件,也一并传上来,供大家研究交流学习下。
文中若有谬误,还望大家批评指正。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界