UPack压缩的PE文件头解析及调试
字数 1772 2025-08-26 22:11:51
UPack压缩PE文件头解析与调试技术详解
一、UPack压缩器概述
UPack(Ultimate Pack)是一种运行时压缩器,具有以下核心特性:
-
运行时压缩特性:
- 与7z/WinRAR等普通压缩器的区别在于压缩后的PE文件可直接执行
- 程序进入内存时由内置解压代码实时解压后执行
-
反分析特性:
- 导致多数PE装载器和模板浏览器无法正确解析结构
- 历史上广泛用于病毒/木马压缩以绕过杀毒软件检测
- 现代杀毒软件已能识别UPack压缩特征
-
调试环境准备:
- 需在杀毒软件中设置信任或临时关闭
- 示例使用Windows XP的notepad.exe进行分析
二、变形PE文件头结构分析
1. 基本观察现象
- 010Editor等工具无法正常解析压缩后的PE结构
- Stud_PE可初步解析出变形头特征:
- 可选头大小异常(0x148)
- 节区数量异常(0xA)
2. 关键结构重叠技术
DOS头与NT头重叠:
_IMAGE_DOS_HEADER中仅关键字段有效:e_magic:固定"MZ"(4D 5A)e_lfanew:设置为0x10,使NT头嵌入DOS头未用区域
结构体位置计算:
NT头位置 = DOS头起始 + e_lfanew
3. 可选头大小异常分析
_IMAGE_FILE_HEADER.SizeOfOptionalHeader非常规值(0x148)- 常规PE中:
- 32位:0xE0
- 64位:0xF0
- 额外空间用于存放解码代码:
- 节区头起始位置 = 0x28 + 0x148 = 0x170
- 解码代码区域:0xD7 ~ 0x170
4. 数据目录数量修改
NumberOfRvaAndSizes设置为0xA(常规为0x10)- 被省略的6个数据目录空间用于存储解码代码
- 影响的数据目录包括:
- LOAD_CONFIG
- BOUND_IMPORT
- IAT
- DELAY_IMPORT
- COM_DESCRIPTOR
三、节区重叠技术详解
1. 节区头异常特征
- 显示3个节区(实际有效2个)
- 第一节区与第三节区Raw Address和Raw Size相同
- 内存映射关系:
- 文件0x10~0x1FF映射到:
- 内存0x1000(第一节区)
- 内存0x27000(第三节区)
- 文件0x10~0x1FF映射到:
2. 解压过程设计
-
压缩代码存储:
- 全部存放在第二节区(Size=0xAE28)
-
内存分配:
- 第一节区(VirtualSize=0x14000)存储解压后代码
- 第二节区(VirtualSize=0x12000)存储压缩代码
-
执行流程:
- 解压代码将第二节区数据解压到第一节区
- 执行第一节区中的解压后代码
四、RVA-RAW转换异常处理
1. 常规转换公式
RAW = RVA - VirtualAddress + PointerToRawData
2. UPack的特殊处理
PointerToRawData=0x10不符合FileAlignment(0x200)整数倍- 正确计算方法:
- 调整
PointerToRawData为0 - 修正公式:
RAW = RVA(0x1018) - VirtualAddress(0x1000) + 0 = 0x18
- 调整
3. 入口点定位
- 修正计算得到的EP位置:0x18
- OD中可见解码指令:
rep movs stos
五、导入表特殊构造
1. 导入描述符特征
Name字段RVA异常小(0x2)FirstThunkRVA=0x11E8- 使用节区边界替代NULL结构体终止:
- 第一节区结束于0x200
- 导入表在0x200处被强制截断
2. IAT与INT区别
- 磁盘中:IAT与INT结构相同
- 内存中:
- IAT被加载器修改为实际函数地址
- INT保持原始RVA数据不变
六、动态调试分析
1. 解码过程
-
数据拷贝:
; 将RVA:10270F0(RAW:F0)的0x27字节拷贝到RVA:101FE28(RAW:B028) rep movs -
解码循环:
- 多次调用解码函数(0x101FCCB)
- 采用特定算法解压数据到目标节区
2. IAT修复过程
-
关键调用:
call ecx ; 调用LoadLibrary/GetProcAddress call ebp ; 填充IAT -
修复循环:
- 通过
lods指令遍历函数名 - 动态获取并填充导入函数地址
- 通过
3. OEP定位
- 最终通过
RETN指令跳转到原始入口:OEP = 0x100739D
七、分析工具推荐
- 十六进制编辑器:010Editor(需注意PE模板可能失效)
- PE解析工具:Stud_PE
- 调试工具:OllyDbg(注意版本兼容性问题)
八、技术总结
UPack通过以下关键技术实现PE压缩和反分析:
- 结构重叠:最大化利用PE头未用空间
- 节区重叠:优化内存使用并隐藏原始代码
- 动态解码:运行时实时解压执行
- IAT混淆:延迟解析导入函数增加分析难度
理解这些技术对恶意代码分析和软件保护研究具有重要意义。