Pular para o conteúdo

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

PlataformaComando
macOS (Homebrew)brew install binaryen
Debian/Ubuntusudo apt install binaryen
Arch Linuxsudo pacman -S binaryen
npmnpm install -g binaryen (ligações JS)
From sourcecompilar com CMake do repositório WebAssembly/binaryen
Verifywasm-opt --version

Ferramentas Principais

FerramentaFaz
wasm-optCarregar, otimizar/transformar e re-emitir um módulo
wasm-disDesassentar .wasm → texto
wasm-asMontar texto → .wasm
wasm-metadceEliminação de código morto entre módulo + JS
wasm-ctor-evalAvaliar construtores em tempo de compilação
wasm-reduceEncolher um módulo preservando um comportamento (bug repro)
wasm-shellExecutar 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
FlagEfeito
-O / -O1..-O4Otimização crescente para velocidade
-OsOtimizar para tamanho
-OzOtimizar agressivamente para tamanho
--enable-FEATUREHabilitar uma proposta wasm (simd, threads, …)
-o FILEArquivo 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
--precomputeDobrar expressões constantes
--simplify-localsReduzir uso de variáveis locais redundantes
--vacuumRemover código claramente morto
--remove-unused-module-elementsRetirar funcs/globais não usados
--flatten / --rereloopReestruturar 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

FerramentaFoco
BinaryenOtimizar/transformar/analisar wasm (nível de compilador)
WABTConverter/inspecionar/validar/descompilar
diswasmDecompilador pseudocódigo
wasm-toolsManipulação de baixo nível Rust

Para RE: use Binaryen para simplificar, WABT/diswasm para ler, e wasm-tools para validar/mutar.

Recursos