GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

应用安全 --- vmp加固 之 VMProtect 1.xx - 2.xx Ultra Unpacker v1.0

VMProtect 1.xx - 2.xx Ultra Unpacker v1.0

1.过反调试。vmp会检测是否在调试,如果是就闪退或者提示框。

2.查找OEP。通过入口特征法定位到OEP的程序真实入口。

3.修复VMCall和IAT。

4.dump内存

4.修复IT。

 

 

 

 

 

 

 

 

您提供的步骤是手动脱壳 VMProtect 的标准流程。让我为您详细补充和完善这个流程,特别是针对 VMProtect 1.70 + Delphi 的目标:

🔍 完整手动脱壳流程

1. 查找 OEP(原始入口点)

入口特征法 - Delphi 程序特征

asm
; Delphi 程序的典型 OEP 特征
push ebp
mov ebp, esp
add esp, -0C            ; 栈调整
mov eax, [xxxxxxxx]     ; 模块句柄
push ebx
push esi
push edi
mov [ebp-04], eax
mov eax, [eax]          ; 系统初始化

具体查找方法

方法一:API 断点法

bash
# 在以下 API 设置断点:
- GetModuleHandleA/W
- GetVersion
- GetCommandLineA/W
- GetStartupInfoA/W

方法二:内存访问断点

asm
; 在代码段设置内存访问断点
bpm 401000, r  ; 代码段地址

方法三:栈平衡观察

asm
; 观察栈指针变化,寻找返回主模块的时刻

2. 修复 VMCall 和 IAT

VMCall 识别和修复

asm
; VMProtect 的典型调用模式
call xxxxxxxx           ; 调用 VM 入口
; 后面通常跟有混淆代码

; 修复方法:
; 1. 跟踪 call 的目标地址
; 2. 分析 VM 处理函数
; 3. 替换为原始 API 调用

IAT 修复步骤

步骤 1:识别 VM IAT 节区

bash
# VMProtect 通常创建的节区:
.vmp0, .vmp1, .vmp2

步骤 2:找到 API 重定向地址

asm
; 在代码中查找类似模式:
mov eax, [xxxxxxxx]     ; VM IAT 地址
call eax
; 或
jmp [xxxxxxxx]          ; VM IAT 地址

步骤 3:重建原始 IAT

bash
# 使用工具:
- ImportREC
- Scylla
- 手动构建导入表

3. Dump 内存

选择合适的 Dump 时机

bash
# 最佳时机:
1. 到达 OEP 后立即 dump
2. 所有 VM 代码已解密
3. IAT 修复完成前

Dump 工具选择

bash
# 推荐工具:
- OllyDump (OllyDbg 插件)
- Scylla (内置 dump 功能)
- LordPE
- Process Dump

Dump 参数设置

ini
# 重要设置:
- 保留原始 ImageBase
- 修正 PE 头
- 保留所有节区
- 不重建导入表(稍后手动修复)

4. 修复 IT(导入表)

使用 ImportREC 或 Scylla

步骤 1:获取 OEP 和镜像基址

bash
OEP: [找到的 OEP RVA]
ImageBase: [通常是 00400000]

步骤 2:自动查找 IAT

bash
# 在 ImportREC/Scylla 中:
1. 选择目标进程
2. 输入 OEP RVA
3. 点击 "IAT AutoSearch"
4. 点击 "Get Imports"

步骤 3:修复无效指针

bash
# 如果发现无效指针:
1. 手动跟踪调用链
2. 找到正确的 API 地址
3. 删除无效指针
4. 重新获取导入

步骤 4:转储修复后的文件

bash
# 最终步骤:
1. 修复转储文件
2. 选择刚才 dump 的文件
3. 保存修复后的可执行文件

🛠️ 针对 VMProtect 1.70 的特殊处理

VMCall 修复技巧

asm
; VMProtect 1.70 的调用特征可能包括:
; 模式 1:直接调用
call 00xxxxxx

; 模式 2:寄存器间接调用
mov eax, 00xxxxxx
call eax

; 模式 3:内存间接调用
call dword ptr [00xxxxxx]

IAT 重建策略

bash
# 对于每个 VM IAT 条目:
1. 设置硬件断点
2. 跟踪实际调用的 API
3. 记录 API 名称和模块
4. 重建导入描述符

📋 详细操作检查清单

阶段 1:准备阶段

  • 配置 OllyDbg 反调试插件

  • 设置硬件断点支持

  • 准备 dump 和修复工具

阶段 2:OEP 定位

  • 在 TLS 回调设置断点

  • 在系统 API 设置断点

  • 使用内存断点跟踪

  • 确认找到真正的 OEP

阶段 3:分析和修复

  • 识别所有 VMCall 模式

  • 映射 VM IAT 到真实 API

  • 选择合适的 dump 时机

阶段 4:Dump 和重建

  • 使用工具 dump 内存

  • 使用 ImportREC/Scylla 修复导入表

  • 验证修复结果

⚠️ 常见问题解决

OEP 定位失败

bash
# 解决方案:
1. 尝试不同的 API 断点
2. 使用堆栈跟踪方法
3. 分析 Delphi 启动例程特征

IAT 修复不完整

bash
# 解决方案:
1. 手动添加缺失的 API
2. 使用 ARImpRec.dll 辅助识别
3. 分析调用链找到正确地址

Dump 文件无法运行

bash
# 检查项目:
1. OEP 是否正确
2. 导入表是否完整
3. 节区对齐是否正确
4. 资源是否可访问

🎯 VMProtect 1.70 优化建议

利用版本弱点

bash
# VMProtect 1.70 的已知特性:
1. 相对简单的虚拟机
2. 有限的 anti-dump 技术
3. 标准的 API 钩子方式
4. 可预测的代码变形模式

自动化辅助

即使手动脱壳,也可以:

bash
# 使用脚本辅助:
1. 自动记录 API 调用
2. 批量修复 VMCall
3. 生成导入表模板

这个完整的手动脱壳流程应该能够帮助您成功处理这个 VMProtect 1.70 保护的 Delphi 程序。每个步骤都需要仔细执行和验证,确保最终生成的可执行文件功能完整。

 
 
 

posted on 2025-10-28 07:22  GKLBB  阅读(7)  评论(0)    收藏  举报