基于Trace辅助的VMProtect去虚拟化研究平台:各版本前端将处理程序提供给共享的Remill/LLVM后端,以提升处理程序、恢复数据流并生成原生对象。
跟踪辅助的 VMProtect 反虚拟化研究:版本前端 (1.x 门控 / 2.x 表 / 3.x FDJ)馈入一个共享后端 (Remill 提升 → LLVM 优化 → 语义卡片 → 数据流 → 原生对象)。
已针对自建的 VMP 3.9.4 二进制文件在多种 保护模式下完成验证。VMP 3.8.x/3.10.x 兼容性为实验性且 依赖于样本。
这是一个用于分析你拥有或获授权进行逆向工程的 VMProtect 保护二进制文件的研究平台——而非通用、 一键式的反虚拟化工具:
src/
lib.rs crate root, data_dir()
pe_loader.rs PE parsing / VA reads
opcode_map.rs legacy handler-type labels (oracle only, see module docs)
frontend/
mod.rs VmFrontend trait (detect/fetch_stream/handler_addrs)
fetch_finder.rs movzx-byte FDJ scan + watchset/snapshot helpers
cryptor_miner.rs per-site ValueCryptor mining (branch-following)
site_emulator.rs sample-specific oracle decoders (legacy)
handler_classifier.rs handler classification via legacy patterns
classifier_legacy.rs first-bytes patterns (weak; fallback only)
v1_gate.rs VMP 1.x gate-scan front-end
v2_walker.rs VMP 2.x dispatch-table front-end
v3_fdj.rs VMP 3.x FDJ front-end
backend/
value_cryptor.rs ADD/SUB/XOR/ROL/ROR/NOT/NEG/... chains
lifter.rs iced-x86 text lift + Remill subprocess backend
llvm_pipeline.rs opt -O3 over Remill IR (real passes)
harness/
snapshot.rs Unicorn snapshots: sections+scratch mapping,
IN hooks, import stubs, watch hits, memlog,
zero-slide fast-forward
tests/
smoke.rs synthetic PE64 + hand-built fetch chain (no fixtures)
tools/ (analysis drivers; each documents its inputs)
scripts/ Triton/angr/Ghidra helpers (external deps)
# Debian/Ubuntu (LLVM 22 for optional llvm feature)
sudo apt install llvm-22-dev libclang-22-dev clang-22
cargo build --release # pure Rust (no LLVM link)
cargo build --release --features llvm # llvm-sys link check
pip install triton-library capstone pefile # python helpers
# Remill (optional lifter backend): build upstream, export REMILL_LIFT=<path>/remill-lift
# Souper (optional MBA superoptimizer): external only, wire its `souper` CLI
# to scripts/triton_handlers.py output if desired; not vendored.
Dockerfile 可复现完整环境。CI 运行 cargo build/test --release(默认特性,不链接 LLVM,不使用商业样本;样本门控测试跳过,tests/smoke.rs 始终运行)。可选的 --features llvm 链接检查作为非阻塞 CI 任务运行(需要 LLVM 22)。
| 变量 | 默认值 | 含义 |
|---|---|---|
DATA_DIR | ./data | 所有工具产物 |
WATCH_FILE | $DATA_DIR/watch.txt | 要监视的 fetch VA |
CARDS | open_cards3.json | Remill 卡片缓存文件 |
BIN_PATH | 目标二进制路径(工具默认:./target.exe 占位符) | 目标二进制 |
IAT_JSON | — | {api_name: iat_va} 导入桩映射 |
VMP_TEST_BIN / VMP_ORACLE | tests/fixtures/… | 授权样本测试 |
REMILL_LIFT | PATH 上的 remill-lift-22 | Remill lift 二进制 |
DEVIRT / FORCE_EDGE / REPO_ROOT | ./target/… / . | 脚本调用的二进制 + 仓库根目录 |
VMP_WORK_DIR | 系统临时目录 | lift 暂存目录 |
EFLAGS / IN_RET / DLL_MAIN | — | 快照状态变体 |
ret、导入桩、IN 钩子)。reg 为已执行的字节加载提供输入,无论其助记符是什么。静态 movzx 模式仅作为回退种子——仅静态命中在加固目标上实测执行率为 0%。Fetch 形态覆盖:movzx ✓、movsx ✓(SMC 在运行中途在两者间切换;miner 两者都接受)、and 门控/co-byte fetch ✓ 通过实时捕获。实测偏差(3.9.4,devirt fetch 以 dispatch 为锚点的后向切片 vs 静态严格扫描):两者为不相交的群体——传感器发现了 8 个 fetch 形态的字节点,而模式+mov-imm32 门控从未提出(索引/缩放形式如 movzx edx,[r9+riz-1]),其中 1 个挖掘出已验证的链(Rol→Inc→Xor52→Ror,密钥 r10l);其余是 VM 上下文加载,miner 正确拒绝。其他形态(例如字符串操作):提供字节,获得一个 miner 用例——在 fetch 附近的操作码字节处提交 issue。模式锁定的 fetch 在此被记录为非方法。opt -O3,生成卡片/数据流,用 llc 重新编译(ld -r 证明可组合性)。synth(simplify_chain,代码中注明出处)。我们保留 Remill+LLVM 作为 lifter;不进行 IR 替换。devirt brighten(池在 3.9 上不触发——已记录)。backend/mba.rs(源自论文,无内置代码)。MIT(见 LICENSE)及依赖说明(特别是 Unicorn GPL-2.0)。仅限研究/教育用途,用于你拥有或可分析的二进制文件。
在 AI 辅助下构建(设计、代码、文档——人类指导,机器校验:docs/coverage.md 中的每个数字都可由其旁边的命令复现)。