Binaryen - WebAssembly Compiler & Optimizer Toolchain Cheatsheet
Binaryen - WebAssembly Compiler & Optimizer Toolchain Cheatsheet
Binaryen ist ein Compiler und Toolchain-Infrastruktur-Bibliothek für WebAssembly, geschrieben in C++. Sein Hauptwerkzeug, wasm-opt, lädt ein wasm-Modul in eine Zwischendarstellung und führt Optimierungs- und Transformationspässe aus — die gleichen Maschinen, die Toolchains wie Emscripten verwenden, um wasm zu verkleinern und zu beschleunigen. Für Reverse Engineer machen Binaryens Disassembler (wasm-dis) und seine Analyse-/Transform-Pässe (einschließlich Debfusktation-ähnlicher Vereinfachungen) es zu einem nützlichen Komplement zu WABT.
Installation
| Platform | Command |
|---|---|
| macOS (Homebrew) | brew install binaryen |
| Debian/Ubuntu | sudo apt install binaryen |
| Arch Linux | sudo pacman -S binaryen |
| npm | npm install -g binaryen (JS Bindings) |
| From source | build with CMake from the WebAssembly/binaryen repo |
| Verify | wasm-opt --version |
Core Tools
| Tool | Macht |
|---|---|
wasm-opt | Lade, optimiere/transformiere und re-emittiere ein Modul |
wasm-dis | Disassembliere .wasm → Text |
wasm-as | Assembliere Text → .wasm |
wasm-metadce | Dead-Code-Eliminate über Modul + JS |
wasm-ctor-eval | Evaluiere Konstruktoren zur Build-Zeit |
wasm-reduce | Verkleinere ein Modul während ein Verhalten bewahrt wird (Bug Repro) |
wasm-shell | Führe die Spec Test Shell aus |
Optimizing a Module
# 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 | Effekt |
|---|---|
-O / -O1..-O4 | Zunehmende Optimierung für Geschwindigkeit |
-Os | Optimiere für Größe |
-Oz | Optimiere aggressiv für Größe |
--enable-FEATURE | Aktiviere ein wasm-Proposal (simd, threads, …) |
-o FILE | Ausgabedatei |
Running Individual Passes
wasm-opt stellt viele benannte Pässe zur Verfügung, die du selektiv ausführen kannst — nützlich für RE (Debfuskationscode vereinfachen) sowie für Builds.
# 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 (examples) | Zweck |
|---|---|
--precompute | Falte konstante Ausdrücke |
--simplify-locals | Reduziere redundante Local-Nutzung |
--vacuum | Entferne offensichtlich Toter Code |
--remove-unused-module-elements | Entferne ungenutzte Funcs/Globals |
--flatten / --rereloop | Restrukturiere Kontrollfluss |
Disassemble / Assemble
# Disassemble to Binaryen's text form
wasm-dis module.wasm -o module.wat
# Assemble back
wasm-as module.wat -o module.wasm
RE Use: Simplify Then Read
Ein praktischer Reversing-Trick ist es, Binaryens Vereinfachungspässe auszuführen, um Compiler-/Obfuskator-Rauschen zu bereinigen, dann das Ergebnis zu lesen.
# 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
Minimizing a 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
Großartig zum Isolieren des minimalen wasm, das einen Bug oder ein bestimmtes Verhalten reproduziert.
Binaryen vs Related Tools
| Tool | Fokus |
|---|---|
| Binaryen | Optimiere/Transformiere/Analysiere wasm (Compiler-Grade) |
| WABT | Konvertiere/Inspektiere/Validiere/Dekompiliere |
| diswasm | Pseudocode Decompiler |
| wasm-tools | Rust Low-Level Manipulation |
Für RE: verwende Binaryen zum Vereinfachen, WABT/diswasm zum Lesen, und wasm-tools zum Validieren/Mutieren.