Zum Inhalt springen

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

PlatformCommand
macOS (Homebrew)brew install binaryen
Debian/Ubuntusudo apt install binaryen
Arch Linuxsudo pacman -S binaryen
npmnpm install -g binaryen (JS Bindings)
From sourcebuild with CMake from the WebAssembly/binaryen repo
Verifywasm-opt --version

Core Tools

ToolMacht
wasm-optLade, optimiere/transformiere und re-emittiere ein Modul
wasm-disDisassembliere .wasm → Text
wasm-asAssembliere Text → .wasm
wasm-metadceDead-Code-Eliminate über Modul + JS
wasm-ctor-evalEvaluiere Konstruktoren zur Build-Zeit
wasm-reduceVerkleinere ein Modul während ein Verhalten bewahrt wird (Bug Repro)
wasm-shellFü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
FlagEffekt
-O / -O1..-O4Zunehmende Optimierung für Geschwindigkeit
-OsOptimiere für Größe
-OzOptimiere aggressiv für Größe
--enable-FEATUREAktiviere ein wasm-Proposal (simd, threads, …)
-o FILEAusgabedatei

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
--precomputeFalte konstante Ausdrücke
--simplify-localsReduziere redundante Local-Nutzung
--vacuumEntferne offensichtlich Toter Code
--remove-unused-module-elementsEntferne ungenutzte Funcs/Globals
--flatten / --rereloopRestrukturiere 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.

ToolFokus
BinaryenOptimiere/Transformiere/Analysiere wasm (Compiler-Grade)
WABTKonvertiere/Inspektiere/Validiere/Dekompiliere
diswasmPseudocode Decompiler
wasm-toolsRust Low-Level Manipulation

Für RE: verwende Binaryen zum Vereinfachen, WABT/diswasm zum Lesen, und wasm-tools zum Validieren/Mutieren.

Resources