Ir al contenido

diswasm - Descompilador de WebAssembly e ingeniería inversa

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étodoCómo
Desde fuentegit clone https://github.com/wasmkit/diswasm && cd diswasm
Compilarsigue los pasos de compilación del repositorio (por lenguaje)
Herramientas complementariasempareja con WABT (wasm2wat) y wasm-tools
Verificarejecuta contra un .wasm conocido e inspecciona la salida

Entender wasm primero

ConceptoSignificado
MóduloLa unidad .wasm: funciones, memoria, tablas, globales
Máquina de pilawasm se ejecuta en una pila operativa (sin registros)
WATFormato de texto de WebAssembly (.wat legible por humanos)
Seccionestipo, importación, función, código, datos, exportación, …
Tiposi32, 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
PasoHerramientaSalida
Desensambiawasm2wat (WABT).wat texto (bajo nivel)
Descompiladiswasmpseudocódigo (nivel más alto)
Estilo Objdumpwasm-objdump (WABT)secciones/opcodes

Qué recupera diswasm

CaracterísticaAyuda con
Límites de funciónDónde comienza/termina cada función
Flujo de controlblock/loop/if reconstruidos como código estructurado
Locales/parámetrosVariables tipadas por función
Operaciones de memoriacargas/almacenamientos contra memoria lineal
Importaciones/exportacionesFunciones de host llamadas / funciones expuestas

Leyendo la salida (Triaje)

SeñalBusca
Funciones de host importadasLlamadas a JS/host (env.*) revelan capacidades
Sección de string/datosConstantes incrustadas, URLs, claves
Funciones exportadasLos puntos de entrada del módulo
Crecimiento de memoria / operaciones masivasDesempaquetamiento o búferes grandes
Llamadas indirectasDespacho de tabla de funciones (ofuscación)

Herramientas complementarias de wasm

HerramientaRol
diswasmDescompila wasm → pseudocódigo
WABT (wasm2wat, wasm-objdump)Desensambia / inspecciona
wasm-toolsManipulación Rust de bajo nivel/validación
Binaryen (wasm-dis)Análisis/optimización de calidad de compilador
Ghidra + complemento wasmEntorno 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

Aspectodiswasmwasm2wat (WABT)JEB (comercial)
Nivel de salidaPseudocódigoWAT bajo nivelDescompilador pseudo-C
CostoGratuito/código abiertoGratuito/código abiertoComercial
Mejor paraDescompilación rápida legibleDesasambly fielIngeniería inversa profunda pulida

Recursos