##脱壳之后为什么要修复导入表
PE加载器的原理就是根据INT表的函数名字换成函数地址 当PE文件被壳压缩或加密之后 会破坏原本的导入表 所以脱壳之后要把导入名称表的函数名填回去 这样程序才能正常运行
介绍下自己写的壳的执行流程
- 获取必要的API函数地址
- 解密代码段
- 恢复数据目录表
- 修复重定位
- 修复IAT
- 增加反调试
- 加密IAT
- 调用TLS回调函数
手工加壳步骤
- 修改文件头的NumberOfSections
- 设置区段名(可选)
- 设置 区段数据的实际字节数Misc.VirtualSize(可以和SizeOfRawData一样)
- 设置区段的VirtualAddress(区段数据在内存中的RVA, 必选)
- 设置 区段的PointerToRawData(区段数据在文件中的偏移,必选)
- 设置区段以文件对齐粒度对齐后的大小SizeOfRawData(必选)
- 设置区段属性
- 插入区段数据
- 修改扩展头中的映像大小
脱壳流程
- 判断壳的类型
- 寻找程序入口点(OEP)
- A. 根据跨段指令寻找 IDA Pro中有静态的跨段指令的视图(Segment),这里是动态的,基本的办法是单步跟踪。
- B.设置内存断点 在代码段释放完毕后,在代码段首部设置内存断点,中断后就是OEP
- C.根据堆栈平衡原理
- D.根据编译语言的特点(常见的初始化函数)找OEP
- Dump 内存
- 修复 PE 文件头和输入表 IAT