diswasm - Decompiler e RE WebAssembly Cheatsheet
diswasm è uno strumento open-source di decompilazione e reverse-engineering per WebAssembly (.wasm). Poiché la logica dell”applicazione viene sempre più spedita come wasm — nei browser, nelle funzioni edge, nei plugin e persino nei malware — gli analisti hanno bisogno di leggerla. diswasm analizza un modulo wasm, disassembla le sue funzioni, recupera la struttura e produce pseudocodice di livello superiore dal bytecode della stack machine, rendendo molto più facile comprendere rispetto al wasm grezzo. Completa il WebAssembly Binary Toolkit (WABT) per un flusso di lavoro RE wasm completo.
Installazione
| Metodo | Come |
|---|
| Dal sorgente | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| Build | segui i passaggi di build del repo (per lingua) |
| Strumenti complementari | accoppia con WABT (wasm2wat) e wasm-tools |
| Verifica | esegui su un .wasm noto e ispeziona l”output |
Comprendre il Wasm Innanzitutto
| Concetto | Significato |
|---|
| Module | L”unità .wasm: funzioni, memoria, tabelle, globali |
| Stack machine | wasm esegue su uno stack operando (nessun registro) |
| WAT | Formato testo di WebAssembly (.wat leggibile dall”uomo) |
| Sezioni | type, import, function, code, data, export, … |
| Tipi | i32, i64, f32, f64 (più tipi di riferimento) |
Flusso di Lavoro di Base
# 1) Ispeziona la struttura con il disassembler di WABT
wasm2wat module.wasm -o module.wat
# 2) Decompila in pseudocodice con diswasm
diswasm module.wasm > module.pseudo
# 3) Leggi le funzioni recuperate e il flusso di controllo
| Passaggio | Strumento | Output |
|---|
| Disassembla | wasm2wat (WABT) | .wat testo (basso livello) |
| Decompila | diswasm | pseudocodice (livello superiore) |
| Stile Objdump | wasm-objdump (WABT) | sezioni/opcodes |
Cosa Recupera diswasm
| Caratteristica | Aiuta con |
|---|
| Confini della funzione | Dove inizia/finisce ogni funzione |
| Flusso di controllo | block/loop/if ricostruiti come codice strutturato |
| Locali/parametri | Variabili digitate per funzione |
| Operazioni di memoria | caricamenti/immagazzinamenti rispetto alla memoria lineare |
| Importazioni/esportazioni | Funzioni host richiamate / funzioni esposte |
Leggere l”Output (Triage)
| Segnale | Cerca |
|---|
| Funzioni host importate | Le chiamate JS/host (env.*) rivelano le capacità |
| Sezione stringa/dati | Costanti incorporate, URL, chiavi |
| Funzioni esportate | I punti di ingresso del modulo |
| Crescita della memoria / operazioni bulk | Spacchettamento o buffer grandi |
| Chiamate indirette | Dispatch della tabella delle funzioni (offuscamento) |
Strumenti Wasm Complementari
| Strumento | Ruolo |
|---|
| diswasm | Decompila wasm → pseudocodice |
WABT (wasm2wat, wasm-objdump) | Disassembla / ispeziona |
| wasm-tools | Manipolazione e validazione Rust di basso livello |
Binaryen (wasm-dis) | Analisi/ottimizzazione a livello di compilatore |
| Ghidra + wasm plugin | Ambiente RE completo |
Flussi di Lavoro Comuni
# Analizza un payload wasm di browser sconosciuto
wasm2wat suspicious.wasm -o suspicious.wat # struttura
diswasm suspicious.wasm > suspicious.c # logica leggibile
grep -iE "fetch|eval|XMLHttp|import" suspicious.wat # capacità
# Confronta due versioni di un modulo wasm
diswasm v1.wasm > v1.pseudo; diswasm v2.wasm > v2.pseudo
diff v1.pseudo v2.pseudo
diswasm vs Altri Approcci
| Aspetto | diswasm | wasm2wat (WABT) | JEB (commerciale) |
|---|
| Livello di output | Pseudocodice | WAT basso livello | Decompiler pseudo-C |
| Costo | Gratuito/open-source | Gratuito/open-source | Commerciale |
| Migliore per | Decompilazione veloce e leggibile | Disassembly fedele | RE profonda e levigata |
Risorse