Utilia

WebAssembly dizasembleris

Paversk .wasm dvejetainį failą skaitomu WAT tekstu, patikrink jį ir pamatyk skyrius, importus, eksportus bei funkcijas naršyklėje nevykdydamas modulio.

Modulis tik nuskaitomas ir paverčiamas tekstu: jis niekada nekompiliuojamas, nesukuriamas egzempliorius ir nevykdomas.

Kaip paversti WASM į WAT

  1. Nutempk .wasm failą į nutempimo sritį arba spustelėk ją ir pasirink failą (iki 20 MB). Taip pat gali paspausti Įkelti pavyzdinį modulį, kad pamatytum nedidelį pavyzdį.
  2. Įrankis patikrina dvejetainį failą, jį validuoja ir parodo rezultatą: ✓ Modulis tinkamas. arba priežastį, kodėl jis netinkamas.
  3. Peržiūrėk skaitiklius: Funkcijos (importuotos ir apibrėžtos), Importai, Eksportai, Tipai, Atmintys, Lentelės ir Globalieji kintamieji.
  4. Perskaityk dizasembliavimo rezultatą skiltyje WebAssembly teksto formatas (WAT), tada Kopijuoti jį arba paspausk Atsisiųsti .wat.
  5. Koreguok išvestį nustatymais: Naudoti pavadinimus iš name skyriaus, Sulankstytos išraiškos (S-išraiškos) ir Eksportai eilutėje.
  6. Atidaryk lenteles Skyriai, Importai ir Eksportai, kad pamatytum failo struktūrą: kiekvienas skyrius su baito poslinkiu, dydžiu ir įrašų skaičiumi.

Modulis niekada nekompiliuojamas, nesukuriamas jo egzempliorius ir jis nevykdomas. Įrankis tik nuskaito jo baitus ir paverčia juos tekstu, todėl saugu tikrinti failą, kuriuo nepasitiki.

Ką rodo WAT išvestis

WebAssembly turi du lygiaverčius formatus: kompaktišką dvejetainį .wasm, kurį įkelia naršyklės ir vykdymo aplinkos, ir teksto formatą .wat, skirtą žmonėms. Dizasembleris teksto forma išspausdina kiekvieną modulio dalį: funkcijų tipus, importus, funkcijų kūnus, lenteles, atmintis, globaliuosius kintamuosius, eksportus, pradžios funkciją, elementų segmentus ir duomenų segmentus.

Pagal numatytuosius nustatymus instrukcijos išvardijamos po vieną eilutėje steko tvarka, kaip jos saugomos:

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

Su Sulankstytos išraiškos (S-išraiškos) operandai įdedami į juos naudojančią instrukciją, kaip (i32.add (local.get $a) (local.get $b)), o tai dažnai lengviau sekti. Eksportai eilutėje įrašo (export "add") funkcijos viduje, o ne atskirame sąraše.

Pavadinimai, derinimo informacija ir validavimas

.wasm failas viską nurodo pagal indeksą. Kai kompiliatorius išsaugojo name pasirinktinį skyrių (įprasta derinimo kompiliacijose), Naudoti pavadinimus iš name skyriaus parodo originalius pavadinimus, pavyzdžiui, $factorial. Kitu atveju wabt sugeneruoja pavadinimus, tokius kaip $f2 ar $t0, kad tekstas išliktų skaitomas. Gamybinės kompiliacijos dažnai neturi pavadinimų, todėl suspaustas modulis rodys tik sugeneruotus pavadinimus.

Validavimas laikosi WebAssembly specifikacijos: tipai operandų steke turi sutapti, indeksai turi egzistuoti ir panašiai. Netinkamas modulis vis tiek dizasembliuojamas, kai jo struktūrą galima perskaityti, o šalia rodoma validavimo klaida, kuri padeda derinant kompiliatorių ar ranka rašytą dvejetainį failą. Skaitymui įjungtos po MVP atsiradusios galimybės: SIMD, gijos, masinė atmintis, nuorodų tipai, kelių reikšmių grąžinimas, uodegos iškvietimai, išimčių tvarkymas, memory64 ir šiukšlių surinkimas.

Šis įrankis naudoja wabt.js, WebAssembly Binary Toolkit (wasm2wat) JavaScript versiją. Ji įkeliama tik tada, kai atidarai failą.

Dažnai užduodami klausimai

Ar galiu atkurti originalų C, C++ ar Rust šaltinio kodą?

Ne. WAT yra skaitoma sukompiliuoto dvejetainio failo forma, o ne dekompiliatorius: šaltinio kodas, komentarai ir dauguma tipų informacijos po kompiliavimo dingsta. Funkcijų pavadinimai išlieka tik tada, kai name skyrius buvo paliktas.

Ar mano failas įkeliamas?

Ne. Failas skaitomas ir dizasembliuojamas tavo naršyklėje; į serverį nieko nesiunčiama.

Kodėl įrankis sako, kad failas nėra WebAssembly dvejetainis?

Kiekvienas modulis prasideda keturiais baitais \0asm, po kurių eina 1 versija. Failas su kitokiu turiniu, suspaustas gzip ar Brotli arba WebAssembly komponentas (naujesnis komponentų modelis) bus atmestas.

Kodėl teksto laukelis nukirptas?

Labai dideli moduliai gali sukurti milijonus eilučių. Teksto laukelyje rodoma pirmoji dalis, kad puslapis išliktų atsakingas; Atsisiųsti .wat išsaugo visą tekstą.

Ar čia galiu paleisti ar išbandyti modulį?

Ne. Modulis tyčia niekada nesukuriamas kaip egzempliorius, todėl jo kodas puslapyje negali būti vykdomas. Norint jį išbandyti, įkelk jį į savo projektą arba vykdymo aplinką, pavyzdžiui, wasmtime ar Node.js.