Skip to Content
新しいバージョン 12 を公開しました 🎉
Obfuscator最適化デッドコード除去

デッドコード除去

デッドコード除去は、Babel Obfuscator が提供する重要な最適化手法です。実行時に決して実行されないコードを特定して除去します。対象には、未使用と判断されたメソッド、プロパティ、フィールドのほか、型全体も含まれます。デッドコードを除去することで、Babel は難読化されたアセンブリのサイズと複雑さを減らし、いくつかの利点をもたらします。

デッドコード除去は、アプリケーションの読み込み時間を短縮します。不要なコードがなくなることで難読化されたアセンブリが小さくなり、読み込みと初期化が速くなります。この最適化は、コードベースが大きいアプリケーションや、初期化処理の負荷が高いアプリケーションで特に効果があります。

また、デッドコード除去は、難読化されたアプリケーション全体のパフォーマンスも高めます。未使用のメソッド、プロパティ、フィールドがなくなることで、実行時の処理が効率的になります。デッドコードがなければ不要な関数呼び出しとメモリ割り当てが減り、実行時のパフォーマンスと応答性が向上します。

さらに、デッドコード除去は、難読化されたコードのセキュリティを強化します。未使用のコードを除去すると、侵入口や脆弱性になりうる箇所が最小限になり、攻撃者にとっての攻撃対象領域が小さくなります。また、悪用されるおそれのある機密情報や機能が意図せず露出することもなくなります。

コマンドライン

コマンドラインでデッドコード除去を有効にするには、Babel の実行時に --deadcode スイッチを使用します。

babel myapp.exe --deadcode

MSBuild の Babel タスク

<PropertyGroup> <DeadCodeElimination>true</DeadCodeElimination> </PropertyGroup> <Babel DeadCodeElimination="$(DeadCodeElimination)" />

XML ルール

未使用のシンボルの除去は、「dead code」機能を対象とする XML ルールで制御できます。次の XML ルールの例は、Utilities 名前空間内のすべてのシンボルの除去を防ぎます。

<Rule name="remove1" feature="dead code" exclude="true"> <Pattern isRegEx="true"> <![CDATA[ (Utilities.*) ]]> </Pattern> <Description>Do not remove symbols in Utilities namespace</Description> </Rule>

全体として、Babel Obfuscator のデッドコード除去の最適化は、サイズの削減、読み込み時間の短縮、実行時のパフォーマンスの向上、セキュリティの強化によって、難読化されたコードベースに大きな利点をもたらします。

追加のエントリポイント

Babel Obfuscator は、アセンブリのパブリックインターフェイスとエントリポイントを起点に、コードベースを包括的に解析します。この解析の主な目的は、実行時に到達可能なコードの部分をすべて特定することです。エントリポイントを調べ、パブリックインターフェイスをたどることで、Babel は実行フローを把握し、到達できないメソッド、つまりプログラムの実行中に呼び出されることもアクセスされることもないメソッドを特定します。これらのメソッドは、アプリケーションの機能に関与しないため、「デッドコード」と見なされます。

アセンブリのパブリックインターフェイスとエントリポイントからの解析に加えて、Babel Obfuscator では、コードを正しく実行するために必要となるほかのエントリポイントも考慮に入れられます。こうした追加のエントリポイントには、リフレクションを通じてアクセスされるメソッドや、InternalVisibleTo 属性を使ってほかのコンポーネントから内部的にアクセスされるメソッドがあります。

これらの追加のエントリポイントは、下のエントリポイントの指定に示すように、デッドコード除去オプションに渡す正規表現として指定します。Babel Desktop では、選択したアセンブリの「最適化」グループで DeadCodeElimination を有効にし、そのリストにエントリポイントの式を追加します。

これらのエントリポイントを指定することで、Babel Obfuscator は到達可能なコードを正確に判定し、リフレクションや内部での使用に必要なメソッドが最適化の処理で保持されるようにします。これにより、コードベースを包括的に解析し、指定したどのエントリポイントからも到達できないデッドコードを除去できます。

エントリポイントの指定

コマンドラインでデッドコード除去に追加のエントリポイントを指定するには、--deadcode オプションの引数として正規表現を使用します。正規表現を使うと、メソッド名に一致するパターンを柔軟に定義できます。特定のメソッドを指定することも、名前空間全体を対象にすることも、メソッド名の中のパターンに一致させることもでき、複数の式を組み合わせて複数のエントリポイントを含めることもできます。

--deadcode オプションの引数として、正規表現でエントリポイントを指定する例をいくつか次に示します。

  1. 特定のメソッドを指定する場合:

    babel myapp.exe --deadcode MyNamespace.MyClass.MyMethod
  2. 名前空間内のすべてのメソッドを指定する場合:

    babel myapp.exe --deadcode MyNamespace.*
  3. 特定のクラス内のすべてのメソッドを指定する場合:

    babel myapp.exe --deadcode MyNamespace.MyClass.*
  4. 正規表現を使って、特定のパターンに一致するメソッドを指定する場合:

    babel myapp.exe --deadcode MyNamespace.*[Gg]et.*
  5. 複数の正規表現を使って、複数のエントリポイントを指定する場合:

    babel myapp.exe --deadcode MyNamespace.* --deadcode AnotherNamespace.*

MSBuild プロジェクトの Babel タスクで、正規表現を使ってエントリポイントを指定するには、<DeadCodeElimination> プロパティを使用します。このプロパティには、エントリポイントのメソッドに一致する正規表現を、セミコロン(;)で区切ったリストとして定義できます。

Babel タスクで、正規表現を使ってエントリポイントを指定する例を次に示します。

<PropertyGroup> <DeadCodeElimination>MyNamespace.*;true</DeadCodeElimination> </PropertyGroup> <Babel DeadCodeElimination="$(DeadCodeElimination)" />

これらの例は、正規表現を使って、Babel のデッドコード除去の解析のエントリポイントを定義する方法を示しています。特定のパターンを指定したりワイルドカードを使ったりすることで、解析で考慮するメソッドやメソッドのグループを正確に指定できます。

Last updated on