Utilia

Disassembler WebAssembly

Pretvori dvojiško datoteko .wasm v berljivo besedilo WAT, jo preveri in naštej njene razdelke, uvoze, izvoze in funkcije v brskalniku, ne da bi modul zagnal.

Modul se samo prebere in pretvori v besedilo: nikoli se ne prevede, instancira ali zažene.

Kako pretvoriti WASM v WAT

  1. Datoteko .wasm spusti na območje za spuščanje ali klikni nanj in jo izberi (do 20 MB). Pritisneš lahko tudi Naloži vzorčni modul, da vidiš majhen primer.
  2. Orodje preveri dvojiško datoteko, jo validira in pokaže rezultat: ✓ Modul je veljaven. ali razlog, zakaj ni.
  3. Preberi števce: Funkcije (uvožene in definirane), Uvozi, Izvozi, Tipi, Pomnilniki, Tabele in Globalne spremenljivke.
  4. Disassemblirano kodo preberi v Besedilna oblika WebAssembly (WAT), nato jo Kopiraj ali pritisni Prenesi .wat.
  5. Izhod prilagodi z možnostmi: Uporabi imena iz razdelka name, Zložani izrazi (izrazi S) in Vrstični izvozi.
  6. Odpri tabele Razdelki, Uvozi in Izvozi za zgradbo datoteke: vsak razdelek z odmikom bajtov, velikostjo in številom vnosov.

Modul se nikoli ne prevede, instancira ali zažene. Orodje samo prebere njegove bajte in jih spremeni v besedilo, zato je varno pregledovati datoteko, ki ji ne zaupaš.

Kaj prikaže izhod WAT

WebAssembly ima dve enakovredni obliki: kompaktno dvojiško .wasm, ki jo nalagajo brskalniki in izvajalna okolja, ter besedilno obliko .wat, namenjeno ljudem. Disassembler izpiše vsak del modula v besedilni obliki: tipe funkcij, uvoze, telesa funkcij, tabele, pomnilnike, globalne spremenljivke, izvoze, začetno funkcijo, segmente elementov in segmente podatkov.

Privzeto so ukazi navedeni po eden v vrstici v vrstnem redu sklada, tako kot so shranjeni:

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

Z Zložani izrazi (izrazi S) so operandi gnezdeni znotraj ukaza, ki jih uporablja, kot v (i32.add (local.get $a) (local.get $b)), kar je pogosto lažje slediti. Vrstični izvozi zapišejo (export "add") znotraj funkcije namesto na ločenem seznamu.

Imena, informacije za razhroščevanje in validacija

Datoteka .wasm se na vse sklicuje z indeksi. Kadar je prevajalnik ohranil razdelek po meri name (pogosto pri razhroščevalnih izdajah), Uporabi imena iz razdelka name pokaže izvirna imena, kot je $factorial. Sicer wabt ustvari imena, kot sta $f2 ali $t0, da besedilo ostane berljivo. Produkcijske izdaje so pogosto brez imen, zato bo pomanjšan modul kazal samo ustvarjena imena.

Validacija sledi specifikaciji WebAssembly: tipi se morajo ujemati na skladu operandov, indeksi morajo obstajati in tako naprej. Neveljaven modul je še vedno disassembliran, če je njegovo zgradbo mogoče prebrati, z napako validacije ob njem, kar pomaga pri razhroščevanju prevajalnika ali ročno napisane dvojiške datoteke. Funkcije po MVP, kot so SIMD, niti, množični pomnilnik, tipi referenc, več vrednosti, repni klici, obravnava izjem, memory64 in zbiranje smeti, so za branje omogočene.

To orodje uporablja wabt.js, JavaScript različico orodjarne WebAssembly Binary Toolkit (wasm2wat). Naloži se šele, ko odpreš datoteko.

Pogosta vprašanja

Ali lahko dobim nazaj izvirno kodo C, C++ ali Rust?

Ne. WAT je berljiva oblika prevedene dvojiške datoteke, ne dekompilator: izvorna koda, komentarji in večina podatkov o tipih so po prevajanju izgubljeni. Imena funkcij preživijo samo, če je bil razdelek name ohranjen.

Ali se moja datoteka naloži na strežnik?

Ne. Datoteka se prebere in disassemblira v tvojem brskalniku; nič se ne pošlje na strežnik.

Zakaj orodje pravi, da datoteka ni dvojiška datoteka WebAssembly?

Vsak modul se začne s štirimi bajti \0asm, ki jim sledi različica 1. Datoteka z drugo vsebino, stisnjena z gzip ali Brotli, ali komponenta WebAssembly (novejši model komponent) bo zavrnjena.

Zakaj je besedilno polje odrezano?

Zelo veliki moduli lahko dajo milijone vrstic. Besedilno polje kaže prvi del, da stran ostane odzivna; Prenesi .wat shrani celotno besedilo.

Ali lahko modul tu zaženem ali preizkusim?

Ne. Modul se namenoma nikoli ne instancira, zato se njegova koda na strani ne more izvesti. Za preizkus ga naloži v svoj projekt ali izvajalno okolje, kot sta wasmtime ali Node.js.