diswasm - WebAssembly Decompiler & RE Cheatsheet
diswasm ist ein Open-Source-Decompiler und Reverse-Engineering-Werkzeug für WebAssembly (.wasm) Binärdateien. Da immer mehr Anwendungslogik als wasm ausgeliefert wird — in Browsern, Edge-Funktionen, Plugins und sogar Malware — brauchen Analysten, um sie zu lesen. diswasm parst ein wasm-Modul, disassembliert seine Funktionen, recuperiert die Struktur und produziert höheres Pseudocode aus dem Stack-Machine-Bytecode, wodurch es viel leichter zu verstehen ist als rohes wasm. Es ergänzt das WebAssembly Binary Toolkit (WABT) für einen vollständigen wasm RE-Workflow.
Installation
| Method | How |
|---|
| From source | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| Build | Folge den Bauschritte des Repos (pro Sprache) |
| Companion tools | pair with WABT (wasm2wat) and wasm-tools |
| Verify | run against a known .wasm and inspect output |
Understanding wasm First
| Concept | Bedeutung |
|---|
| Module | Die .wasm Einheit: Funktionen, Speicher, Tabellen, Globals |
| Stack machine | wasm führt auf einem Operand-Stack aus (keine Register) |
| WAT | WebAssembly Text Format (menschenlesbarer .wat) |
| Sections | Type, Import, Function, Code, Data, Export, … |
| Types | i32, i64, f32, f64 (plus Referenztypen) |
Basic Workflow
# 1) Inspect structure with WABT's disassembler
wasm2wat module.wasm -o module.wat
# 2) Decompile to pseudocode with diswasm
diswasm module.wasm > module.pseudo
# 3) Read the recovered functions and control flow
| Step | Tool | Output |
|---|
| Disassemble | wasm2wat (WABT) | .wat text (Low-Level) |
| Decompile | diswasm | Pseudocode (Higher-Level) |
| Objdump-style | wasm-objdump (WABT) | Sections/Opcodes |
What diswasm Recovers
| Feature | Hilft bei |
|---|
| Function boundaries | Wo jede Funktion beginnt/endet |
| Control flow | block/loop/if in strukturierten Code rekonstruiert |
| Locals/params | Typisierte Variablen pro Funktion |
| Memory ops | Loads/Stores gegen linearen Speicher |
| Imports/exports | Host-Funktionen aufgerufen / Funktionen verfügbar gemacht |
Reading the Output (Triage)
| Signal | Look for |
|---|
| Imported host functions | JS/Host-Aufrufe (env.*) enthüllen Fähigkeiten |
| String/data section | Eingebettete Konstanten, URLs, Keys |
| Exported functions | Die Einstiegspunkte des Moduls |
| Memory growth / bulk ops | Entpacken oder große Puffer |
| Indirect calls | Function-Table-Verteilung (Obfuskation) |
| Tool | Rolle |
|---|
| diswasm | Decompile wasm → Pseudocode |
WABT (wasm2wat, wasm-objdump) | Disassemble / Inspect |
| wasm-tools | Rust Low-Level Manipulation/Validation |
Binaryen (wasm-dis) | Compiler-Grade Analyse/Optimierung |
| Ghidra + wasm plugin | Vollständige RE-Umgebung |
Common Workflows
# Analyze an unknown browser wasm payload
wasm2wat suspicious.wasm -o suspicious.wat # structure
diswasm suspicious.wasm > suspicious.c # readable logic
grep -iE "fetch|eval|XMLHttp|import" suspicious.wat # capabilities
# Compare two versions of a wasm module
diswasm v1.wasm > v1.pseudo; diswasm v2.wasm > v2.pseudo
diff v1.pseudo v2.pseudo
diswasm vs Other Approaches
| Aspect | diswasm | wasm2wat (WABT) | JEB (commercial) |
|---|
| Output level | Pseudocode | Low-Level WAT | Pseudo-C Decompiler |
| Cost | Free/Open-Source | Free/Open-Source | Kommerziell |
| Best for | Schnelle lesbare Dekompilierung | Treue Disassembly | Tiefe, polierte RE |
Resources