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 (поширено в налагоджувальних збірках), параметр Використовувати імена з секції name показує початкові імена, як-от $factorial. Інакше wabt генерує імена на кшталт $f2 чи $t0, щоб текст лишався читабельним. У робочих збірках імена часто вилучають, тож мініфікований модуль покаже лише згенеровані імена.

Валідація відповідає специфікації WebAssembly: типи на стеку операндів мають збігатися, індекси мають існувати тощо. Недійсний модуль усе одно дизасемблюється, якщо його структуру можна прочитати, а поруч показується помилка валідації, що допомагає під час налагодження компілятора чи написаного вручну двійкового файлу. Можливості після MVP, як-от SIMD, потоки, масові операції з пам’яттю, типи посилань, кілька значень, хвостові виклики, обробка винятків, memory64 і збирання сміття, увімкнено для читання.

Цей інструмент використовує wabt.js, збірку WebAssembly Binary Toolkit (wasm2wat) на JavaScript. Вона завантажується лише тоді, коли ви відкриваєте файл.

Поширені запитання

Чи можна відновити початковий код C, C++ або Rust?

Ні. WAT – це читабельна форма скомпільованого двійкового файлу, а не декомпілятор: початковий код, коментарі та більшість інформації про типи зникають після компіляції. Імена функцій зберігаються, лише якщо секцію name було збережено.

Чи завантажується мій файл на сервер?

Ні. Файл читається й дизасемблюється у вашому браузері; нічого не надсилається на сервер.

Чому інструмент каже, що файл не є двійковим файлом WebAssembly?

Кожен модуль починається з чотирьох байтів \0asm, за якими йде версія 1. Файл з іншим вмістом, стиснутий gzip чи Brotli або компонент WebAssembly (новішої моделі компонентів) буде відхилено.

Чому текстове поле обрізано?

Дуже великі модулі можуть давати мільйони рядків. Текстове поле показує першу частину, щоб сторінка лишалася чуйною; Завантажити .wat зберігає повний текст.

Чи можна запускати або тестувати модуль тут?

Ні. Модуль навмисно ніколи не створює екземпляра, тому його код не може виконуватися на сторінці. Щоб його протестувати, завантажте його у власному проєкті чи середовищі виконання, як-от wasmtime або Node.js.