Desassemblador WebAssembly
Converte um binário .wasm em texto WAT legível, valida-o e lista secções, importações, exportações e funções no navegador, sem executar o módulo.
O módulo é apenas lido e convertido em texto: nunca é compilado, instanciado nem executado.
- Tamanho
- –
- Funções
- –
- Importações
- –
- Exportações
- –
- Tipos
- –
- Memórias
- –
- Tabelas
- –
- Globais
- –
Secções
| Secção | Deslocamento | Tamanho | Entradas |
|---|
Importações
| Módulo | Nome | Tipo | Detalhes |
|---|
Exportações
| Nome | Tipo | Índice |
|---|
Como converter WASM em WAT
- Larga um ficheiro
.wasmna zona de largar ficheiros ou clica nela para escolher um (até 20 MB). Também podes carregar em Carregar um módulo de exemplo para ver uma pequena demonstração. - A ferramenta analisa o binário, valida-o e mostra o resultado: ✓ O módulo é válido., ou o motivo pelo qual não é.
- Consulta os contadores: Funções (importadas e definidas), Importações, Exportações, Tipos, Memórias, Tabelas e Globais.
- Lê a desmontagem em Formato de texto WebAssembly (WAT) e depois Copiar ou Transferir .wat.
- Ajusta o resultado com as opções Usar os nomes da secção name, Expressões aninhadas (S-expressions) e Exportações em linha.
- Abre as tabelas Secções, Importações e Exportações para ver a estrutura do ficheiro: cada secção com o seu deslocamento em bytes, o tamanho e o número de entradas.
O módulo nunca é compilado, instanciado nem executado. A ferramenta limita-se a ler os bytes e a transformá-los em texto, por isso podes inspecionar com segurança um ficheiro em que não confias.
O que mostra o resultado WAT
O WebAssembly tem dois formatos equivalentes: o binário compacto .wasm, que os navegadores e os runtimes carregam, e o formato de texto .wat, pensado para ser lido por pessoas. O desassemblador escreve em texto todas as partes do módulo: tipos de função, importações, corpos das funções, tabelas, memórias, globais, exportações, a função de arranque, os segmentos de elementos e os segmentos de dados.
Por omissão, as instruções aparecem uma por linha, pela ordem da pilha, tal como estão guardadas:
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
Com Expressões aninhadas (S-expressions), os operandos ficam dentro da instrução que os usa, como em (i32.add (local.get $a) (local.get $b)), o que muitas vezes é mais fácil de seguir. Exportações em linha escreve (export "add") dentro da própria função em vez de numa lista à parte.
Nomes, informação de depuração e validação
Um ficheiro .wasm refere-se a tudo por índice. Quando o compilador manteve uma secção personalizada name (habitual em compilações de depuração), Usar os nomes da secção name mostra os nomes originais, como $factorial. Caso contrário, o wabt gera nomes como $f2 ou $t0 para que o texto continue legível. As compilações de produção costumam ter os nomes removidos, por isso um módulo minificado mostra apenas nomes gerados.
A validação segue a especificação WebAssembly: os tipos têm de bater certo na pilha de operandos, os índices têm de existir, e assim por diante. Um módulo inválido é desassemblado na mesma desde que a sua estrutura possa ser lida, com o erro de validação ao lado, o que ajuda quando estás a depurar um compilador ou um binário escrito à mão. As funcionalidades posteriores ao MVP, como SIMD, threads, bulk memory, reference types, multi-value, tail calls, tratamento de exceções, memory64 e garbage collection, estão ativadas para leitura.
Esta ferramenta usa o wabt.js, a versão JavaScript do WebAssembly Binary Toolkit (wasm2wat). Só é carregado quando abres um ficheiro.
Perguntas frequentes
Posso recuperar o código-fonte original em C, C++ ou Rust?
Não. O WAT é uma forma legível do binário compilado, não um descompilador: o código-fonte, os comentários e a maior parte da informação de tipos perdem-se na compilação. Os nomes das funções só sobrevivem se a secção name tiver sido mantida.
O meu ficheiro é enviado para algum servidor?
Não. O ficheiro é lido e desassemblado no teu navegador; nada é enviado para um servidor.
Porque é que a ferramenta diz que o ficheiro não é um binário WebAssembly?
Todos os módulos começam pelos quatro bytes \0asm, seguidos da versão 1. Um ficheiro servido com outro conteúdo, comprimido com gzip ou Brotli, ou um componente WebAssembly (o modelo de componentes mais recente) é rejeitado.
Porque é que a caixa de texto aparece cortada?
Módulos muito grandes podem gerar milhões de linhas. A caixa de texto mostra apenas a primeira parte para manter a página fluida; Transferir .wat guarda o texto completo.
Posso executar ou testar o módulo aqui?
Não. O módulo nunca é instanciado, de propósito, para que o seu código não possa correr na página. Para o testar, carrega-o no teu próprio projeto ou num runtime como o wasmtime ou o Node.js.
Ferramentas relacionadas
- Explorador de AST JavaScript Cola JavaScript e explora a árvore sintática abstrata (ESTree, gerada pelo Acorn) no navegador. Clica nos nós para ver o código e exporta a AST em JSON.
- Gerador de hash Gera hashes MD5, SHA-1, SHA-256 e SHA-512 de texto ou de ficheiros de qualquer tamanho e verifica checksums. Tudo corre no teu navegador.
- Codificador e descodificador Base64 Codifica e descodifica Base64 online, com suporte completo de UTF-8 e a opção base64url segura para URL. Tudo no teu navegador, nada é enviado.