diswasm - Décompilateur et RE WebAssembly
diswasm est un outil open-source de décompilation et d’ingénierie inverse pour WebAssembly (fichiers .wasm). Alors que de plus en plus de logiques d’application sont expédiées en tant que wasm — dans les navigateurs, les fonctions périphériques, les modules et même les maliciels — les analystes ont besoin de le lire. diswasm analyse un module wasm, désassemble ses fonctions, récupère la structure et produit du pseudocode de haut niveau à partir du bytecode machine à pile, ce qui le rend beaucoup plus facile à comprendre que le wasm brut. Il complète le Web Assembly Binary Toolkit (WABT) pour un flux de travail complet d’ingénierie inverse wasm.
Installation
| Méthode | Comment |
|---|
| Depuis la source | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| Build | suivre les étapes de build du dépôt (par langage) |
| Outils complémentaires | appairer avec WABT (wasm2wat) et wasm-tools |
| Vérifier | exécuter sur un .wasm connu et inspecter la sortie |
Comprendre d’abord le wasm
| Concept | Sens |
|---|
| Module | L’unité .wasm : fonctions, mémoire, tables, globales |
| Machine à pile | wasm s’exécute sur une pile opérande (pas de registres) |
| WAT | Format texte WebAssembly (lisible .wat) |
| Sections | type, import, function, code, data, export, … |
| Types | i32, i64, f32, f64 (plus types de référence) |
Flux de travail basique
# 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
| Étape | Outil | Sortie |
|---|
| Désassembler | wasm2wat (WABT) | .wat texte (bas niveau) |
| Décompiler | diswasm | pseudocode (niveau supérieur) |
| Style Objdump | wasm-objdump (WABT) | sections/opcodes |
Ce que diswasm récupère
| Caractéristique | Aide avec |
|---|
| Limites des fonctions | Où chaque fonction commence/finit |
| Flux de contrôle | block/loop/if reconstruit en code structuré |
| Locales/paramètres | Variables typées par fonction |
| Opérations mémoire | Chargements/stockages contre la mémoire linéaire |
| Imports/exports | Fonctions hôtes appelées / fonctions exposées |
Lecture de la sortie (Triage)
| Signal | Chercher |
|---|
| Fonctions hôtes importées | Les appels JS/hôte (env.*) révèlent les capacités |
| Section chaîne/données | Constantes intégrées, URL, clés |
| Fonctions exportées | Les points d’entrée du module |
| Croissance mémoire / opérations en masse | Déballage ou grands tampons |
| Appels indirects | Dispatch table de fonctions (obfuscation) |
Outils complémentaires wasm
| Outil | Rôle |
|---|
| diswasm | Décompiler wasm → pseudocode |
WABT (wasm2wat, wasm-objdump) | Désassembler / inspecter |
| wasm-tools | Manipulation/validation bas niveau Rust |
Binaryen (wasm-dis) | Analyse/optimisation de qualité compilateur |
| Ghidra + plugin wasm | Environnement RE complet |
Flux de travail courants
# 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 autres approches
| Aspect | diswasm | wasm2wat (WABT) | JEB (commercial) |
|---|
| Niveau de sortie | Pseudocode | WAT bas niveau | Décompilateur pseudo-C |
| Coût | Gratuit/open-source | Gratuit/open-source | Commercial |
| Meilleur pour | Décompilation lisible rapide | Désassemblage fidèle | RE profonde et polie |
Ressources