一、PE 解析器是干什么的?
PE解析器就是手动解析PE文件结构的工具/代码,用于:
- 读取 DOS 头、NT 头、区段表、IAT/EAT、重定位表
- 获取入口点、基址、内存偏移、文件偏移转换
- 分析导入表、导出表、节属性
- 为加壳、脱壳、Patch、逆向做基础支撑
核心能力:RVA ↔ FOA 转换(逆向必备)
二、加壳器的核心作用
- 压缩/加密程序代码与数据
- 隐藏原始代码、防止直接逆向
- 反调试、防Dump、防内存抓取
- 保护入口点、IAT、资源
三、加壳的4个关键步骤(必背)
1. 保存原始入口点(OEP)
- 读取原程序
AddressOfEntryPoint - 加密保存到壳的区段或全局变量
- 程序执行完壳后跳回OEP才真正跑原代码
2. 区段加密
- 遍历
.text/.data等敏感区段 - 用 AES / XOR / RC4 等加密区段数据
- 修改区段属性为可写,方便运行时解密
- 加壳后直接看内存是乱码
3. 基址重定位修复
- 若镜像基址被占用,Windows会自动重定位
- 壳必须在解密后、跳回OEP前修复重定位表
- 否则程序直接崩溃
4. 构建壳入口 & 写入新EP
- 添加新的壳区段(如
.pack/.sac) - 写入壳代码(初始化→解密→修复重定位→跳OEP)
- 将NT头的EP改为壳入口地址
四、手动脱壳的核心思路(面试高频)
手动脱壳就是一句话:
找到 OEP → Dump内存 → 修复IAT → 修复重定位 → 保存正常PE
1. 找 OEP(最关键)
- 单步跟踪壳代码,找
jmp/call跳向原始程序 - 观察内存解密完成、重定位修复完成的时机
- 利用 ESP 定律、内存访问断点快速定位
- 看区段属性变化:代码从不可执行 → 可执行
2. 内存Dump
- 在 OEP 位置把整个进程内存Dump出来
- 此时代码已解密、区段正常
3. 修复 IAT
- 壳通常会加密/混淆IAT
- 用 Import Recoder 等工具重建导入表
- 修复无效函数指针
4. 修复重定位 & 保存
- 修复重定位表,保证在任意基址都能运行
- 保存为可直接运行的无壳PE
五、总结
加壳就是保存OEP → 加密区段 → 修复重定位 → 替换EP;脱壳就是找OEP → Dump内存 → 修复IAT → 修复重定位。