Utilia

WebAssembly дизасемблер

Преобразувайте двоичен файл .wasm в четим текст WAT, валидирайте го и прегледайте секциите, импортите, експортите и функциите му, без да изпълнявате модула.

Модулът само се чете и преобразува в текст: никога не се компилира, инстанцира или изпълнява.

Как да преобразувате WASM в WAT

  1. Пуснете файл .wasm в зоната за пускане или щракнете върху нея, за да изберете такъв (до 20 МБ). Можете да натиснете и Зареди примерен модул, за да видите малка демонстрация.
  2. Инструментът проверява двоичния файл, валидира го и показва резултата: ✓ Модулът е валиден. или причината, поради която не е.
  3. Прочетете броячите: Функции (импортирани и дефинирани), Импорти, Експорти, Типове, Памети, Таблици и Глобални променливи.
  4. Прочетете дизасемблирания код в Текстов формат на WebAssembly (WAT), после го Копирай или натиснете Изтегли .wat.
  5. Настройте изхода с опциите: Използвай имената от секцията name, Сгънати изрази (S-изрази) и Вградени експорти.
  6. Отворете таблиците Секции, Импорти и Експорти за структурата на файла: всяка секция с байтовото си отместване, размер и брой записи.

Модулът никога не се компилира, инстанцира или изпълнява. Инструментът само чете байтовете му и ги превръща в текст, така че е безопасно да разглеждате файл, на който не се доверявате.

Какво показва изходът WAT

WebAssembly има два еквивалентни формата: компактния двоичен .wasm, който браузърите и средите за изпълнение зареждат, и текстовия формат .wat, предназначен за хора. Дизасемблерът изписва всяка част на модула в текстова форма: типове на функции, импорти, тела на функции, таблици, памети, глобални променливи, експорти, стартовата функция, елементни сегменти и сегменти с данни.

По подразбиране инструкциите са изброени по една на ред в реда на стека, както се съхраняват:

(func $add (param $a i32) (param $b i32) (result i32)
  local.get $a
  local.get $b
  i32.add)

С Сгънати изрази (S-изрази) операндите са вложени в инструкцията, която ги използва, като в (i32.add (local.get $a) (local.get $b)), което често е по-лесно за проследяване. Вградени експорти записва (export "add") вътре във функцията, вместо в отделен списък.

Имена, информация за отстраняване на грешки и валидиране

Файлът .wasm се обръща към всичко по индекс. Когато компилаторът е запазил персонална секция name (обичайно при debug компилации), Използвай имената от секцията name показва първоначалните имена като $factorial. Иначе wabt генерира имена като $f2 или $t0, за да остане текстът четим. Производствените компилации често са лишени от имена, така че умален модул ще показва само генерирани имена.

Валидирането следва спецификацията на WebAssembly: типовете трябва да съвпадат в стека на операндите, индексите трябва да съществуват и т.н. Невалиден модул пак се дизасемблира, когато структурата му може да се прочете, със съобщението за грешка до него, което помага при отстраняване на грешки в компилатор или написан на ръка двоичен файл. Възможностите след MVP като SIMD, нишки, групови операции с памет, референтни типове, множество върнати стойности, tail calls, обработка на изключения, memory64 и garbage collection са включени за четене.

Този инструмент използва wabt.js, JavaScript компилацията на WebAssembly Binary Toolkit (wasm2wat). Зарежда се само когато отворите файл.

Често задавани въпроси

Мога ли да получа обратно оригиналния код на C, C++ или Rust?

Не. WAT е четима форма на компилирания двоичен файл, а не декомпилатор: изходният код, коментарите и по-голямата част от информацията за типовете изчезват след компилацията. Имената на функциите оцеляват само ако секцията name е запазена.

Качва ли се файлът ми?

Не. Файлът се чете и дизасемблира във вашия браузър; нищо не се изпраща към сървър.

Защо инструментът казва, че файлът не е двоичен файл на WebAssembly?

Всеки модул започва с четирите байта \0asm, следвани от версия 1. Файл с различно съдържание, компресиран с gzip или Brotli, или компонент на WebAssembly (по-новият компонентен модел) ще бъде отхвърлен.

Защо текстовото поле е съкратено?

Много големи модули могат да дадат милиони редове. Текстовото поле показва първата част, за да остане страницата отзивчива; Изтегли .wat запазва целия текст.

Мога ли да изпълня или тествам модула тук?

Не. Модулът нарочно никога не се инстанцира, така че кодът му не може да се изпълни в страницата. За да го тествате, заредете го в собствения си проект или в среда като wasmtime или Node.js.