diswasm - WebAssembly デコンパイラ・RE チートシート
diswasm はオープンソースの WebAssembly デコンパイラ・リバースエンジニアリングツール(.wasm バイナリ向け)。ブラウザ、エッジ関数、プラグイン、さらにはマルウェアなど、より多くのアプリケーションロジックが wasm として出荷される時代、アナリストはそれを読む必要があります。diswasm は wasm モジュールをパース、関数をディスアセンブル、構造を復元、スタックマシンバイトコードからより高レベルの疑似コードへ変換します。WABT とペアで完全な wasm RE ワークフローを実現。
インストール
| 方法 | 実行方法 |
|---|
| ソースから | git clone https://github.com/wasmkit/diswasm && cd diswasm |
| ビルド | リポジトリの手順に従う(言語別) |
| 補助ツール | WABT(wasm2wat)、wasm-tools とペア |
| 確認 | 既知の .wasm に対して実行し、出力を検査 |
wasm を最初に理解する
| 概念 | 意味 |
|---|
| Module | .wasm 単位:関数、メモリ、テーブル、グローバル |
| Stack machine | wasm はオペランドスタック上で実行(レジスタなし) |
| WAT | WebAssembly Text 形式(人間が読める .wat) |
| Sections | type、import、function、code、data、export など |
| Types | i32 、 i64 、 f32 、 f64 (参照型も) |
基本的なワークフロー
# 1) WABT のディスアセンブラで構造を検査
wasm2wat module.wasm -o module.wat
# 2) diswasm で疑似コードにデコンパイル
diswasm module.wasm > module.pseudo
# 3) 復元された関数と制御フロー読む
| ステップ | ツール | 出力 |
|---|
| Disassemble | wasm2wat(WABT) | .wat text(低レベル) |
| Decompile | diswasm | pseudocode(高レベル) |
| Objdump-style | wasm-objdump(WABT) | sections/opcodes |
diswasm が復元するもの
| フィーチャー | 役に立つこと |
|---|
| 関数境界 | 各関数の開始/終了位置 |
| 制御フロー | block / loop / if を構造化コードに復元 |
| Locals/params | 関数ごとの型付き変数 |
| Memory ops | リニアメモリに対するロード/ストア |
| Imports/exports | ホスト関数呼び出し/公開関数 |
出力の読み取り(トリアージ)
| シグナル | 探すもの |
|---|
| Imported host functions | JS/ホスト呼び出し(env.*)が機能を明示 |
| String/data section | 埋め込み定数、URL、キー |
| Exported functions | モジュールのエントリポイント |
| Memory growth / bulk ops | アンパッキングまたは大型バッファ |
| Indirect calls | 関数テーブルディスパッチ(難読化) |
補足的な wasm ツール
| ツール | 役割 |
|---|
| diswasm | wasm デコンパイル → 疑似コード |
WABT(wasm2wat 、 wasm-objdump) | ディスアセンブル/検査 |
| wasm-tools | Rust 低レベル操作/検証 |
Binaryen(wasm-dis) | コンパイラグレード分析/最適化 |
| Ghidra + wasm plugin | 完全な RE 環境 |
一般的なワークフロー
# 不明なブラウザ wasm ペイロード分析
wasm2wat suspicious.wasm -o suspicious.wat # 構造
diswasm suspicious.wasm > suspicious.c # 読める論理
grep -iE "fetch|eval|XMLHttp|import" suspicious.wat # 機能
# wasm モジュールの 2 つのバージョン比較
diswasm v1.wasm > v1.pseudo; diswasm v2.wasm > v2.pseudo
diff v1.pseudo v2.pseudo
diswasm vs その他のアプローチ
| 項目 | diswasm | wasm2wat(WABT) | JEB(commercial) |
|---|
| 出力レベル | 疑似コード | 低レベル WAT | Pseudo-C decompiler |
| コスト | 無料/オープンソース | 無料/オープンソース | Commercial |
| 最適用途 | 高速で読める逆コンパイル | 正確なディスアセンブリ | 深くポリッシュされた RE |
リソース