diswasm - Descompilador de WebAssembly e ingeniería inversa
diswasm es una herramienta de descompilación e ingeniería inversa de código abierto para WebAssembly (.wasm). A medida que más lógica de aplicaciones se entrega como wasm — en navegadores, funciones edge, complementos e incluso malware — los analistas necesitan leerlo. diswasm analiza un módulo wasm, desensambia sus funciones, recupera estructura y produce pseudocódigo de más alto nivel a partir del bytecode de máquina de pila, haciendo que sea mucho más fácil de entender que wasm crudo. Complementa el Kit de herramientas binarias de WebAssembly (WABT) para un flujo de trabajo completo de ingeniería inversa de wasm.
Instalación
| Método | Cómo |
|---|
| Desde fuente | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| Compilar | sigue los pasos de compilación del repositorio (por lenguaje) |
| Herramientas complementarias | empareja con WABT (wasm2wat) y wasm-tools |
| Verificar | ejecuta contra un .wasm conocido e inspecciona la salida |
Entender wasm primero
| Concepto | Significado |
|---|
| Módulo | La unidad .wasm: funciones, memoria, tablas, globales |
| Máquina de pila | wasm se ejecuta en una pila operativa (sin registros) |
| WAT | Formato de texto de WebAssembly (.wat legible por humanos) |
| Secciones | tipo, importación, función, código, datos, exportación, … |
| Tipos | i32, i64, f32, f64 (más tipos de referencia) |
Flujo de trabajo básico
# 1) Inspecciona estructura con el desasemblador de WABT
wasm2wat module.wasm -o module.wat
# 2) Descompila a pseudocódigo con diswasm
diswasm module.wasm > module.pseudo
# 3) Lee las funciones recuperadas y el flujo de control
| Paso | Herramienta | Salida |
|---|
| Desensambia | wasm2wat (WABT) | .wat texto (bajo nivel) |
| Descompila | diswasm | pseudocódigo (nivel más alto) |
| Estilo Objdump | wasm-objdump (WABT) | secciones/opcodes |
Qué recupera diswasm
| Característica | Ayuda con |
|---|
| Límites de función | Dónde comienza/termina cada función |
| Flujo de control | block/loop/if reconstruidos como código estructurado |
| Locales/parámetros | Variables tipadas por función |
| Operaciones de memoria | cargas/almacenamientos contra memoria lineal |
| Importaciones/exportaciones | Funciones de host llamadas / funciones expuestas |
Leyendo la salida (Triaje)
| Señal | Busca |
|---|
| Funciones de host importadas | Llamadas a JS/host (env.*) revelan capacidades |
| Sección de string/datos | Constantes incrustadas, URLs, claves |
| Funciones exportadas | Los puntos de entrada del módulo |
| Crecimiento de memoria / operaciones masivas | Desempaquetamiento o búferes grandes |
| Llamadas indirectas | Despacho de tabla de funciones (ofuscación) |
Herramientas complementarias de wasm
| Herramienta | Rol |
|---|
| diswasm | Descompila wasm → pseudocódigo |
WABT (wasm2wat, wasm-objdump) | Desensambia / inspecciona |
| wasm-tools | Manipulación Rust de bajo nivel/validación |
Binaryen (wasm-dis) | Análisis/optimización de calidad de compilador |
| Ghidra + complemento wasm | Entorno de ingeniería inversa completo |
Flujos de trabajo comunes
# Analiza una carga útil wasm desconocida de navegador
wasm2wat suspicious.wasm -o suspicious.wat # estructura
diswasm suspicious.wasm > suspicious.c # lógica legible
grep -iE "fetch|eval|XMLHttp|import" suspicious.wat # capacidades
# Compara dos versiones de un módulo wasm
diswasm v1.wasm > v1.pseudo; diswasm v2.wasm > v2.pseudo
diff v1.pseudo v2.pseudo
diswasm vs otros enfoques
| Aspecto | diswasm | wasm2wat (WABT) | JEB (comercial) |
|---|
| Nivel de salida | Pseudocódigo | WAT bajo nivel | Descompilador pseudo-C |
| Costo | Gratuito/código abierto | Gratuito/código abierto | Comercial |
| Mejor para | Descompilación rápida legible | Desasambly fiel | Ingeniería inversa profunda pulida |
Recursos