應用安全 --- 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號