
Sistema de Proteção de Máquina Virtual ARM64 ELF
Sistema de Proteção de Máquina Virtual ARM64 ELF
Traduza instruções nativas ARM64 para bytecode VM personalizado para proteção de código em nível de função
🇨🇳 中文文档 • Funcionalidades • Arquitetura • Início Rápido • Uso • Licença
O VMPacker é um sistema de Proteção por Máquina Virtual (VMP) para binários ARM64 (AArch64) Linux ELF. Ele decodifica instruções ARM64 nativas da função alvo em uma representação intermediária, traduz-as em bytecode VM personalizado e injeta um interpretador VM embarcado no arquivo ELF. Em tempo de execução, as funções protegidas são executadas pelo interpretador VM em vez de nativamente.
Código Nativo ARM64 → Decodificar → Traduzir → Bytecode VM Personalizado
↓
ELF Original ← Injetar ← Stub do Interpretador VM
| Camada | Técnica | Descrição |
|---|---|---|
| Proteção VM | ISA Personalizada | Opcodes mapeados aleatoriamente — engenheiros reversos não podem identificar diretamente a semântica das instruções |
| Criptografia de Opcode | Criptografia de opcode por instrução | enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
| Reversão de Bytecode | Inversão da ordem de execução | Instruções armazenadas em ordem inversa; interpretador percorre para trás |
| Entrada Tokenizada | Trampolim de 3 instruções | Função original substituída por entrada tokenizada, ocultando a localização real do bytecode |
| Despacho Indireto | Tabela de ponteiros de função | Preenchida em tempo de execução na pilha, quebrando referências cruzadas do IDA |
![]() |
![]() |
![]() |
| Lista de Funções | Análise e Seleção | Opções de Proteção |
![]() |
![]() |
|
| Logs em Tempo Real | Proteção Concluída |
vmp/
├── cmd/vmpacker/ # Ponto de entrada da CLI
│ ├── main.go # Análise de argumentos da CLI + orquestração
│ └── vm_interp.bin # Interpretador VM compilado (GCC, go:embed)
│
├── pkg/ # Biblioteca central Go
│ ├── arch/arm64/ # Suporte à arquitetura ARM64
│ │ ├── decoder.go # Decodificador orientado por tabela (implementa vm.Decoder)
│ │ ├── decode_*.go # Tabelas de padrões de decodificação (DP-IMM/DP-REG/Branch/LdSt)
│ │ ├── translator.go # Tradutor ARM64 → bytecode VM
│ │ ├── tr_alu.go # Tradução de instruções ALU
│ │ ├── tr_branch.go # Tradução de instruções de desvio
│ │ ├── tr_loadstore.go # Tradução de instruções de memória
│ │ ├── tr_bitfield.go # Tradução de instruções de campos de bits
│ │ └── tr_special.go # Instruções especiais (ADRP/ADR)
│ ├── vm/ # Definições da ISA VM
│ │ ├── types.go # Tipos compartilhados + interfaces (Decoder/Translator/Packer)
│ │ ├── opcodes.go # Definições de 58+ opcodes VM (valores mapeados aleatoriamente)
│ │ └── disasm.go # Desmontador de bytecode VM
│ └── binary/elf/ # Manipulação de binários ELF
│ ├── packer.go # Injeção VMP em ELF (sequestro de PT_NOTE, geração de trampolim)
│ └── trampoline.go # Geração de código de trampolim
│
├── stub/ # Interpretador VM em C (compilado para binário PIC flat)
│ ├── vm_interp_clean.c # Loop principal do interpretador + pontos de entrada
│ ├── vm_types.h # Contexto de CPU VM (vm_ctx_t)
│ ├── vm_opcodes.h # Definições de opcodes do lado C (sincronizadas com opcodes.go)
│ ├── vm_decode.h # Utilitários de leitura de bytecode
│ ├── vm_token.h # Codificação/decodificação de token + tabela descritora
│ ├── vm_dispatch.h # Tabela de despacho indireto
│ ├── vm_crc.h # Verificação de integridade CRC32
│ ├── vm_sections.h # Macros de dispersão de seções de handlers
│ ├── vm_interp.lds # Script do linker
│ └── vm_handlers/ # Handlers modulares de instruções
│ ├── h_alu.h # Operações aritméticas/lógicas
│ ├── h_mem.h # Acesso à memória
│ ├── h_branch.h # Desvio/salto
│ ├── h_cmp.h # Comparação/condicional
│ ├── h_mov.h # Movimento de dados
│ ├── h_stack.h # Pilha (PUSH/POP)
│ └── h_system.h # Sistema (SVC/MRS/BLR/BR/RET)
│
├── vmp-gui/ # Frontend da GUI Wails
│ ├── frontend/ # Vue 3 + Element Plus
│ └── backend/ # Ligações do backend em Go
│
└── build/ # Ferramentas pré-compiladas + artefatos de teste
O projeto usa uma arquitetura modular orientada por interfaces, facilitando a extensão para novas ISAs e formatos binários:
// Interface do decodificador de arquitetura — extensível para x86, RISC-V
type Decoder interface {
Decode(raw uint32, offset int) Instruction
InstName(op int) string
}