コンテンツにスキップ

Binaryen - WebAssembly コンパイラ・最適化ツールチェーン チートシート

Binaryen - WebAssembly コンパイラ・最適化ツールチェーン チートシート

Binaryen は WebAssembly 用コンパイラ・ツールチェーンインフラライブラリ(C++ 書き)。ヘッドラインツール wasm-opt は wasm モジュールを中間表現にロードし、最適化・変換パスを実行 — Emscripten のようなツールチェーンが wasm 縮小・高速化に使用する同じ機構。リバースエンジニアにとって Binaryen のディスアセンブラ(wasm-dis)と分析/変換パス(難読化除去的な簡略化含む)は WABT の有用な補完物。

インストール

プラットフォームコマンド
macOS(Homebrew)brew install binaryen
Debian/Ubuntusudo apt install binaryen
Arch Linuxsudo pacman -S binaryen
npmnpm install -g binaryen(JS バインディング)
ソースからWebAssembly/binaryen リポジトリから CMake でビルド
確認wasm-opt --version

コアツール

ツール機能
wasm-optロード・最適化/変換・再出力
wasm-dis.wasm をテキストにディスアセンブル
wasm-asテキストを .wasm にアセンブル
wasm-metadceモジュール + JS 間の dead-code 削除
wasm-ctor-evalビルド時にコンストラクター評価
wasm-reduce動作保持しながらモジュール縮小(bug repro)
wasm-shellspec test shell 実行

モジュール最適化

# サイズと速度の最適化
wasm-opt -O3 module.wasm -o module.opt.wasm

# サイズ積極的最適化
wasm-opt -Oz module.wasm -o module.small.wasm
フラグ効果
-O / -O1..-O4速度最適化(増加)
-Osサイズ最適化
-Ozサイズ積極的最適化
--enable-FEATUREwasm proposal 有効化(simd、threads など)
-o FILE出力ファイル

個別パス実行

wasm-opt は選択的に実行できる多数の名前付きパスを公開 — RE(難読化コード簡略化)とビルド両方で便利。

# 使用可能なパスすべてをリスト
wasm-opt --help | grep -A2 "passes:"

# 特定パス実行(例 simplify + unused 削除)
wasm-opt module.wasm --precompute --simplify-locals \
  --remove-unused-names --vacuum -o clean.wasm
パス(例)目的
--precompute定数式のフォールド
--simplify-locals冗長ローカル使用削減
--vacuum明らかな dead code 削除
--remove-unused-module-elements未使用関数/グローバル削除
--flatten / --rereloop制御フロー再構成

ディスアセンブル・アセンブル

# Binaryen テキスト形式にディスアセンブル
wasm-dis module.wasm -o module.wat

# 再度アセンブル
wasm-as module.wat -o module.wasm

RE 使用例:簡略化して読む

実践的なリバース手法は Binaryen 簡略化パス実行でコンパイラ/難読化ノイズをクリーンアップ、その結果を読むこと。

# 複雑なモジュール簡略化、それから WABT でデコンパイル
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp

Repro 最小化(wasm-reduce)

# スクリプトが関心動作をまだ報告する間、モジュール縮小
wasm-reduce big.wasm --command "node check.js" -o small.wasm

bug トリガーまたは特定動作を隔離する最小 wasm に最適。

Binaryen vs 関連ツール

ツールフォーカス
Binaryenwasm 最適化/変換/分析(コンパイラグレード)
WABT変換/検査/検証/デコンパイル
diswasm疑似コード decompiler
wasm-toolsRust 低レベル操作

RE の場合:Binaryen で 簡略化 、WABT/diswasm で 読みwasm-tools検証/変更

リソース