Piattaforma di ricerca per la devirtualizzazione di VMProtect assistita da trace: i front-end delle versioni alimentano un backend condiviso Remill/LLVM per sollevare gli handler, recuperare il dataflow ed emettere oggetti nativi.
Ricerca sulla devirtualizzazione di VMProtect assistita da trace: front-end per versione (gate 1.x / tabella 2.x / FDJ 3.x) che alimentano un unico backend condiviso (lift Remill → ottimizzazione LLVM → schede semantiche → dataflow → oggetti nativi).
Validato su binari VMP 3.9.4 compilati autonomamente attraverso molteplici modalità di protezione. La compatibilità con VMP 3.8.x/3.10.x è sperimentale e dipende dal campione.
Questa è una piattaforma di ricerca per analizzare binari protetti con VMProtect di cui siete proprietari o per cui siete autorizzati al reverse engineering — non un devirtualizzatore universale a prova di pulsante:
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 riproduce l'ambiente completo. La CI esegue cargo build/test --release
(feature predefinite, nessun link LLVM, nessun fixture commerciale; i test
con campioni protetti vengono saltati, tests/smoke.rs viene sempre eseguito). Il controllo opzionale del link --features llvm viene eseguito come job CI non bloccante (richiede LLVM 22).
| Var | Predefinito | Significato |
|---|---|---|
DATA_DIR | ./data | tutti gli artefatti degli strumenti |
WATCH_FILE | $DATA_DIR/watch.txt | VA da recuperare da monitorare |
CARDS | open_cards3.json | file di cache delle card Remill |
BIN_PATH | percorso del binario target (predefinito degli strumenti: segnaposto ./target.exe) | binario target |
IAT_JSON | — | mappa degli stub di import {api_name: iat_va} |
VMP_TEST_BIN / VMP_ORACLE | tests/fixtures/… | test su campioni con licenza |
REMILL_LIFT | remill-lift-22 nel PATH | binario di lifting Remill |
DEVIRT / FORCE_EDGE / REPO_ROOT | ./target/… / . | binari richiamati dagli script + radice del repository |
VMP_WORK_DIR | temp di sistema | area di lavoro per il lifting |
EFLAGS / IN_RET / DLL_MAIN | — | varianti dello stato dello snapshot |
ret su pagina azzerata, stub di import, hook IN).reg alimenta un caricamento di byte eseguito, qualunque sia
il suo mnemonico. I pattern statici movzx sono solo il seme di fallback —
i riscontri solo statici hanno misurato lo 0% di esecuzione su target
rafforzati. Copertura delle forme di fetch: movzx ✓, movsx ✓ (SMC
alterna tra loro a metà esecuzione; il miner accetta entrambi), fetch
con gate AND/co-byte ✓ tramite cattura live. Bias misurato (3.9.4, back-slice
ancorate al dispatch di devirt fetch vs scansione statica rigorosa): popolazioni
disgiunte — il sensore ha trovato 8 siti di byte a forma di fetch che il
gate pattern+mov-imm32 non aveva mai proposto (forme indicizzate/scalate
come movzx edx,[r9+riz-1]), 1 ha estratto una catena verificata
(Rol→Inc→Xor52→Ror, chiave r10l); il resto sono caricamenti in contesto VM
che il miner rifiuta correttamente. Altre forme (es. operazioni su stringhe):
porta i byte, ottieni un caso per il miner — apri una issue con i byte
dell'opcode attorno al fetch. Il fetch vincolato al pattern è un
non-metodo documentato in questo contesto.opt -O3, emetti card/dataflow,
ricompila con llc (ld -r dimostra la componibilità).synth (simplify_chain, attribuito
nel codice). Abbiamo mantenuto Remill+LLVM come lifter; nessuno scambio di IR.devirt brighten (il pool non si attiva su 3.9 — documentato).backend/mba.rs (derivati dal paper, nessun codice vendorizzato).MIT (vedi LICENSE) con note sulle dipendenze (in particolare Unicorn GPL-2.0). Solo per uso di ricerca/educativo, su binari di cui sei proprietario o che puoi analizzare.
Realizzato con l'assistenza dell'IA (design, codice, documentazione — diretti dall'uomo,
verificati dalla macchina: ogni numero in docs/coverage.md è riproducibile
dai comandi ad esso affiancati).