Trace 기반 VMProtect 디바이추얼라이제이션 연구 플랫폼: 버전 프런트엔드가 공유 Remill/LLVM 백엔드에 입력을 전달하여 핸들러를 리프팅하고, 데이터 흐름을 복원하며, 네이티브 오브젝트를 생성합니다.
Trace 기반 VMProtect 디버추얼라이제이션 연구: 버전별 프런트엔드 (1.x gate / 2.x table / 3.x FDJ)가 하나의 공유 백엔드 (Remill lift → LLVM opt → 시맨틱 카드 → 데이터플로우 → 네이티브 오브젝트)를 구동합니다.
여러 보호 모드에 걸쳐 자체 빌드한 VMP 3.9.4 바이너리로 검증되었습니다. VMP 3.8.x/3.10.x 호환성은 실험적이며 샘플에 따라 달라집니다.
이것은 소유하거나 리버스 엔지니어링 라이선스가 있는 VMProtect 보호 바이너리를 분석하기 위한 연구 플랫폼이며, 범용적인 원클릭 디버추얼라이저가 아닙니다:
src/
lib.rs crate 루트, data_dir()
pe_loader.rs PE 파싱 / VA 읽기
opcode_map.rs 표준 3.5.1 opcode -> 핸들러 맵
frontend/
mod.rs VmFrontend 트레이트 (detect/fetch_stream/handler_addrs)
fetch_finder.rs movzx-byte FDJ 스캔 + watchset/snapshot 헬퍼
cryptor_miner.rs 사이트별 ValueCryptor 마이닝 (분기 추적)
site_emulator.rs 샘플별 오라클 디코더 (레거시)
handler_classifier.rs 레거시 패턴을 통한 핸들러 분류
classifier_legacy.rs 첫 바이트 패턴 (약함; 폴백 전용)
v1_gate.rs VMP 1.x gate-scan 프런트엔드
v2_walker.rs VMP 2.x 디스패치 테이블 프런트엔드
v3_fdj.rs VMP 3.x FDJ 프런트엔드
backend/
value_cryptor.rs ADD/SUB/XOR/ROL/ROR/NOT/NEG/... 체인
lifter.rs iced-x86 텍스트 리프트 + Remill 서브프로세스 백엔드
llvm_pipeline.rs Remill IR에 대한 opt -O3 (실제 패스)
harness/
snapshot.rs Unicorn 스냅샷: 섹션+스크래치 매핑,
IN 훅, 임포트 스텁, watch 히트, memlog,
zero-slide 패스트 포워드
tests/
smoke.rs 합성 PE64 + 수작업 fetch 체인 (픽스처 없음)
tools/ (분석 드라이버; 각각 입력을 문서화함)
scripts/ Triton/angr/Ghidra 헬퍼 (외부 의존성)
# Debian/Ubuntu (선택적 llvm 기능을 위한 LLVM 22)
sudo apt install llvm-22-dev libclang-22-dev clang-22
cargo build --release # 순수 Rust (LLVM 링크 없음)
cargo build --release --features llvm # llvm-sys 링크 검사
pip install triton-library capstone pefile # python 헬퍼
# Remill (선택적 리프터 백엔드): 업스트림 빌드, export REMILL_LIFT=<path>/remill-lift
# Souper (선택적 MBA 슈퍼옵티마이저): 외부 전용, 원한다면 `souper` CLI를
# scripts/triton_handlers.py 출력에 연결; 벤더링되지 않음.
Dockerfile은 전체 환경을 재현합니다. CI는 cargo build/test --release를
실행합니다 (기본 기능, LLVM 링크 없음, 상용 픽스처 없음; 샘플 게이트
테스트는 건너뛰고, tests/smoke.rs는 항상 실행됨). 선택적
--features llvm 링크 검사는 비차단 CI 작업으로 실행됩니다 (LLVM 22 필요).
| Var | Default | Meaning |
|---|---|---|
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 훅).movzx byte [reg]가 정적 패턴을
앞섭니다 — 정적 전용 히트는 강화된 타깃에서 실행률 0%로 측정됨).opt -O3를 실행하고,
카드/데이터플로우를 생성하고, llc로 재컴파일합니다 (ld -r이
합성 가능성을 증명).MIT (LICENSE 참조) 및 의존성 고지 (특히 Unicorn GPL-2.0). 연구/교육 목적 전용, 소유하거나 분석이 허용된 바이너리에 한함.