diswasm - Decompilador WebAssembly & Cheatsheet de RE
diswasm é uma ferramenta de código aberto decompilador e engenharia reversa para WebAssembly (.wasm) binários. Com mais lógica de aplicativo sendo enviada como wasm — em navegadores, funções de borda, plugins e até malware — os analistas precisam lê-lo. diswasm analisa um módulo wasm, desassentar suas funções, recupera estrutura e produz pseudocódigo de nível superior do bytecode da máquina de pilha, tornando muito mais fácil de entender do que wasm bruto. Complementa o WebAssembly Binary Toolkit (WABT) para um fluxo de trabalho wasm RE completo.
Instalação
| Método | Como |
|---|
| From source | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| Build | siga as etapas de compilação do repo (por idioma) |
| Companion tools | emparelhe com WABT (wasm2wat) e wasm-tools |
| Verify | execute contra um .wasm conhecido e inspecione a saída |
Compreendendo wasm Primeiro
| Conceito | Significado |
|---|
| Module | A unidade .wasm: funções, memória, tabelas, globais |
| Stack machine | wasm executa em uma pilha operacional (sem registros) |
| WAT | Formato de texto WebAssembly (.wat legível por humanos) |
| Sections | type, import, function, code, data, export, … |
| Types | i32, i64, f32, f64 (mais tipos de referência) |
Fluxo de Trabalho Básico
# 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
| Passo | Ferramenta | Saída |
|---|
| Disassemble | wasm2wat (WABT) | .wat text (baixo nível) |
| Decompile | diswasm | pseudocódigo (nível mais alto) |
| Objdump-style | wasm-objdump (WABT) | seções/opcodes |
O Que diswasm Recupera
| Recurso | Ajuda com |
|---|
| Function boundaries | Onde cada função começa/termina |
| Control flow | block/loop/if reconstruído como código estruturado |
| Locals/params | Variáveis digitadas por função |
| Memory ops | carregamentos/armazenamentos contra memória linear |
| Imports/exports | Funções de host chamadas / funções expostas |
Lendo a Saída (Triagem)
| Sinal | Procure |
|---|
| Imported host functions | Chamadas JS/host (env.*) revelam capacidades |
| String/data section | Constantes incorporadas, URLs, chaves |
| Exported functions | Os pontos de entrada do módulo |
| Memory growth / bulk ops | Desempacotamento ou buffers grandes |
| Indirect calls | Despacho de tabela de funções (ofuscação) |
Ferramentas wasm Complementares
| Ferramenta | Função |
|---|
| diswasm | Decompile wasm → pseudocódigo |
WABT (wasm2wat, wasm-objdump) | Desassentar / inspecionar |
| wasm-tools | Manipulação de baixo nível Rust/validação |
Binaryen (wasm-dis) | Análise/otimização de nível de compilador |
| Ghidra + wasm plugin | Ambiente de RE completo |
Fluxos de Trabalho Comuns
# 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 Outras Abordagens
| Aspecto | diswasm | wasm2wat (WABT) | JEB (comercial) |
|---|
| Nível de saída | Pseudocódigo | WAT de baixo nível | Decompilador pseudo-C |
| Custo | Gratuito/código aberto | Gratuito/código aberto | Comercial |
| Melhor para | Descompilação rápida legível | Desassemblagem fiel | RE profundo e refinado |
Recursos