Salta ai contenuti

Binaryen - WebAssembly Compiler & Optimizer Toolchain Cheatsheet

Binaryen - WebAssembly Compiler & Optimizer Toolchain Cheatsheet

Binaryen è una libreria di infrastruttura del compilatore e della toolchain per WebAssembly, scritta in C++. Il suo strumento principale, wasm-opt, carica un modulo wasm in una rappresentazione intermedia ed esegue pass di ottimizzazione e trasformazione — la stessa macchinaria che le toolchain come Emscripten usano per ridurre e velocizzare wasm. Per i reverse engineer, il disassembler di Binaryen (wasm-dis) e i suoi pass di analisi/trasformazione (inclusa le semplificazioni adiacenti alla de-offuscazione) lo rendono un utile complemento a WABT.

Installazione

PiattaformaComando
macOS (Homebrew)brew install binaryen
Debian/Ubuntusudo apt install binaryen
Arch Linuxsudo pacman -S binaryen
npmnpm install -g binaryen (binding JS)
Dal sorgentecompila con CMake dal repository WebAssembly/binaryen
Verificawasm-opt --version

Strumenti Principali

StrumentoFa
wasm-optCarica, ottimizza/trasforma e ri-emetti un modulo
wasm-disDisassembla .wasm → testo
wasm-asAssembla testo → .wasm
wasm-metadceDead-code-eliminate attraverso modulo + JS
wasm-ctor-evalValuta i costruttori al momento della compilazione
wasm-reduceRimpicciolisci un modulo preservando un comportamento (riprouzione bug)
wasm-shellEsegui la shell del test spec

Ottimizzazione di un Modulo

# Ottimizza per dimensione e velocità
wasm-opt -O3 module.wasm -o module.opt.wasm

# Ottimizza aggressivamente per dimensione
wasm-opt -Oz module.wasm -o module.small.wasm
FlagEffetto
-O / -O1..-O4Ottimizzazione crescente per velocità
-OsOttimizza per dimensione
-OzOttimizza aggressivamente per dimensione
--enable-FEATUREAbilita una proposta wasm (simd, thread, …)
-o FILEFile di output

Esecuzione dei Pass Individuali

wasm-opt espone molti pass nominati che puoi eseguire selettivamente — utile per RE (semplificazione del codice offuscato) così come per la compilazione.

# Elenca tutti i pass disponibili
wasm-opt --help | grep -A2 "passes:"

# Esegui pass specifici (ad es. semplificazione + rimozione non utilizzati)
wasm-opt module.wasm --precompute --simplify-locals \
  --remove-unused-names --vacuum -o clean.wasm
Pass (esempi)Scopo
--precomputePiega le espressioni costanti
--simplify-localsRiduci l”utilizzo locale ridondante
--vacuumRimuovi il codice ovviamente morto
--remove-unused-module-elementsRimuovi funzioni/globali non utilizzate
--flatten / --rereloopRistruttura il flusso di controllo

Disassembla / Assembla

# Disassembla nella forma di testo di Binaryen
wasm-dis module.wasm -o module.wat

# Assembla indietro
wasm-as module.wat -o module.wasm

Uso RE: Semplifica Poi Leggi

Un trucco pratico di reversing è eseguire i pass di semplificazione di Binaryen per ripulire il rumore del compilatore/offuscatore, quindi leggere il risultato.

# Semplifica un modulo complicato, quindi decompila con WABT
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp

Minimizzazione di una Riprouzione (wasm-reduce)

# Rimpicciolisci un modulo mentre uno script riporta ancora il comportamento di interesse
wasm-reduce big.wasm --command "node check.js" -o small.wasm

Ottimo per isolare il minimo wasm che attiva un bug o un comportamento specifico.

Binaryen vs Strumenti Correlati

StrumentoFocus
BinaryenOttimizza/trasforma/analizza wasm (a livello di compilatore)
WABTConverte/ispeziona/convalida/decompila
diswasmDecompiler pseudocodice
wasm-toolsManipolazione Rust di basso livello

Per RE: usa Binaryen per semplificare, WABT/diswasm per leggere, e wasm-tools per convalidare/mutare.

Risorse