コンテンツにスキップ

制御フロー難読化

ソースパスは lib/Transforms/ からの相対です。大半は CFG/ にありますが、3 つは制御フローに対する働きでこのページに分類されている一方、実装は関係するサブシステム側に置かれています。include/kagura/Passes.h には同じ食い違いをヘッダ側で発見・修正した記録が残っていますが、このページは当時更新されませんでした。

フラグ パス 効果 ソース
-kagura-fla ControlFlowFlattening CFG を switch ベースの状態機械に変換 (Wasm ではスキップ — 非構造化 CFG を要求するため) CFG/
-kagura-bcf BogusControlFlow MBA 不透明述語でガードされた死ブロックを注入 CFG/
-kagura-ibr IndirectBranch 直接呼び出しを関数ポインタグローバルからのロードに置換 CFG/
-kagura-ci CallIndirection 外部呼び出しを実行時解決のサンクテーブルへルーティング AntiAnalysis/
-kagura-lt LoopTransform 偽の死カウンタと不透明な不変分岐を追加 CFG/
-kagura-fsplit FunctionSplit 内部 BB を抽出してアウトラインされたヘルパー関数にする CFG/
-kagura-bbs BasicBlockSplitting 大きな BB をランダムに分割し CFG 複雑度を増加 CFG/
-kagura-bbr BasicBlockReordering BB レイアウトをシャッフルし線形ディスアセンブラを混乱 CFG/
-kagura-dci DeadCodeInsertion 到達不能なジャンクブロックを挿入し静的解析を誤誘導 CFG/
-kagura-elt EncryptedLookupTable switch 文を XOR 暗号化されたディスパッチテーブルに変換 Data/EncryptedLookupTable.cpp
-kagura-vtp VTableProtection C++ RTTI の typeinfo 名 (_ZTS*) を難読化、vtable メタデータを記録 ABI/VTableProtection.cpp

-kagura-vtp はコマンドライン専用のフラグです。JSON ポリシーファイル"passes" にキーはありません。

変換後の IR の見え方は Before / After 例 を参照。