Binaryen - WebAssembly コンパイラ・最適化ツールチェーン チートシート
Binaryen - WebAssembly コンパイラ・最適化ツールチェーン チートシート
Binaryen は WebAssembly 用コンパイラ・ツールチェーンインフラライブラリ(C++ 書き)。ヘッドラインツール wasm-opt は wasm モジュールを中間表現にロードし、最適化・変換パスを実行 — Emscripten のようなツールチェーンが wasm 縮小・高速化に使用する同じ機構。リバースエンジニアにとって Binaryen のディスアセンブラ(wasm-dis)と分析/変換パス(難読化除去的な簡略化含む)は WABT の有用な補完物。
インストール
| プラットフォーム | コマンド |
|---|---|
| macOS(Homebrew) | brew install binaryen |
| Debian/Ubuntu | sudo apt install binaryen |
| Arch Linux | sudo pacman -S binaryen |
| npm | npm 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-shell | spec 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-FEATURE | wasm 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 関連ツール
| ツール | フォーカス |
|---|---|
| Binaryen | wasm 最適化/変換/分析(コンパイラグレード) |
| WABT | 変換/検査/検証/デコンパイル |
| diswasm | 疑似コード decompiler |
| wasm-tools | Rust 低レベル操作 |
RE の場合:Binaryen で 簡略化 、WABT/diswasm で 読み 、wasm-tools で 検証/変更 。