使用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 初步分析
- 使用查壳工具确认VMP版本
- 通过沙箱分析确定关键API调用点(如MoveFileEx)
3.2 动态调试
- 运行样本到OEP(原始入口点)
- 选择关键API(MoveFileExW)设置硬件断点
- 硬件断点优于软件断点,不影响壳执行流程
- 中断后观察调用栈,识别VMP保护特征
- VMP 3.x保护的导入函数特征:
call xxxxx int3
- VMP 3.x保护的导入函数特征:
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过程
VMPDump.exe 8852 "" -disable-reloc
注意事项:
- 进程名不能过长,否则会失败
- 使用
-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样本,为后续深入分析奠定基础。