
ARM64 ELF Система защиты виртуальной машины
Система защиты ARM64 ELF на основе виртуальной машины
Преобразует нативные инструкции ARM64 в пользовательский байт-код ВМ для защиты кода на уровне функций
🇨🇳 中文文档 • Возможности • Архитектура • Быстрый старт • Использование • Лицензия
VMPacker — это система защиты с помощью виртуальной машины (VMP) для ARM64 (AArch64) Linux ELF-бинарных файлов. Она декодирует нативные инструкции ARM64 целевой функции в промежуточное представление, преобразует их в пользовательский байт-код ВМ и внедряет встроенный интерпретатор ВМ в ELF-файл. Во время выполнения защищённые функции исполняются интерпретатором ВМ вместо нативного выполнения.
ARM64 Native Code → Decode → Translate → Custom VM Bytecode
↓
Original ELF ← Inject ← VM Interpreter Stub
vmp/
├── cmd/vmpacker/ # Точка входа CLI
│ ├── main.go # Разбор аргументов CLI + оркестровка
│ └── vm_interp.bin # Скомпилированный интерпретатор ВМ (GCC, go:embed)
│
├── pkg/ # Основная библиотека Go
│ ├── arch/arm64/ # Поддержка архитектуры ARM64
│ │ ├── decoder.go # Таблично-управляемый декодер инструкций (реализует vm.Decoder)
│ │ ├── decode_*.go # Таблицы шаблонов декодирования (DP-IMM/DP-REG/Branch/LdSt)
│ │ ├── translator.go # Транслятор ARM64 → байт-код ВМ
│ │ ├── tr_alu.go # Трансляция ALU-инструкций
│ │ ├── tr_branch.go # Трансляция инструкций ветвления
│ │ ├── tr_loadstore.go # Трансляция инструкций работы с памятью
│ │ ├── tr_bitfield.go # Трансляция инструкций битовых полей
│ │ └── tr_special.go # Специальные инструкции (ADRP/ADR)
│ ├── vm/ # Определения ISA ВМ
│ │ ├── types.go # Общие типы + интерфейсы (Decoder/Translator/Packer)
│ │ ├── opcodes.go # 58+ определений опкодов ВМ (случайно отображаемые значения)
│ │ └── disasm.go # Дизассемблер байт-кода ВМ
│ └── binary/elf/ # Манипуляции с ELF-бинарными файлами
│ ├── packer.go # Внедрение VMP в ELF (перехват PT_NOTE, генерация трамплина)
│ └── trampoline.go # Генерация кода трамплина
│
├── stub/ # Интерпретатор ВМ на C (скомпилирован в PIC плоский бинарник)
│ ├── vm_interp_clean.c # Основной цикл интерпретатора + точки входа
│ ├── vm_types.h # Контекст ЦП ВМ (vm_ctx_t)
│ ├── vm_opcodes.h # Определения опкодов на C (синхронизированы с opcodes.go)
│ ├── vm_decode.h # Утилиты чтения байт-кода
│ ├── vm_token.h # Кодирование/декодирование токена + таблица дескрипторов
│ ├── vm_dispatch.h # Таблица косвенной диспетчеризации
│ ├── vm_crc.h # Проверка целостности CRC32
│ ├── vm_sections.h # Макросы разброса секций обработчиков
│ ├── vm_interp.lds # Скрипт компоновщика
│ └── vm_handlers/ # Модульные обработчики инструкций
│ ├── h_alu.h # Арифметические/логические операции
│ ├── h_mem.h # Доступ к памяти
│ ├── h_branch.h # Ветвления/переходы
│ ├── h_cmp.h # Сравнения/условные операции
│ ├── h_mov.h # Перемещение данных
│ ├── h_stack.h # Стек (PUSH/POP)
│ └── h_system.h # Системные операции (SVC/MRS/BLR/BR/RET)
│
├── vmp-gui/ # Фронтенд GUI Wails
│ ├── frontend/ # Vue 3 + Element Plus
│ └── backend/ # Привязки бэкенда на Go
│
└── build/ # Предварительно скомпилированные инструменты + тестовые артефакты
Проект использует интерфейсно-ориентированную модульную архитектуру, что упрощает расширение на новые ISA и бинарные форматы:
// Интерфейс архитектурного декодера — расширяемый для x86, RISC-V
type Decoder interface {
Decode(raw uint32, offset int) Instruction
InstName(op int) string
}
// Интерфейс транслятора байт-кода
type Translator interface {
Translate(instructions []Instruction) (*TranslateResult, error)
}
// Интерфейс инжектора бинарных форматов — расширяемый для PE, Mach-O
type Packer interface {
Process() error
}
graph LR
A[Входной ELF] --> B[Найти целевую функцию]
B --> C[Извлечь инструкции ARM64]
C --> D[Декодировать ARM64]
D --> E[Транслировать в байт-код ВМ]
E --> F[XOR-шифрование байт-кода]
F --> G[Внедрить интерпретатор ВМ]
G --> H[Сгенерировать трамплин]
H --> I[Заменить вход функции]
I --> J[Выходной защищённый ELF]
git clone https://github.com/LeoChen-CoreMind/VMPacker.git
cd VMPacker
make all
# Защита одной функции
./vmpacker -func check_license -v -o protected.elf original.elf
# Защита нескольких функций
./vmpacker -func "check_license,verify_token" -v -o protected.elf original.elf
# Указать диапазон адресов
./vmpacker -addr "0x4006AC-0x400790:main" -v -o protected.elf original.elf
# Смешанный режим
./vmpacker -addr "0x4006AC-0x400790:main" -func verify -o protected.elf original.elf
./vmpacker -info input.elf
# Стандартная сборка (GCC)
aarch64-linux-gnu-gcc -Os -nostdlib -fPIC -ffreestanding \
-o stub.elf stub/vm_interp_clean.c \
-T stub/vm_interp.lds
aarch64-linux-gnu-objcopy -O binary stub.elf vm_interp.bin
go build -o vmpacker ./cmd/vmpacker/
cd vmpacker
make gui
VMPacker определяет пользовательскую архитектуру набора команд (ISA) с случайно отображаемыми значениями опкодов для повышения сложности обратной разработки.
📖 Полную таблицу опкодов с деталями кодирования см. в китайской документации.
Вклад приветствуется! Пожалуйста, следуйте этим рекомендациям:
git checkout -b feature/new-archgit commit -m 'feat: add x86_64 decoder'git push origin feature/new-archМы следуем Conventional Commits:
feat: Новая функцияfix: Исправление ошибкиrefactor: Рефакторинг кодаdocs: Документацияtest: ТестыЭтот проект лицензирован под AGPL-3.0 License.
Почему AGPL-3.0:
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КАКИЕ-ЛИБО ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, ВОЗНИКШИЕ В РЕЗУЛЬТАТЕ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, СВЯЗАННЫЕ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ЕГО ИСПОЛЬЗОВАНИЕМ.
Этот проект предназначен для обеспечения легитимной защиты интеллектуальной собственности разработчиков программного обеспечения, помогая защищать основные алгоритмы и критически важный код в коммерческом ПО от несанкционированной обратной разработки или кражи.
Предупреждение для пользователей:
- При использовании этого программного обеспечения вы должны соблюдать все применимые законы и нормативные акты вашей юрисдикции
- Строго запрещается использовать это ПО в любых незаконных целях, включая, но не ограничиваясь: разработкой вредоносного ПО, обходом проверок безопасности, нарушением прав интеллектуальной собственности других лиц или нарушением безопасности компьютерных систем
- Автор(ы) не несут ответственности за любые прямые или косвенные последствия, возникшие в результате использования этого ПО любым лицом
- Загружая, используя или распространяя это ПО, вы подтверждаете, что прочитали и согласны с вышеуказанными условиями
LeoChen — @LeoChen-CoreMind
Copyright © 2026 LeoChen. Все права защищены.
| Уровень | Техника | Описание |
|---|
| Защита ВМ | Пользовательская ISA | Случайное отображение опкодов — обратные инженеры не могут напрямую определить семантику инструкций |
| OpcodeCryptor | Шифрование опкода для каждой инструкции | enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
| Реверсирование байт-кода | Обратный порядок выполнения | Инструкции хранятся в обратном порядке; интерпретатор обходит их в обратную сторону |
| Токеновый вход | Трамплин из 3 инструкций | Исходная функция заменяется токенизированным входом, скрывающим фактическое местоположение байт-кода |
| Косвенная диспетчеризация | Таблица переходов по указателям на функции | Заполняется во время выполнения в стеке, нарушая перекрёстные ссылки IDA |
![]() | ![]() | ![]() |
| Список функций | Анализ и выбор | Параметры защиты |
![]() | ![]() | |
| Логи в реальном времени | Защита завершена |
| Параметр | По умолчанию | Описание |
|---|
-func | — | Имя(ена) функции для защиты (через запятую) |
-addr | — | Защита по адресу (0xSTART-0xEND[:name]) |
-o | input.vmp | Путь к выходному файлу |
-v | false | Подробный вывод (показать дизассемблирование) |
-strip | true | Удалить таблицу символов |
-debug | false | Создать файл отладки соответствия ARM64 → байт-код ВМ |
-token | true | Токенизированный режим входа |
-info | false | Только вывод информации об ELF |
| Категория | Количество | Описание |
|---|
| Перемещение данных | 3 | MOV_IMM64, MOV_IMM32, MOV_REG |
| Арифметика/Логика | 21 | ADD, SUB, MUL, XOR, AND, OR, SHL, SHR, ASR, NOT, ROR, UMULH + варианты _IMM |
| Доступ к памяти | 8 | LOAD/STORE 8/16/32/64 |
| Ветвления/Переходы | 13 | JMP, JE, JNE, JL, JGE, JGT, JLE, JB, JAE, JBE, JA, TBZ, TBNZ |
| Сравнения | 6 | CMP, CMP_IMM, CCMP_REG, CCMP_IMM, CCMN_REG, CCMN_IMM |
| Стек | 2 | PUSH, POP |
| Системные/Специальные | 8 | NOP, HALT, RET, CALL_NATIVE, CALL_REG, BR_REG, SVC, MRS |
| SIMD | 2 | VLD16, VST16 |
| Всего | 63 |