Ir al contenido

Binaryen - Kit de herramientas compilador y optimizador de WebAssembly

Binaryen - Kit de herramientas compilador y optimizador de WebAssembly

Binaryen es una biblioteca de infraestructura compilador y conjunto de herramientas para WebAssembly, escrita en C++. Su herramienta estrella, wasm-opt, carga un módulo wasm en una representación intermedia y ejecuta pasadas de optimización y transformación sobre ella — el mismo mecanismo que usan conjuntos de herramientas como Emscripten para reducir y acelerar wasm. Para ingenieros inversos, el desasemblador de Binaryen (wasm-dis) y sus pasadas de análisis/transformación (incluyendo simplificaciones adyacentes a desofuscación) lo hacen un complemento útil a WABT.

Instalación

PlataformaComando
macOS (Homebrew)brew install binaryen
Debian/Ubuntusudo apt install binaryen
Arch Linuxsudo pacman -S binaryen
npmnpm install -g binaryen (enlaces de JS)
Desde fuentecompilar con CMake desde el repositorio de WebAssembly/binaryen
Verificarwasm-opt --version

Herramientas principales

HerramientaHace
wasm-optCarga, optimiza/transforma y re-emite un módulo
wasm-disDesensambia .wasm → texto
wasm-asEnsambla texto → .wasm
wasm-metadceEliminación de código muerto entre módulo + JS
wasm-ctor-evalEvalúa constructores en tiempo de compilación
wasm-reduceReduce un módulo mientras preserva un comportamiento (repro de bug)
wasm-shellEjecuta la shell de prueba de especificaciones

Optimizando un módulo

# Optimiza para tamaño y velocidad
wasm-opt -O3 module.wasm -o module.opt.wasm

# Optimiza agresivamente para tamaño
wasm-opt -Oz module.wasm -o module.small.wasm
BanderaEfecto
-O / -O1..-O4Optimización creciente para velocidad
-OsOptimiza para tamaño
-OzOptimiza agresivamente para tamaño
--enable-FEATUREHabilita una propuesta de wasm (simd, threads, …)
-o FILEArchivo de salida

Ejecutar pasadas individuales

wasm-opt expone muchas pasadas nombradas que puedes ejecutar selectivamente — útil para ingeniería inversa (simplificar código ofuscado) así como compilaciones.

# Lista todas las pasadas disponibles
wasm-opt --help | grep -A2 "passes:"

# Ejecuta pasadas específicas (por ejemplo, simplificar + eliminar no usado)
wasm-opt module.wasm --precompute --simplify-locals \
  --remove-unused-names --vacuum -o clean.wasm
Pasada (ejemplos)Propósito
--precomputePliega expresiones constantes
--simplify-localsReduce el uso local redundante
--vacuumElimina código obviamente muerto
--remove-unused-module-elementsElimina funciones/globales sin usar
--flatten / --rereloopReestructura el flujo de control

Desensambia / Ensambla

# Desensambia a la forma de texto de Binaryen
wasm-dis module.wasm -o module.wat

# Ensambla de vuelta
wasm-as module.wat -o module.wasm

Uso de ingeniería inversa: Simplificar luego leer

Un truco práctico de reversing es ejecutar las pasadas de simplificación de Binaryen para limpiar el ruido del compilador/ofuscador, luego leer el resultado.

# Simplifica un módulo complicado, luego descompila con WABT
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp

Minimizando un repro (wasm-reduce)

# Reduce un módulo mientras un script aún reporta el comportamiento de interés
wasm-reduce big.wasm --command "node check.js" -o small.wasm

Excelente para aislar el wasm mínimo que desencadena un bug o un comportamiento específico.

Binaryen vs herramientas relacionadas

HerramientaEnfoque
BinaryenOptimiza/transforma/analiza wasm (calidad de compilador)
WABTConvierte/inspecciona/valida/descompila
diswasmDescompilador de pseudocódigo
wasm-toolsManipulación Rust de bajo nivel

Para ingeniería inversa: usa Binaryen para simplificar, WABT/diswasm para leer, y wasm-tools para validar/mutar.

Recursos