应用安全 --- 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 程序。每个步骤都需要仔细执行和验证,确保最终生成的可执行文件功能完整。
浙公网安备 33010602011771号