Binaryen - Cadeia de Ferramentas Compilador & Otimizador WebAssembly Cheatsheet
Binaryen - Cadeia de Ferramentas Compilador & Otimizador WebAssembly Cheatsheet
Binaryen é uma biblioteca compilador e infraestrutura de cadeia de ferramentas para WebAssembly, escrita em C++. Sua ferramenta de destaque, wasm-opt, carrega um módulo wasm em uma representação intermediária e executa otimizações e passagens de transformação sobre ele — a mesma maquinaria que cadeias de ferramentas como Emscripten usam para encolher e acelerar wasm. Para engenheiros reversos, o desassemblador do Binaryen (wasm-dis) e suas passagens de análise/transformação (incluindo simplificações adjacentes de desofuscação) o tornam um complemento útil para WABT.
Instalação
| Plataforma | Comando |
|---|---|
| macOS (Homebrew) | brew install binaryen |
| Debian/Ubuntu | sudo apt install binaryen |
| Arch Linux | sudo pacman -S binaryen |
| npm | npm install -g binaryen (ligações JS) |
| From source | compilar com CMake do repositório WebAssembly/binaryen |
| Verify | wasm-opt --version |
Ferramentas Principais
| Ferramenta | Faz |
|---|---|
wasm-opt | Carregar, otimizar/transformar e re-emitir um módulo |
wasm-dis | Desassentar .wasm → texto |
wasm-as | Montar texto → .wasm |
wasm-metadce | Eliminação de código morto entre módulo + JS |
wasm-ctor-eval | Avaliar construtores em tempo de compilação |
wasm-reduce | Encolher um módulo preservando um comportamento (bug repro) |
wasm-shell | Executar o shell de teste de especificação |
Otimizando um Módulo
# Optimize for size and speed
wasm-opt -O3 module.wasm -o module.opt.wasm
# Optimize aggressively for size
wasm-opt -Oz module.wasm -o module.small.wasm
| Flag | Efeito |
|---|---|
-O / -O1..-O4 | Otimização crescente para velocidade |
-Os | Otimizar para tamanho |
-Oz | Otimizar agressivamente para tamanho |
--enable-FEATURE | Habilitar uma proposta wasm (simd, threads, …) |
-o FILE | Arquivo de saída |
Executando Passagens Individuais
wasm-opt expõe muitas passagens nomeadas que você pode executar seletivamente — útil para RE (simplificar código ofuscado) bem como compilações.
# List all available passes
wasm-opt --help | grep -A2 "passes:"
# Run specific passes (e.g. simplify + remove unused)
wasm-opt module.wasm --precompute --simplify-locals \
--remove-unused-names --vacuum -o clean.wasm
| Pass (exemplos) | Propósito |
|---|---|
--precompute | Dobrar expressões constantes |
--simplify-locals | Reduzir uso de variáveis locais redundantes |
--vacuum | Remover código claramente morto |
--remove-unused-module-elements | Retirar funcs/globais não usados |
--flatten / --rereloop | Reestruturar fluxo de controle |
Desassemblagem / Montagem
# Disassemble to Binaryen's text form
wasm-dis module.wasm -o module.wat
# Assemble back
wasm-as module.wat -o module.wasm
Uso de RE: Simplificar Depois Ler
Um truque prático para reversão é executar as passagens de simplificação do Binaryen para limpar o ruído do compilador/ofuscador, depois ler o resultado.
# Simplify a gnarly module, then decompile with WABT
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp
Minimizando um Repro (wasm-reduce)
# Shrink a module while a script still reports the behavior of interest
wasm-reduce big.wasm --command "node check.js" -o small.wasm
Ótimo para isolar o wasm mínimo que desencadeia um bug ou um comportamento específico.
Binaryen vs Ferramentas Relacionadas
| Ferramenta | Foco |
|---|---|
| Binaryen | Otimizar/transformar/analisar wasm (nível de compilador) |
| WABT | Converter/inspecionar/validar/descompilar |
| diswasm | Decompilador pseudocódigo |
| wasm-tools | Manipulação de baixo nível Rust |
Para RE: use Binaryen para simplificar, WABT/diswasm para ler, e wasm-tools para validar/mutar.