
Sistema de protección de máquina virtual para ELF ARM64
Sistema de Protección de Máquina Virtual para ARM64 ELF
Traduce instrucciones nativas ARM64 a bytecode de VM personalizado para protección de código a nivel de función
🇨🇳 中文文档 • Características • Arquitectura • Inicio rápido • Uso • Licencia
VMPacker es un sistema de Protección de Máquina Virtual (VMP) para binarios ARM64 (AArch64) Linux ELF. Decodifica las instrucciones nativas ARM64 de la función objetivo en una representación intermedia, las traduce a bytecode de VM personalizado e inyecta un intérprete de VM embebido en el archivo ELF. En tiempo de ejecución, las funciones protegidas son ejecutadas por el intérprete de VM en lugar de forma nativa.
Código nativo ARM64 → Decodificar → Traducir → Bytecode de VM personalizado
↓
ELF original ← Inyectar ← Stub del intérprete de VM
| Capa | Técnica | Descripción |
|---|---|---|
| Protección VM | ISA personalizada | Opcodes mapeados aleatoriamente — los ingenieros inversos no pueden identificar directamente la semántica de las instrucciones |
| OpcodeCryptor | Cifrado de opcodes por instrucción | enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
| Inversión de bytecode | Inversión del orden de ejecución | Las instrucciones se almacenan en orden inverso; el intérprete recorre hacia atrás |
| Entrada tokenizada | Trampolín de 3 instrucciones | La función original se reemplaza con una entrada tokenizada, ocultando la ubicación real del bytecode |
| Despacho indirecto | Tabla de saltos de punteros a función | Se llena en tiempo de ejecución en la pila, rompiendo las referencias cruzadas de IDA |
![]() |
![]() |
![]() |
| Lista de funciones | Análisis y selección | Opciones de protección |
![]() |
![]() |
|
| Registros en tiempo real | Protección completada |
vmp/
├── cmd/vmpacker/ # Punto de entrada CLI
│ ├── main.go # Análisis de argumentos CLI + orquestación
│ └── vm_interp.bin # Intérprete de VM compilado (GCC, go:embed)
│
├── pkg/ # Biblioteca central Go
│ ├── arch/arm64/ # Soporte de arquitectura ARM64
│ │ ├── decoder.go # Decodificador de instrucciones basado en tablas (implementa vm.Decoder)
│ │ ├── decode_*.go # Tablas de patrones de decodificación (DP-IMM/DP-REG/Branch/LdSt)
│ │ ├── translator.go # Traductor ARM64 → bytecode de VM
│ │ ├── tr_alu.go # Traducción de instrucciones ALU
│ │ ├── tr_branch.go # Traducción de instrucciones de bifurcación
│ │ ├── tr_loadstore.go # Traducción de instrucciones de memoria
│ │ ├── tr_bitfield.go # Traducción de instrucciones de campo de bits
│ │ └── tr_special.go # Instrucciones especiales (ADRP/ADR)
│ ├── vm/ # Definiciones de ISA de VM
│ │ ├── types.go # Tipos compartidos + interfaces (Decoder/Translator/Packer)
│ │ ├── opcodes.go # Definiciones de 58+ opcodes de VM (valores mapeados aleatoriamente)
│ │ └── disasm.go # Desensamblador de bytecode de VM
│ └── binary/elf/ # Manipulación de binarios ELF
│ ├── packer.go # Inyección de VMP en ELF (secuestro PT_NOTE, generación de trampolín)
│ └── trampoline.go # Generación de código de trampolín
│
├── stub/ # Intérprete de VM en C (compilado a binario plano PIC)
│ ├── vm_interp_clean.c # Bucle principal del intérprete + puntos de entrada
│ ├── vm_types.h # Contexto de CPU de VM (vm_ctx_t)
│ ├── vm_opcodes.h # Definiciones de opcodes en C (sincronizados con opcodes.go)
│ ├── vm_decode.h # Utilidades de lectura de bytecode
│ ├── vm_token.h # Codificación/decodificación de tokens + tabla de descriptores
│ ├── vm_dispatch.h # Tabla de saltos de despacho indirecto
│ ├── vm_crc.h # Verificación de integridad CRC32
│ ├── vm_sections.h # Macros de dispersión de secciones de manejadores
│ ├── vm_interp.lds # Script de enlace
│ └── vm_handlers/ # Manejadores de instrucciones modulares
│ ├── h_alu.h # Operaciones aritméticas/lógicas
│ ├── h_mem.h # Acceso a memoria
│ ├── h_branch.h # Bifurcación/salto
│ ├── h_cmp.h # Comparación/condicional
│ ├── h_mov.h # Movimiento de datos
│ ├── h_stack.h # Pila (PUSH/POP)
│ └── h_system.h # Sistema (SVC/MRS/BLR/BR/RET)
│
├── vmp-gui/ # Interfaz gráfica Wails
│ ├── frontend/ # Vue 3 + Element Plus
│ └── backend/ # Enlaces del backend Go
│
└── build/ # Herramientas precompiladas + artefactos de prueba