本文へスキップ

WebAssemblyの解析

WebAssembly Inspector

.wasmモジュールのインポート・エクスポート・メモリ・セクションの大きさを並べ、テキスト形式でも出力します。

`.wasm`のファイルを開いて、中に何が入っているかを見せます。セクションとその大きさ、インポートとエクスポートのすべて、メモリとテーブルの宣言、そしてビルドがnameセクションを残していれば関数名まで出ます。モジュールはパースするだけで、インスタンス化も実行もしません。

🔒 ブラウザの中だけで動きますwasminspectbinary

.wasm モジュールをドロップ

このタブで解析します。モジュールを調べるだけで、インスタンス化も実行もしません。

バイナリの構造を読みます。セクション、型、インポート、エクスポート、メモリ、name カスタムセクションまで見て、モジュール全体をブラウザー自身の WebAssembly.validate で照合します。関数の本文は大きさを測るだけで、逆アセンブルはしません。ここに出るのはモジュールが何を宣言し何に触れるかであって、テキスト形式への完全な変換ではありません。

使い方

  1. モジュールを置きます

    `.wasm`のファイルなら何でも構いません。このタブの中で読み、ブラウザ自身の`WebAssembly.validate`と突き合わせます。整形式かどうかについて、2つ目の意見も一緒に得られるということです。

  2. まずセクションを見ます

    大きさの表が、バイトがどこへ行ったのかをいちばん早く示します。dataセクションが大きければアセットが埋め込まれているということで、customセクションが大きければ、たいていはデバッグ用の名前かDWARFです。

  3. インポートを読みます

    インポートは、そのモジュールとホストとのあいだの契約のすべてです。呼び出せる関数も、共有するメモリも、全部そこにあります。自分でビルドしていないモジュールを調べているなら、重要なのはこの一覧です。

よくある質問

実際のコードを見られますか

見られません。関数の本体は大きさを測るだけで、逆アセンブルはしません。モジュールが何を宣言し、何に触れるのかを報告するだけで、テキスト形式に変換することはありません。完全な逆アセンブルは、WABTの`wasm2wat`の仕事です。

関数名が出ないのはなぜですか

ビルドがnameのカスタムセクションを取り除いたからです。リリース向けのビルドはふつうそうします。エクスポートのほうは名前を保ちます。モジュールのインターフェースだからです。だからエクスポートされた関数は、それでも見分けられます。

インポートのあるモジュールは危険ですか

それ自体では危険ではありません。WebAssemblyはホストが渡したものにしか届きませんし、インポートの無いモジュールは外の世界にまったく触れられません。インポートに書かれているものが、そのモジュールにできることのすべてです。だからインスタンス化する前に読む値打ちがあります。

パースはできたのに、エンジンの検証は無効だと言います

見ているものが違います。パースは構造を読み、`WebAssembly.validate`は関数の本体の型まで検査します。セクションの構造はきれいに読めるのに、それでも拒否されることがあります。ファイルが途中で切れているか、後処理の工程が触ってはいけないバイトを書き換えた場合です。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。