WABT - Kit de herramientas binarias de WebAssembly
WABT (pronunciado “wabbit”) es el Kit de herramientas binarias de WebAssembly de referencia — un conjunto de herramientas de línea de comandos para trabajar con wasm a bajo nivel. Convierte entre el formato binario .wasm y el formato de texto legible por humanos .wat, desensambla y descarga módulos, los valida, produce una descompilación similar a C e interpreta/ejecuta wasm. Es la caja de herramientas fundamental tanto para el desarrollo de wasm como para la ingeniería inversa.
Instalación
| Plataforma | Comando |
|---|
| macOS (Homebrew) | brew install wabt |
| Debian/Ubuntu | sudo apt install wabt |
| Arch Linux | sudo pacman -S wabt |
| npm | npm install -g wabt |
| Desde fuente | compilar con CMake desde el repositorio de WebAssembly/wabt |
| Verificar | wat2wasm --version |
Las herramientas principales
| Herramienta | Convierte / hace |
|---|
wat2wasm | Texto .wat → binario .wasm |
wasm2wat | Binario .wasm → texto .wat (desensambia) |
wasm-objdump | Descarga secciones, opcodes, símbolos |
wasm-decompile | Produce pseudocódigo legible similar a C |
wasm-validate | Valida un módulo |
wasm-interp | Interpreta/ejecuta un módulo (máquina de pila) |
wasm2c | Convierte wasm → código fuente C |
wasm-strip | Elimina secciones (por ejemplo nombres) de un módulo |
Texto ↔ Binario
# Ensambla texto a binario
wat2wasm module.wat -o module.wasm
# Desensambia binario a texto (el punto de partida de la ingeniería inversa)
wasm2wat module.wasm -o module.wat
# Mantén nombres de depuración / secciones personalizadas mientras desensamblias
wasm2wat --generate-names module.wasm
| Opción | Efecto |
|---|
-o FILE | Archivo de salida |
--generate-names | Sintetiza nombres para funciones/locales sin nombre |
--enable-FEATURE | Activa una propuesta de wasm (por ejemplo --enable-threads) |
-v | Detallado |
Inspeccionar un módulo (objdump)
# Volcado completo de sección + desasambly
wasm-objdump -x module.wasm # encabezados/secciones
wasm-objdump -d module.wasm # desensambia código
wasm-objdump -s module.wasm # contenidos de sección (hex)
| Bandera | Muestra |
|---|
-h | Encabezados de sección |
-x | Detalles de todas las secciones |
-d | Cuerpos de funciones desensambados |
-s | Contenidos de sección sin procesar |
-j SECTION | Limita a una sección |
Descompilación (salida legible)
# Descompilación similar a C — mucho más fácil de leer que WAT
wasm-decompile module.wasm -o module.dcmp
wasm-decompile reconstruye el flujo de control estructurado y locales tipados, lo que lo convierte en una forma rápida de entender qué hace un módulo durante el triaje.
Validar y ejecutar
| Comando | Propósito |
|---|
wasm-validate module.wasm | Confirma que el módulo está bien formado |
wasm-interp module.wasm --run-all-exports | Ejecuta funciones exportadas |
wasm2c module.wasm -o module.c | Emite C para compilación/análisis |
Flujo de trabajo de ingeniería inversa
# 1) Desensambia con nombres
wasm2wat --generate-names target.wasm -o target.wat
# 2) Descarga importaciones/exportaciones para entender capacidades
wasm-objdump -x target.wasm | grep -E "import|export"
# 3) Obtén pseudocódigo legible
wasm-decompile target.wasm -o target.dcmp
# 4) Busca strings/URLs en secciones de datos
wasm-objdump -s target.wasm | less
Banderas de características (Propuestas)
| Bandera | Activa |
|---|
--enable-threads | Threads/atomics |
--enable-simd | SIMD |
--enable-bulk-memory | Operaciones de memoria masiva |
--enable-reference-types | Tipos de referencia |
--enable-all | Todas las propuestas soportadas |
Usa estas cuando un módulo use características wasm más nuevas y las herramientas predeterminadas las rechacen.
WABT vs herramientas relacionadas
| Herramienta | Rol |
|---|
| WABT | Convierte/inspecciona/valida/descompila wasm |
| diswasm | Descompilador de pseudocódigo de nivel más alto |
| wasm-tools | Manipulación Rust de bajo nivel |
| Binaryen | Conjunto de herramientas de compilador/optimizador (wasm-dis, wasm-opt) |
Recursos