使用vmpdump对未完全保护的vmp样本进行处理——以Night Sky为例
字数 1459 2025-08-20 18:17:07

使用vmpdump处理未完全保护的VMP样本——以Night Sky勒索软件为例

1. 前言

本文详细讲解如何使用vmpdump工具对仅部分保护的VMP 3.x壳样本进行处理,以Night Sky勒索软件为例。该方法适用于VMP 3.x版本中仅对IAT进行虚拟化保护的样本。

2. 准备工作

2.1 工具准备

  • vmpdump工具
  • IDA Pro反汇编工具
  • 调试器(x64dbg等)
  • Joe Sandbox或其他沙箱分析工具
  • Visual Studio(用于生成对比样本)

2.2 样本分析

  • 确认样本使用VMP 3.x壳(疑似3.5版本)
  • 确认仅对IAT进行了虚拟化保护

3. 分析流程

3.1 初步分析

  1. 使用查壳工具确认VMP版本
  2. 通过沙箱分析确定关键API调用点(如MoveFileEx)

3.2 动态调试

  1. 运行样本到OEP(原始入口点)
  2. 选择关键API(MoveFileExW)设置硬件断点
    • 硬件断点优于软件断点,不影响壳执行流程
  3. 中断后观察调用栈,识别VMP保护特征
    • VMP 3.x保护的导入函数特征:call xxxxx int3

3.3 识别OEP特征

  1. 使用VS编译一个64位Hello World程序作为对比
  2. 在IDA中观察VS编译器的入口特征:
    • 安全cookie的hash值(恒定不变)
    • __scrt_common_main_seh函数特征

3.4 定位OEP

  1. 在中断内存中搜索VS安全cookie特征值
    • 右键内存窗口 → 特征搜索
    • 通常只有一处匹配
  2. 在安全cookie函数入口设置硬件断点
  3. 重新运行程序,中断在函数序言
  4. 通过调用栈跟踪到调用地址

4. 使用vmpdump进行dump

4.1 dump过程

VMPDump.exe 8852 "" -disable-reloc

注意事项:

  • 进程名不能过长,否则会失败
  • 使用-disable-reloc参数禁用重定位

4.2 dump后处理

  1. 将dump程序载入IDA

  2. 手动搜索特征修复:

    • 搜索安全cookie的hash值
    • 定位到.text代码节
    • 重命名函数为初始化cookie
  3. 搜索__scrt_common_main_seh函数特征

    • 由于无常量,需使用部分字节码作为特征
  4. 继续向下定位main函数

5. 手动修复OEP

5.1 修改入口点

  1. 对比正常VS编译程序修改入口点代码

  2. 计算跳转的相对偏移:

    • call指令下一条指令地址 - 安全cookie初始化函数地址
    • VMP壳代码节在.text下方,相对跳转取负值
    • 计算结果需加1字节
  3. 修改相对跳转值

5.2 修复main_seh

  1. 同理修复__scrt_common_main_seh函数
  2. 最后patch程序

6. 验证结果

重新调试样本,确认:

  • 脱壳后的main函数可正常分析
  • 导入表已修复
  • 关键功能可正常跟踪

7. 技术要点总结

  1. VMP 3.x部分保护样本特征:

    • 仅IAT虚拟化
    • 代码段解密后加载到.text
  2. 关键定位技巧:

    • 使用VS编译器特征(安全cookie)
    • 硬件断点优于软件断点
    • 动态分析结合静态特征
  3. 修复要点:

    • 正确计算跳转偏移
    • 注意VMP壳代码节位置
    • 逐步验证每个修复步骤

8. 注意事项

  1. 该方法不适用于完全保护的VMP样本
  2. 不同编译器版本可能有不同特征
  3. 修复过程需耐心验证每个步骤
  4. 建议在隔离环境中操作恶意样本

9. 扩展应用

该方法可应用于:

  • 其他仅部分保护的VMP样本
  • 分析勒索软件、银行木马等恶意软件
  • 研究VMP保护机制的弱点

通过本文介绍的方法,安全研究人员可以有效地处理仅部分保护的VMP样本,为后续深入分析奠定基础。

使用vmpdump处理未完全保护的VMP样本——以Night Sky勒索软件为例 1. 前言 本文详细讲解如何使用vmpdump工具对仅部分保护的VMP 3.x壳样本进行处理,以Night Sky勒索软件为例。该方法适用于VMP 3.x版本中仅对IAT进行虚拟化保护的样本。 2. 准备工作 2.1 工具准备 vmpdump工具 IDA Pro反汇编工具 调试器(x64dbg等) Joe Sandbox或其他沙箱分析工具 Visual Studio(用于生成对比样本) 2.2 样本分析 确认样本使用VMP 3.x壳(疑似3.5版本) 确认仅对IAT进行了虚拟化保护 3. 分析流程 3.1 初步分析 使用查壳工具确认VMP版本 通过沙箱分析确定关键API调用点(如MoveFileEx) 3.2 动态调试 运行样本到OEP(原始入口点) 选择关键API(MoveFileExW)设置硬件断点 硬件断点优于软件断点,不影响壳执行流程 中断后观察调用栈,识别VMP保护特征 VMP 3.x保护的导入函数特征: call xxxxx int3 3.3 识别OEP特征 使用VS编译一个64位Hello World程序作为对比 在IDA中观察VS编译器的入口特征: 安全cookie的hash值(恒定不变) __scrt_common_main_seh 函数特征 3.4 定位OEP 在中断内存中搜索VS安全cookie特征值 右键内存窗口 → 特征搜索 通常只有一处匹配 在安全cookie函数入口设置硬件断点 重新运行程序,中断在函数序言 通过调用栈跟踪到调用地址 4. 使用vmpdump进行dump 4.1 dump过程 注意事项: 进程名不能过长,否则会失败 使用 -disable-reloc 参数禁用重定位 4.2 dump后处理 将dump程序载入IDA 手动搜索特征修复: 搜索安全cookie的hash值 定位到 .text 代码节 重命名函数为初始化cookie 搜索 __scrt_common_main_seh 函数特征 由于无常量,需使用部分字节码作为特征 继续向下定位main函数 5. 手动修复OEP 5.1 修改入口点 对比正常VS编译程序修改入口点代码 计算跳转的相对偏移: call指令下一条指令地址 - 安全cookie初始化函数地址 VMP壳代码节在 .text 下方,相对跳转取负值 计算结果需加1字节 修改相对跳转值 5.2 修复main_ seh 同理修复 __scrt_common_main_seh 函数 最后patch程序 6. 验证结果 重新调试样本,确认: 脱壳后的main函数可正常分析 导入表已修复 关键功能可正常跟踪 7. 技术要点总结 VMP 3.x部分保护样本特征: 仅IAT虚拟化 代码段解密后加载到 .text 节 关键定位技巧: 使用VS编译器特征(安全cookie) 硬件断点优于软件断点 动态分析结合静态特征 修复要点: 正确计算跳转偏移 注意VMP壳代码节位置 逐步验证每个修复步骤 8. 注意事项 该方法不适用于完全保护的VMP样本 不同编译器版本可能有不同特征 修复过程需耐心验证每个步骤 建议在隔离环境中操作恶意样本 9. 扩展应用 该方法可应用于: 其他仅部分保护的VMP样本 分析勒索软件、银行木马等恶意软件 研究VMP保护机制的弱点 通过本文介绍的方法,安全研究人员可以有效地处理仅部分保护的VMP样本,为后续深入分析奠定基础。