VMP Devirtualizer — производственный релиз
Универсальный девиртуализатор VMProtect с поддержкой версий 1.x, 2.x и 3.x. Автономный CLI-инструмент + плагин для Ghidra.
Статус: ✅ Готов к продакшену | Валидация: 22/22 образцов (100%) | Охват: VMP ≤3.6 (для 3.7+ требуется реверс-инжиниринг)
Возможности
- Поддержка нескольких версий: VMP 1.x, 2.x, 3.x (1.1 → 3.10.5)
- Определение версии: автоматическое распознавание на основе эвристик
- Извлечение таблицы диспетчеризации: перехват XOR-ключей через Unicorn для зашифрованных таблиц
- Классификация хэндлеров: 256 типов хэндлеров для всех версий
- Декодирование байткода: восстановление инструкций x86-64 из VM-операций
- Поддержка платформ: бинарники Windows PE + Linux ELF
- Интеграция с декомпилятором: VM-байткод → псевдокод
- Плагин Ghidra: интерактивный анализ хэндлеров + аннотации
Быстрый старт
Сборка
cd /home/ciupix/vmp_devirt_prod
cargo build --release
Бинарник: target/release/vmp_devirt
Использование
# Analyze binary
./target/release/vmp_devirt <binary_path>
# Export handlers
./target/release/vmp_devirt <binary_path> --export-handlers handlers.json
# Export bytecode
./target/release/vmp_devirt <binary_path> --export-bytecode bytecode.json
Результаты валидации
Сводка
- Всего образцов: 22
- Процент успеха: 22/22 (100%)
- Среднее время обработки: 229мс
- Общее время: 5,0 секунд
По версиям
| Version | Samples | Success | Avg Time |
|---|
| VMP 1.x | 4 | 4/4 | 38ms |
| VMP 2.x | 6 | 6/6 | 734ms |
| VMP 3.x | 12 | 12/12 | 39ms |
Протестированные образцы:
- VMP 1.x: HiVmp.vmp.1.1.exe, HiVmp.vmp.1.4.exe, HiVmp.vmp.1.54.exe, HiVmp.vmp.1.70.4.exe
- VMP 2.x: Branch0.vmp.exe, HiVmp.exe, mfc_algo_demo.vmp.exe, Project1.vmp.exe, Project2.vmp.exe, Project4.vmp.exe
- VMP 3.x: add_control_flow.vmp.exe, adder.vmp.exe, bitwise.vmp.exe, control_flow_test.vmp.exe, cpuid_test.vmp.exe, fac_fib.vmp.exe, globals.vmp.exe, hello_world.vmp.exe, multiadder.vmp.exe, nested_virt_funccall.vmp.exe, ptr_drf.vmp.exe, switch.vmp.exe
Подробные результаты см. в VALIDATION_REPORT.md.
Архитектура
Input Binary
↓
PE/ELF Loader (src/pe_loader.rs)
↓
Version Detector (src/version.rs)
↓
Dispatch Table Extractor (src/dispatch_table.rs)
├─ Unicorn XOR Key Capture (src/unicorn_emulator.rs)
└─ Pattern Matching Fallback
↓
Handler Classifier (src/handler_classifier.rs)
↓
Bytecode Decoder (src/bytecode.rs)
├─ Operand Decryption (src/decrypt.rs)
└─ ALU Reconstruction (src/alu.rs)
↓
Output (JSON/Pseudo-asm)
Основные модули
| Module | Purpose | Lines |
|---|
src/lib.rs | Основной интерфейс библиотеки | 150 |
src/version.rs | Определение версии VMP | 200 |
src/pe_loader.rs | Загрузка PE/ELF-бинарников | 350 |
src/dispatch_table.rs | Извлечение таблицы диспетчеризации | 400 |
src/unicorn_emulator.rs | Перехват XOR-ключей | 308 |
src/handler_classifier.rs | Определение типов хэндлеров | 280 |
src/bytecode.rs | Чтение и декодирование байткода | 320 |
src/decrypt.rs | Цепочки ValueCryptor | 250 |
src/alu.rs | Восстановление ALU-операций | 200 |
src/opcode_table.rs | Управление опкодами | 180 |
src/bin/cli.rs | CLI-инструмент | 400 |
Итого: ~2800 строк производственного кода на Rust
Детали реализации
Определение версии
Эвристики на основе:
- Паттернов входов хэндлеров (опкоды POP/PUSH)
- Механизма диспетчеризации (jumptable против зашифрованной цепочки против цепочки хэндлеров)
- Структуры PE-секций (.vmp0, .vmp1, .text)
- Паттерна входного стаба (PUSH encrypted + CALL/JMP)
Извлечение таблицы диспетчеризации
VMP 1.x/2.x: извлечение XOR-ключей сопоставлением с образцом в секции .text
- Сканирует паттерны инструкций XOR
- Выводит ключи из последовательностей опкодов
- Проверяет по диапазону базового адреса образа
VMP 3.x: диспетчеризация через цепочки хэндлеров
- Находит точки диспетчеризации (DP0-DP5)
- Прослеживает цепочки хэндлеров
- Извлекает 256 записей диспетчеризации
Классификация хэндлеров
Сопоставление с образцом по:
- Паттерну входа (49 8b 2a = POP для VMP 3.x)
- Базовой операции (SUB, ADD, XOR и т.д.)
- Типам операндов (slot, offset, immediate)
- Механизму диспетчеризации (push/ret, прямой jmp)
Декодирование байткода
- Прочитать опкод из секции байткода
- Найти семантику хэндлера
- Извлечь операнды (slot, offset)
- Расшифровать операнды через цепочки ValueCryptor
- Восстановить инструкцию x86-64
- Обработать VM-контекст (регистровый файл, флаги, стек)
Известные ограничения
- VMP 3.7+ (объединённые хэндлеры) — не поддерживается. В VMP 3.7+ появились объединённые хэндлеры (несколько операций на один вход хэндлера), что ломает текущий классификатор. Требуется реверс-инжиниринг с реальным образцом 3.7+. Подробности см. в
FUTURE_WORK.md.
- Предупреждения проверки XOR-ключей — ожидаемы для VMP 1.x/2.x (не критично)
- Определение диспетчеризации VMP 3.x — использует резервную стратегию для более новых обфускаций
- Образцы Linux — не включены в текущий набор тестов (поддержка ELF реализована)
Производительность
- Пропускная способность: ~4,4 образца/сек
- Память: <50 МБ на образец
- Задержка: 5 мс–3,25 с в зависимости от размера бинарника
Документация
VALIDATION_REPORT.md — полные результаты тестирования
IMPLEMENTATION_COMPLETE.md — статус реализации
UNICORN_IMPLEMENTATION_REPORT.md — детали перехвата XOR-ключей
Исходные материалы
Архитектура основана на анализе утечки исходного кода VMP 3.5.1:
- Структура хэндлеров и механизм диспетчеризации
- Реализация цепочек ValueCryptor
- Паттерны ALU-операций
- Управление VM-контекстом
Лицензия
Использование в исследовательских/образовательных целях
Контакты
По вопросам и проблемам обращайтесь к отчётам о валидации или документации по реализации.
Последнее обновление: 2026-06-01
Статус: Готов к продакшену