制御フローアルゴリズム
Babel Obfuscator には複数の制御フローアルゴリズムがあり、個別に有効にできます。ほとんどのアルゴリズムは検証可能な IL を生成し、サポートされているすべてのランタイムで動作します。2 つのアルゴリズム(token と underflow)はそうではなく、このページの最後で説明します。
検証可能なアルゴリズム
| アルゴリズム | 動作 |
|---|---|
goto | 無関係な分岐を挿入し、制御フローを長く、直線的でないものにします。 |
if | 条件を追加して、if ステートメントをより複雑な形に書き換えます。 |
switch | 1 つ以上の switch ディスパッチャーを中心にメソッドを再構築し、ブロックがソースの順序で実行されないようにします(これを「フラット化」と呼びます)。 |
case | switch ディスパッチャーを動かす定数値を隠し、コード内に単純な数値として現れないようにします。 |
call | switch 本体内の次のジャンプ先を決める変数を追加します。これらの変数は、他のメソッドの呼び出しによって生成されます。 |
value | 値の暗号化機能を使用して、switch のセレクターをさらに保護します。 |
chain | チェーン状態:自動的な難読化解除に対して強化された、高度なフラット化アルゴリズムです。Ultimate エディション以上で使用できます。チェーン状態を参照してください。 |
goto と if は負荷が小さく、広く適用できます。switch 系(switch、case、call、value)と chain は、メソッドをフラット化する最も強力な変換ですが、実行時のコストは高くなります。パフォーマンスとチューニングを参照してください。
チェーン状態 Ultimate
chain は switch と同じくフラット化アルゴリズムですが、通常のフラット化されたメソッドを再構築できる自動ツールに耐えるよう、特別に設計されています。検証可能な IL を生成し、サポートされているすべてのランタイムで動作します。--controlflow chain=on で有効にします。詳しくは、専用のページチェーン状態を参照してください。
検証不可能なオプション
token アルゴリズムは無効なメタデータトークンを制御フローに挿入し、underflow アルゴリズムは、マネージドスタックがアンダーフローする可能性のある箇所をメソッド本体に追加します。どちらも IL を検証不可能にします。
token と underflow のアルゴリズムは、.NET および .NET Core アセンブリの検証可能という性質と両立せず、実行時エラーを引き起こす可能性があります。.NET または .NET Core アセンブリを対象とする場合、Babel Obfuscator はこれらを自動的に無効にします。
無効なオペコード
「Emit Invalid Opcodes」オプションは、各アルゴリズムが挿入する命令と並べて、無効な MSIL 命令を追加します。これにより、デコンパイラーが元のコードを再構築しにくくなります。このオプションを有効にすると、アセンブリは検証不可能になり、CLR はアプリケーションを 32 ビットプロセスとして実行せざるを得なくなります。
アプリケーションを 64 ビットプロセスとして実行する必要がある場合、または、実行するためにアセンブリが IL 検証可能でなければならない .NET Core や .NET Framework を対象とする場合は、「Emit Invalid Opcodes」を有効にしないでください。そのような場合は、このオプションをオフのままにしてください。