手动脱壳之PECompact

来源:互联网 发布:铝合金窗 知乎 编辑:程序博客网 时间:2024/06/10 16:06

手动脱壳之PECompact

  这个星期开始学脱壳,就从简单的压缩壳开始吧。

0x0 前期准备

  自己先瞎写了一个控制台程序:
    这里写图片描述

  然后用下面的工具加壳:
这里写图片描述

  加完壳之后用EXEInfoPE和PEiD分别查壳:
这里写图片描述

这里写图片描述
  加壳成功了。

0x1 找到OEP

  (方便起见,我先将aslr给关了)
  用OD打开,发现起始点是0x411055,然后F8跟进了几步,到0x41106B程序就跑起来了?没有什么pushad和popad,也没有任何jmp,奇怪:
这里写图片描述

  ALT+M看一下内存窗口,没有.data和.rdata,但是有.rsrc,可以用二次断点法找OEP:
这里写图片描述

  F9之后,来到了0x41FAC0:
这里写图片描述

  这里如果直接在.text下断点然后F9的话还是会跳到0x41FAC0附近,所以干脆在retn的时候再在.text下断点,然后F9就会跳到:
这里写图片描述

  然后再跳到0x41FAE3,这时往下翻一翻,很快就找到一个很大的跳跃:
这里写图片描述
  可见这个就是OEP了。

0x2 DUMP

  我直接用OD的插件OllyDump将程序Dump出来了,这里注意要先跟到jmp eax的下一步再dump,不然的话程序一开始执行了jmp eax,而eax一开始的值很明显不是我们想要的值:

这里写图片描述
在这里dump。

0x3 修复IAT

  用PEiD看了一下,没毛病:
这里写图片描述

  以为能美滋滋地跑起来,结果程序出错了:
这里写图片描述

  对,忘了修复IAT。紧接着刚才的OEP点,这时打开ImportREC,选中在OD里跑着的进程,点了一下AutoSearch,然后Get Imports,找到了有效的1输入表:
这里写图片描述

  然后Fix Dump,接着运行起来:
这里写图片描述

  咦,还是出错呢?还是得在OD里定位到真正的输入表的位置。这里我刚学,不知道有什么好方法,我就在这个Use2DumpCh_.exe里找一下哪里出错:
这里写图片描述

  发现第一个出错的地方在这里,里面跟进去是几个跳转,最后跳到了一个空地址。那么就是因为ImportREC在找输入表的RVA时没找对。
  现在重新dump一次,在到达OEP时,根据上图搜索0x4110A0处的指令:
这里写图片描述

  再搜索0x414BA4处的指令:
这里写图片描述

  这就是IAT的真实地址了,在数据窗口查找0x41B0AC,然后往上翻到没有发现函数为止,这里是0x41B000:
这里写图片描述

  在ImportREC里的RVA框填上1B000,然后Get Imports,可以看到有一些yes,有一些no,先不管,fix dump之后:
这里写图片描述

  可以成功运行了。

0x4 总结

  1.找到OEP的方式有很多,压缩壳相对比较容易找到;
  2.不要过分相信ImportREC的AutoSearch,我就是这里被坑了;
  3.至于上面的一些no的IAT,我推测是IAT与IAT之间有空隙,但是我直接从第一个IAT的RVA开始Get Imports,没有将这些IAT分开Get Imports;
  4.ImportREC要以管理员身份运行,不然就只能看到少部分进程在运行;
  5.请大神指导。

原创粉丝点击