UPack压缩的PE文件头解析及调试
字数 1772 2025-08-26 22:11:51

UPack压缩PE文件头解析与调试技术详解

一、UPack压缩器概述

UPack(Ultimate Pack)是一种运行时压缩器,具有以下核心特性:

  1. 运行时压缩特性

    • 与7z/WinRAR等普通压缩器的区别在于压缩后的PE文件可直接执行
    • 程序进入内存时由内置解压代码实时解压后执行
  2. 反分析特性

    • 导致多数PE装载器和模板浏览器无法正确解析结构
    • 历史上广泛用于病毒/木马压缩以绕过杀毒软件检测
    • 现代杀毒软件已能识别UPack压缩特征
  3. 调试环境准备

    • 需在杀毒软件中设置信任或临时关闭
    • 示例使用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(第三节区)

2. 解压过程设计

  1. 压缩代码存储:

    • 全部存放在第二节区(Size=0xAE28)
  2. 内存分配:

    • 第一节区(VirtualSize=0x14000)存储解压后代码
    • 第二节区(VirtualSize=0x12000)存储压缩代码
  3. 执行流程:

    • 解压代码将第二节区数据解压到第一节区
    • 执行第一节区中的解压后代码

四、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)
  • FirstThunk RVA=0x11E8
  • 使用节区边界替代NULL结构体终止:
    • 第一节区结束于0x200
    • 导入表在0x200处被强制截断

2. IAT与INT区别

  • 磁盘中:IAT与INT结构相同
  • 内存中:
    • IAT被加载器修改为实际函数地址
    • INT保持原始RVA数据不变

六、动态调试分析

1. 解码过程

  1. 数据拷贝:

    ; 将RVA:10270F0(RAW:F0)的0x27字节拷贝到RVA:101FE28(RAW:B028)
    rep movs
    
  2. 解码循环:

    • 多次调用解码函数(0x101FCCB)
    • 采用特定算法解压数据到目标节区

2. IAT修复过程

  1. 关键调用:

    call ecx  ; 调用LoadLibrary/GetProcAddress
    call ebp  ; 填充IAT
    
  2. 修复循环:

    • 通过lods指令遍历函数名
    • 动态获取并填充导入函数地址

3. OEP定位

  • 最终通过RETN指令跳转到原始入口:
    OEP = 0x100739D
    

七、分析工具推荐

  1. 十六进制编辑器:010Editor(需注意PE模板可能失效)
  2. PE解析工具:Stud_PE
  3. 调试工具:OllyDbg(注意版本兼容性问题)

八、技术总结

UPack通过以下关键技术实现PE压缩和反分析:

  1. 结构重叠:最大化利用PE头未用空间
  2. 节区重叠:优化内存使用并隐藏原始代码
  3. 动态解码:运行时实时解压执行
  4. IAT混淆:延迟解析导入函数增加分析难度

理解这些技术对恶意代码分析和软件保护研究具有重要意义。

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头未用区域 结构体位置计算 : 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(第三节区) 2. 解压过程设计 压缩代码存储: 全部存放在第二节区(Size=0xAE28) 内存分配: 第一节区(VirtualSize=0x14000)存储解压后代码 第二节区(VirtualSize=0x12000)存储压缩代码 执行流程: 解压代码将第二节区数据解压到第一节区 执行第一节区中的解压后代码 四、RVA-RAW转换异常处理 1. 常规转换公式 2. UPack的特殊处理 PointerToRawData =0x10不符合 FileAlignment (0x200)整数倍 正确计算方法: 调整 PointerToRawData 为0 修正公式: 3. 入口点定位 修正计算得到的EP位置:0x18 OD中可见解码指令: 五、导入表特殊构造 1. 导入描述符特征 Name 字段RVA异常小(0x2) FirstThunk RVA=0x11E8 使用节区边界替代NULL结构体终止: 第一节区结束于0x200 导入表在0x200处被强制截断 2. IAT与INT区别 磁盘中:IAT与INT结构相同 内存中: IAT被加载器修改为实际函数地址 INT保持原始RVA数据不变 六、动态调试分析 1. 解码过程 数据拷贝: 解码循环: 多次调用解码函数(0x101FCCB) 采用特定算法解压数据到目标节区 2. IAT修复过程 关键调用: 修复循环: 通过 lods 指令遍历函数名 动态获取并填充导入函数地址 3. OEP定位 最终通过 RETN 指令跳转到原始入口: 七、分析工具推荐 十六进制编辑器:010Editor(需注意PE模板可能失效) PE解析工具:Stud_ PE 调试工具:OllyDbg(注意版本兼容性问题) 八、技术总结 UPack通过以下关键技术实现PE压缩和反分析: 结构重叠 :最大化利用PE头未用空间 节区重叠 :优化内存使用并隐藏原始代码 动态解码 :运行时实时解压执行 IAT混淆 :延迟解析导入函数增加分析难度 理解这些技术对恶意代码分析和软件保护研究具有重要意义。