Aller au contenu

diswasm - Décompilateur et RE WebAssembly

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éthodeComment
Depuis la sourcegit clone https://github.com/wasmkit/diswasm && cd diswasm
Buildsuivre les étapes de build du dépôt (par langage)
Outils complémentairesappairer avec WABT (wasm2wat) et wasm-tools
Vérifierexécuter sur un .wasm connu et inspecter la sortie

Comprendre d’abord le wasm

ConceptSens
ModuleL’unité .wasm : fonctions, mémoire, tables, globales
Machine à pilewasm s’exécute sur une pile opérande (pas de registres)
WATFormat texte WebAssembly (lisible .wat)
Sectionstype, import, function, code, data, export, …
Typesi32, 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
ÉtapeOutilSortie
Désassemblerwasm2wat (WABT).wat texte (bas niveau)
Décompilerdiswasmpseudocode (niveau supérieur)
Style Objdumpwasm-objdump (WABT)sections/opcodes

Ce que diswasm récupère

CaractéristiqueAide avec
Limites des fonctionsOù chaque fonction commence/finit
Flux de contrôleblock/loop/if reconstruit en code structuré
Locales/paramètresVariables typées par fonction
Opérations mémoireChargements/stockages contre la mémoire linéaire
Imports/exportsFonctions hôtes appelées / fonctions exposées

Lecture de la sortie (Triage)

SignalChercher
Fonctions hôtes importéesLes appels JS/hôte (env.*) révèlent les capacités
Section chaîne/donnéesConstantes intégrées, URL, clés
Fonctions exportéesLes points d’entrée du module
Croissance mémoire / opérations en masseDéballage ou grands tampons
Appels indirectsDispatch table de fonctions (obfuscation)

Outils complémentaires wasm

OutilRôle
diswasmDécompiler wasm → pseudocode
WABT (wasm2wat, wasm-objdump)Désassembler / inspecter
wasm-toolsManipulation/validation bas niveau Rust
Binaryen (wasm-dis)Analyse/optimisation de qualité compilateur
Ghidra + plugin wasmEnvironnement 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

Aspectdiswasmwasm2wat (WABT)JEB (commercial)
Niveau de sortiePseudocodeWAT bas niveauDécompilateur pseudo-C
CoûtGratuit/open-sourceGratuit/open-sourceCommercial
Meilleur pourDécompilation lisible rapideDésassemblage fidèleRE profonde et polie

Ressources