コンテンツにスキップ

データ難読化

ソース: lib/Transforms/Data/

フラグ パス 効果
-kagura-str StringEncryption ナロー文字列リテラルを XOR 暗号化、初使用時に遅延復号
-kagura-str-aes StringEncryptionAES AES-128-CTR 文字列暗号化 (ランタイム必要)
-kagura-string-split StringSplit 長い文字列リテラル (16 バイト以上) を複数の小さなグローバルに分割し、初使用時に実行時に再結合
-kagura-wstr WideStringEncryption ワイド文字列 (wchar_t / char16_t / char32_t) と CFString バッファを XOR 暗号化
-kagura-co ConstantObfuscation 整数定数を MBA 式で置換
-kagura-sub Substitution 算術 / ビット演算を等価な MBA に置換
-kagura-genc GlobalEncryption プライベートな整数グローバルを暗号化、ロード箇所にインライン XOR
-kagura-mvo MemoryValueObfuscation alloca された整数ローカルをストア・ロードのたびに XOR 暗号化
-kagura-pe PointerEncryption alloca されたポインタ変数を XOR 暗号化、メモリダンプ解析を阻止
-kagura-cse-break CSEBreak 共有された SSA 式を複製し、デコンパイラが CSE 復元によって再度まとめられないようにする

kagura-str と kagura-sub の Before/After は Before / After 例 を参照。

-kagura-string-aggressive(JSON "string": {"aggressive": true})で、str・str_aes・wstr の対象を短い文字列・書式文字列・グローバル初期化子からの参照にも広げられます。起動時に復号し、アドレスが変わらない領域に保持します。既定は従来の保守的な動作です。str は str_aes より先に実行されるため、ナロー文字列を AES に任せる場合は str を無効化してください。対象範囲・初期化順序・メモリ保持の注意点は 設定 を参照してください。

ゲーム実行時の値 (HP, 通貨等) を C++ レベルで守るには ゲーム保護 を参照 — Protected<T> は実行時のシャドウコピー整合性チェックを追加することで kagura-mvo を補完します。

平文の保持時間

-kagura-string-scoped / "string": {"scoped": true} で、条件に合う XOR/AES 文字列を呼び出しごとのスタックへ復号し、直後に volatile な消去を行います。 対象外は永続領域を維持し、ワイド文字列は対象外です。 条件・同時実行・消去の限界は 設定 を参照してください。