Skip to Content
新しいバージョン 12 を公開しました 🎉

チェーン状態 Ultimate

チェーン状態(chain)は、Babel Obfuscator で最も強力な制御フロー変換です。switch アルゴリズムと同じく、メソッドを「フラット化」します。つまり、ディスパッチャーを中心にメソッドを再構築して、ブロックがソースの順序で実行されないようにします。そのうえで、通常のフラット化を元に戻せる自動ツールに耐えるよう、特別に設計されています。

チェーン状態を使う理由

通常の switch フラット化は、人が読む場合には効果的ですが、よく知られた種類の自動難読化解除ツールは、多くの場合、元のメソッドを再構築できます。これらのツールは、ディスパッチャーを静的に解析し、ブロックが本来実行される順序を復元して、メソッドをソースに近い形に書き戻します。こうしたツールに対しては、単純なフラット化は 1 回の自動処理で元に戻されることがあります。

チェーン状態は、この弱点をふさぎます。ディスパッチャーは、元の順序を静的解析だけでは復元できないように構築されます。攻撃者がフローをたどるには、メソッドを実際に実行するしかありません。標準的な自動制御フロー難読化解除ツールを使った社内テストでは、switch でフラット化したコードは元のメソッドに再構築されましたが、chain でフラット化した同じコードはそのまま残りました。その結果、フラット化されたメソッドは、手作業での読解にも自動的な復元にも耐えます。

チェーン状態はフラット化を強化するものであり、フラット化に代わるものではありません。単独で有効にすることも、他の制御フローアルゴリズムと併用することもできます。

互換性

チェーン状態は、通常の検証可能な IL だけを出力し、ヘルパー型、リフレクション、ランタイムへの依存関係を追加しません。そのため、.NET の全範囲で、変更なしに動作します。

  • .NET Framework 4.x から .NET 10 まで、.NET Core、Mono / Xamarin。
  • トリミングされた(ILLink)アプリケーションと NativeAOT アプリケーション。AOT コンパイルで動作しなくなる動的コードはありません。
  • Android と iOS を含む .NET MAUI。

この変換は検証可能な IL の範囲にとどまるため、アセンブリが 32 ビットプロセスに強制されることはなく、難読化の構成の他の部分と安全に組み合わせることができます。

パフォーマンス

チェーン状態の実行時コストは、switch フラット化と同じ種類のものです。フラット化されたメソッドは、呼び出しのたびにディスパッチャーを実行します。実際には、呼び出しごとのオーバーヘッドは、通常の switch との差が数パーセント以内に収まります。他のフラット化と同様に、知的財産を実際に保護するメソッドに限って使用し、パフォーマンスが重要なホットパスには適用しないでください。詳細な比較と、ルールで適用範囲を限定する方法については、パフォーマンスとチューニングを参照してください。

チェーン状態の有効化

コマンドライン

babel myapp.exe --controlflow chain=on

他のアルゴリズムと組み合わせることもできます。たとえば、次のように指定します。

babel myapp.exe --controlflow switch=on --controlflow case=on --controlflow chain=on

MSBuild の Babel タスク

<PropertyGroup> <ControlFlowObfuscation>chain=true;true</ControlFlowObfuscation> </PropertyGroup> <Babel ControlFlowObfuscation="$(ControlFlowObfuscation)" />

Babel Desktop

プロパティパネルの「制御フロー」グループで、制御フロー難読化(ControlFlowObfuscation)を有効にし、アルゴリズムの中から chain を選択します。

チェーン状態は、Ultimate エディション以上(および Server / Data Center)で使用できます。Enterprise エディションでは、エンジンは chain アルゴリズムを適用しません。

Last updated on