壳的分类:
1. 压缩壳:减小PE体积
2. 加密壳:对抗逆向分析
压缩壳加上对抗手段,如反调试、代码膨胀、代码混淆、IAT混淆等,就成了加密壳。
壳需要有一段代码,把原PE代码解压出来,但是解压过程中有可能覆盖了解压代码,解决方法:
使用无文件映射的节,类似于汇编中的.data?段。壳把解压后的数据放到.data?段中,这样磁盘上不占用对应的空间。
那么.data?段大小应该多大才够用呢?原PE程序的SizeOfImage-SizeOfHeaders就够用了。
一般来说如果PE被压缩了,都会有一个比较大的无文件映射的节,往往比其他节都要大。
如果文件中相同的数据越多,压缩后能达到的压缩率就越高。
脱壳步骤:
1. 查壳:PEID,exeinfo,查完后可以搜索相关信息
2. 调试运行,停在OEP处。
2.1 OEP识别:
靠经验,可以安装多个开发环境,编译出程序观察入口特征。也可以通过程序外观猜测 是那种IDE编译的。
2.2 OEP定位:
ESP定律
API断点:搜索入口点会调用的函数,例如VC6的GetVersion
另外长跳也很可疑,例如从一个节跳到另一个节,基本是jmp OEP的操作
如果都找不到,就单步跟踪,跳过循环,一般只向下跳转,因为向上是循环。如果有对抗,跑飞的地方一般都有反调试,该nop就nop。
1. Dump
2. 修复导入表等,有些dump工具dump出的程序,需要关闭随机基址才能运行
原文:https://www.cnblogs.com/Nutshelln/p/14096626.html