コンテンツにスキップ

diswasm - WebAssembly デコンパイラ・RE チートシート

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 machinewasm はオペランドスタック上で実行(レジスタなし)
WATWebAssembly Text 形式(人間が読める .wat
Sectionstype、import、function、code、data、export など
Typesi32i64f32f64 (参照型も)

基本的なワークフロー

# 1) WABT のディスアセンブラで構造を検査
wasm2wat module.wasm -o module.wat

# 2) diswasm で疑似コードにデコンパイル
diswasm module.wasm > module.pseudo

# 3) 復元された関数と制御フロー読む
ステップツール出力
Disassemblewasm2wat(WABT).wat text(低レベル)
Decompilediswasmpseudocode(高レベル)
Objdump-stylewasm-objdump(WABT)sections/opcodes

diswasm が復元するもの

フィーチャー役に立つこと
関数境界各関数の開始/終了位置
制御フローblock / loop / if を構造化コードに復元
Locals/params関数ごとの型付き変数
Memory opsリニアメモリに対するロード/ストア
Imports/exportsホスト関数呼び出し/公開関数

出力の読み取り(トリアージ)

シグナル探すもの
Imported host functionsJS/ホスト呼び出し(env.*)が機能を明示
String/data section埋め込み定数、URL、キー
Exported functionsモジュールのエントリポイント
Memory growth / bulk opsアンパッキングまたは大型バッファ
Indirect calls関数テーブルディスパッチ(難読化)

補足的な wasm ツール

ツール役割
diswasmwasm デコンパイル → 疑似コード
WABT(wasm2watwasm-objdumpディスアセンブル/検査
wasm-toolsRust 低レベル操作/検証
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 その他のアプローチ

項目diswasmwasm2wat(WABT)JEB(commercial)
出力レベル疑似コード低レベル WATPseudo-C decompiler
コスト無料/オープンソース無料/オープンソースCommercial
最適用途高速で読める逆コンパイル正確なディスアセンブリ深くポリッシュされた RE

リソース