赞
踩
1.脱壳老规矩,第一步,查壳,可以看到该壳是NsPack(3.x)的壳。(这里给个忠告,脱壳前一定要清楚是什么壳,今天对这个脱壳的时候就闹了个笑话,最开始只知道有壳,也没仔细去看什么壳,结果修复导入表的时候,按照常规方法脱,程序打开失败了,其实前面也写过一个nspack的壳脱壳,当时要是注意到这是nspack的壳,可能会少走一部分弯路)
2.第二步,用od打开程序,可以发现没有什么明显的pushad之类的壳起始标志,不能用esp法开始操作了。此时别急,先f8跟下去
3.遇到一个jmp,继续f8,一堆的push,下面跟了个call,其实就是call的自己下一行代码,没什么意义。下面跟了个call eax,此时要注意以下,根据经验,这很有可能是执行壳的代码开始了,因为前面的那些代码,都没有明显的类似初始化壳代码的操作。
4.f4运行到call eax ,然后f7进去看一下,可以发现pushfd和pushad,这很明显的是开始壳代码了,f8两步,到下一个call的位置,对esp下硬件断点。
5.f9执行到硬件断点,可以看到popfd,壳代码已经执行完毕了,下面跟的jmp是个大跳转,那oep几乎没跑了。
6.f7跟进去,发现此处全是显示的灰色数据,右键——分析——从模块中删除分析,就可以看到代码了,此实我们已经在oep了,可以按照常规方式开始脱壳。右键——使用脱壳调试进程,然后随便取个名字,按图3所示,dump。
7.dump好了以后,需要修复导入表,此时不要关闭od,打开import Recnstructor,附加到od正在调试的进程,将上一步复制的值粘贴到oep,然后IAT自动搜索。
8.IAT自动搜索后,按照正常程序来说,直接修正转储就可以了,但是由于这是nspack的壳,在IAT里面有特殊处理,rva和大小有可能有问题。
9.这时,我们将rva记住,回到od,在左下角那个框ctr+G,输入400000+rva的值(这里即499234),回车
10.可以看到,从地址499238才开始有导入表,且向下拉,会发现很多的导入表和0000的值来干扰(遇到0000会认为导入表已经结束),且下面有很长一段地址的值都是一堆0000,然后再来几个导入表,我们无法准确的确定导入表到底有多长。
11.既然无法确定导入表有多长,其实可以通过一个范围来修复。回到import Recnstructor,将rva改成99238,将大小改为5000(也可以是其他数值,只要你觉得能把导入表修复完,怎么确定这个值呢,我一般会在输入大小后带点击一下获取导入表,然后显示无效的,只要有无效的,基本上就没什么问题了)。
12.填好大小以后,获取导入表,显示无效的,点中无效的,右键,剪切。
13.点击修正转储,选中从od中dump出来的那个文件,双击就ok了。
13.点击修正后的,能正常运行,查壳,壳没了。
14总结:
今天就在改地址那里翻了车,因为没考虑到这是一个nspack的壳,需要修改地址。
直接修正出来的exe跑不起来。其实前面已经有写过一个nspack的壳了,没有长记性。
在此写这个总结,踩踩坑,希望偶然读到这篇文章的萌新们能少走弯路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。