Zum Inhalt springen

diswasm - WebAssembly Decompiler & RE Cheatsheet

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

MethodHow
From sourcegit clone https://github.com/wasmkit/diswasm && cd diswasm
BuildFolge den Bauschritte des Repos (pro Sprache)
Companion toolspair with WABT (wasm2wat) and wasm-tools
Verifyrun against a known .wasm and inspect output

Understanding wasm First

ConceptBedeutung
ModuleDie .wasm Einheit: Funktionen, Speicher, Tabellen, Globals
Stack machinewasm führt auf einem Operand-Stack aus (keine Register)
WATWebAssembly Text Format (menschenlesbarer .wat)
SectionsType, Import, Function, Code, Data, Export, …
Typesi32, 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
StepToolOutput
Disassemblewasm2wat (WABT).wat text (Low-Level)
DecompilediswasmPseudocode (Higher-Level)
Objdump-stylewasm-objdump (WABT)Sections/Opcodes

What diswasm Recovers

FeatureHilft bei
Function boundariesWo jede Funktion beginnt/endet
Control flowblock/loop/if in strukturierten Code rekonstruiert
Locals/paramsTypisierte Variablen pro Funktion
Memory opsLoads/Stores gegen linearen Speicher
Imports/exportsHost-Funktionen aufgerufen / Funktionen verfügbar gemacht

Reading the Output (Triage)

SignalLook for
Imported host functionsJS/Host-Aufrufe (env.*) enthüllen Fähigkeiten
String/data sectionEingebettete Konstanten, URLs, Keys
Exported functionsDie Einstiegspunkte des Moduls
Memory growth / bulk opsEntpacken oder große Puffer
Indirect callsFunction-Table-Verteilung (Obfuskation)

Complementary wasm Tools

ToolRolle
diswasmDecompile wasm → Pseudocode
WABT (wasm2wat, wasm-objdump)Disassemble / Inspect
wasm-toolsRust Low-Level Manipulation/Validation
Binaryen (wasm-dis)Compiler-Grade Analyse/Optimierung
Ghidra + wasm pluginVollstä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

Aspectdiswasmwasm2wat (WABT)JEB (commercial)
Output levelPseudocodeLow-Level WATPseudo-C Decompiler
CostFree/Open-SourceFree/Open-SourceKommerziell
Best forSchnelle lesbare DekompilierungTreue DisassemblyTiefe, polierte RE

Resources