制御フロー難読化
制御フロー難読化は、メソッドの計算内容は変えずに、命令の分岐の仕方を書き換えることで、メソッドを追いにくくします。Babel は、if ステートメントを読みにくくし、結果に影響しない分岐を挿入し、ディスパッチャーを中心にメソッドを再構築して、ブロックがソースの順序で実行されないようにできます。目的は、コードのデコンパイルと理解にかかるコストを引き上げ、リバースエンジニアリングや改ざんを困難にすることです。
Babel は、制御フローの処理を、個別に有効にできる一連のアルゴリズムにまとめています。アルゴリズムは 2 つの系統に分かれます。
- 軽量な変換(
ifとgoto):分岐と追加の条件を加えます。実行時のコストはほとんどかかりません。 - フラット化変換(
switch、case、call、value、および Ultimate のチェーン状態アルゴリズム):ディスパッチャーを中心にメソッドを再構築します。はるかに強力ですが、実行時のコストは高くなります。
さらに 2 つのオプション、token と underflow は、意図的に検証不可能な IL を生成するもので、.NET および .NET Core を対象とする場合は自動的に無効になります。すべてのアルゴリズムの一覧は、アルゴリズムを参照してください。
制御フロー難読化の設定
制御フロー難読化は、コマンドライン、MSBuild の Babel タスク、Babel Desktop から設定できます。XML ルールを使用すると、特定のメソッドの集合に対してアルゴリズムを調整できます。たとえば、反復回数を変更したり、メソッドごとに個々のアルゴリズムを有効または無効にしたりできます。
コマンドライン
babel myapp.exe --controlflow goto=on --controlflow if=on --controlflow switch=on --controlflow case=on --iterations 3--controlflow オプションは、指定したアルゴリズム(ここでは goto、if、switch、case)を有効にし、--iterations は、各アルゴリズムをメソッドに適用する回数を設定します。
MSBuild の Babel タスク
<PropertyGroup>
<ControlFlowObfuscation>goto=true;if=true;switch=true;case=false;call=true;
value=false;token=false;underflow=false;true</ControlFlowObfuscation>
<ILIterations>5</ILIterations>
</PropertyGroup>
<Babel ControlFlowObfuscation="$(ControlFlowObfuscation)"
ILIterations="$(ILIterations)" />ILIterations プロパティは、制御フローアルゴリズムの反復回数を設定します。
Babel Desktop
- Babel Desktop でプロジェクトを開き、プロジェクトのキャンバスでアセンブリを選択します。
- プロパティパネルの「制御フロー」グループで
ControlFlowObfuscationを有効にし、使用するアルゴリズムを選択します。 ILIterationsに、各アルゴリズムが実行する反復回数を設定します。- 「実行」を押して、難読化を開始します。
難読化が完了すると、「結果」ビューに制御フローの統計が表示されます。表示されるのは、変換されたメソッドと各アルゴリズムが実行した反復回数、および完全な統計を収集した場合は変換前後の循環的複雑度です。
このセクションのページ
- アルゴリズム:すべての制御フローアルゴリズムと、その動作、使いどころ。
- チェーン状態 Ultimate:自動的な制御フロー難読化解除に対して強化された、高度なフラット化アルゴリズム。
- パフォーマンスとチューニング:各アルゴリズムが実行時に与える影響、アルゴリズムの比較、反復回数、頻繁に呼び出されるメソッドを高速に保つ方法。