0x15 加壳与脱壳
1. 脱壳技巧 1 2 3 4 6
脱壳的基本步骤
- 找OEP -> [还原IAT] -> dump文件 -> 修复IAT
- 通过在 OEP 位置查找 FF15 和 FF25 可以找到 IAT 设置硬件写入断点,重新运行程序
- 找OEP -> [还原IAT] -> dump文件 -> 修复IAT
具体的步骤见课上笔记
- aspck: 抹除重定位
- FSG: IAT表中间有 FFFF
2. 加壳原理
什么是加壳
- 利用特殊的算法,对可执行文件里的资源数据或代码进行压缩加密。添加对应的Stub代码段
- 用于对加密后的文件解密,以及充当PE加载器的角色,对目标程序执行修复重定位、修复(加密)IAT等操作。
- 常见的手段有:伪装OEP特征,反反汇编,IAT加密,函数偷取(通常偷取OEP),代码虚拟化等
手动添加区段的步骤
- 区段头表中添加区段信息
- 文件头表中添加区段个数
- 修改扩展头中镜像大小
- 修改OEP为新的区段RVA
- 填充文件,主要是跳转原OEP的代码
添加新区段
- 新区段的文件偏移计算方式: 原文件大小(需要经过文件对齐粒度对齐)
- 新区段rva计算方式 : 上一个区段的rva + 上一个区段的大小(内存粒度对齐后的大小)
- 新区段的文件属性 : 可读可写可执行
- 扩展头映像大小的设置 : 新区段的rva + 新区段的大小(不对齐, 文件粒度对齐, 内存粒度对齐的大小均可)
移植区段修复重定位
- 重定位项 = 重定位项 - stub.dll加载基址 + 被加壳程序默认加载基址 - stub.dll代码段rva + 被加壳程序新区段rva
修复IAT
- 遍历INT , 通过GetProcAddress获取函数地址并填写到IAT