WABT - Boîte à outils binaires WebAssembly
WABT (prononcé « wabbit ») est le Web Assembly Binary Toolkit de référence — une suite d’outils en ligne de commande pour travailler avec wasm à bas niveau. Il convertit entre le format binaire .wasm et le format texte lisible .wat (WebAssembly Text), désassemble et vide les modules, les valide, produit une décompilation de type C et interprète/exécute wasm. C’est la boîte à outils fondamentale pour le développement wasm et l’ingénierie inverse.
Installation
| Plateforme | Commande |
|---|
| macOS (Homebrew) | brew install wabt |
| Debian/Ubuntu | sudo apt install wabt |
| Arch Linux | sudo pacman -S wabt |
| npm | npm install -g wabt |
| Depuis la source | construire avec CMake à partir du dépôt WebAssembly/wabt |
| Vérifier | wat2wasm --version |
Les outils principaux
| Outil | Convertit / fait |
|---|
wat2wasm | Texte .wat → binaire .wasm |
wasm2wat | Binaire .wasm → texte .wat (désassembler) |
wasm-objdump | Vider les sections, opcodes, symboles |
wasm-decompile | Produire du pseudocode lisible de type C |
wasm-validate | Valider un module |
wasm-interp | Interpréter/exécuter un module (machine à pile) |
wasm2c | Convertir wasm → source C |
wasm-strip | Supprimer les sections (par ex. noms) d’un module |
Texte ↔ Binaire
# Assemble text to binary
wat2wasm module.wat -o module.wasm
# Disassemble binary to text (the RE starting point)
wasm2wat module.wasm -o module.wat
# Keep debug names / custom sections while disassembling
wasm2wat --generate-names module.wasm
| Option | Effet |
|---|
-o FILE | Fichier de sortie |
--generate-names | Synthétiser les noms pour les funcs/locales non nommées |
--enable-FEATURE | Activer une proposition wasm (par ex. --enable-threads) |
-v | Verbose |
Inspecting a Module (objdump)
# Full section + disassembly dump
wasm-objdump -x module.wasm # headers/sections
wasm-objdump -d module.wasm # disassemble code
wasm-objdump -s module.wasm # section contents (hex)
| Drapeau | Affiche |
|---|
-h | En-têtes de section |
-x | Détails de toutes les sections |
-d | Corps de fonction désassemblés |
-s | Contenu brut de la section |
-j SECTION | Limiter à une section |
Décompilation (sortie lisible)
# C-like decompilation — much easier to read than WAT
wasm-decompile module.wasm -o module.dcmp
wasm-decompile reconstruit le flux de contrôle structuré et les locales typées, ce qui en fait un moyen rapide de comprendre ce qu’un module fait lors du triage.
Valider et exécuter
| Commande | Objectif |
|---|
wasm-validate module.wasm | Confirmer que le module est bien formé |
wasm-interp module.wasm --run-all-exports | Exécuter les fonctions exportées |
wasm2c module.wasm -o module.c | Émettre C pour compilation/analyse |
Flux de travail d’ingénierie inverse
# 1) Disassemble with names
wasm2wat --generate-names target.wasm -o target.wat
# 2) Dump imports/exports to understand capabilities
wasm-objdump -x target.wasm | grep -E "import|export"
# 3) Get readable pseudocode
wasm-decompile target.wasm -o target.dcmp
# 4) Hunt for strings/URLs in data sections
wasm-objdump -s target.wasm | less
Drapeaux de caractéristiques (Propositions)
| Drapeau | Active |
|---|
--enable-threads | Threads/atomics |
--enable-simd | SIMD |
--enable-bulk-memory | Opérations de mémoire en masse |
--enable-reference-types | Types de référence |
--enable-all | Toutes les propositions supportées |
Utilisez-les quand un module utilise des fonctionnalités wasm plus récentes et que les outils par défaut la rejettent.
WABT vs outils associés
| Outil | Rôle |
|---|
| WABT | Convertir/inspecter/valider/décompiler wasm |
| diswasm | Décompilateur pseudocode de haut niveau |
| wasm-tools | Manipulation bas niveau Rust |
| Binaryen | Boîte à outils compilateur/optimiseur (wasm-dis, wasm-opt) |
Ressources