Skip to Content
新しいバージョン 12 を公開しました 🎉
Obfuscator最適化メタデータの最適化

メタデータの最適化

Babel Obfuscator のメタデータの最適化は、難読化されたコードのメタデータを改善する一連の手法です。メタデータには、型、メンバー、属性など、コードベースの重要な要素に関する情報が含まれています。これらの最適化は、コードのセキュリティを高め、サイズを減らし、リバースエンジニアリングへの耐性を高めることに重点を置いています。

クラスの自動シール

クラスの自動シールは、Babel Obfuscator が提供する最適化手法で、継承チェーンで基底クラスとして使われていないクラスをシールして、コードの実行パフォーマンスを高めます。クラスがシールされていると、JIT(Just-In-Time)コンパイラーは、仮想メソッドを非仮想で呼び出す、より効率的なコードを生成できるため、仮想メソッドの解決に伴うオーバーヘッドがなくなります。

コマンドライン

クラスの自動シールは、コマンドラインで --seal スイッチを使って有効にできます。このスイッチは、ターゲットアセンブリ内のパブリックでないすべての型に最適化を適用します。たとえば、次のコマンドは「myapp.exe」アセンブリのクラスをシールします。

babel myapp.exe --seal

ただし、特定の型をクラスの自動シールから除外する必要がある場合は、XML ルールを定義できます。正規表現パターンを指定すると、特定の型をシールの対象から除外できます。次の XML ルールの例では、Utilities 名前空間内のクラスは自動的にシールされません。

<Rule name="seal classes" feature="optimizations" exclude="false"> <Pattern>Utilities.*</Pattern> <Properties> <ClassSealing>false</ClassSealing> </Properties> </Rule>

この例では、すべての最適化が無効にならないように、exclude 属性を「false」に設定している点に注意してください。クラスの自動シールを選択的に使用することで、個別の要件に合わせて最適化の処理を細かく調整し、パフォーマンスの向上と特定のクラスの動作の維持とのバランスを取れます。

MSBuild の Babel タスク

MSBuild の Babel タスクでクラスの自動シールを有効にするには、<PropertyGroup> 要素内で <SealClasses> プロパティを設定します。

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

この例では、<SealClasses> プロパティが true に設定されており、難読化の処理中にクラスの自動シールを有効にすることを示します。

不要な属性の除去

Babel Obfuscator の属性除去の最適化は、コンパイラーが生成したコードから不要な属性を除去することに重点を置いています。コンパイラーが生成するコードには、実行時のアプリケーションの動作に影響しない属性が含まれていることがよくあります。Babel は、定義されたシンボルに付けられたこのような属性を特定して除去でき、難読化されたコードベースがより簡潔で効率的になります。

たとえば、CompilerGeneratedAttribute や DebuggerDisplayAttribute のように、アプリケーション自体に必須ではない属性は、安全に除去できます。こうした不要な属性を除去することで、Babel は難読化されたターゲットのサイズを減らし、コンパイラーが生成したコードとユーザーのコードの区別をなくします。

コマンドライン

「不要な属性の除去」の最適化を有効にするには、コマンドラインで Babel の実行時に --cleanattrs スイッチを使用します。

babel myapp.exe --cleanattrs

除去される属性のリストは、babel.exe.config ファイルにあります。除去の対象として構成されている属性を表示するには、次のコマンドを使用します。

babel --help cleanattrs

出力には、不要な属性が完全な型名とともに表示されます。

Babel では、不要な属性の完全な型名に一致する正規表現も指定できます。たとえば、次のように指定します。

babel myapp.exe --cleanattrs System.Diagnostics.*Attribute

このコマンドは、System.Diagnostics 名前空間で定義されたすべてのカスタム属性型を除去します。

「babel.exe.config」の構成セクションには、UnwantedAttributes 要素の下に、不要な属性の定義済みリストが格納されています。コレクションの各項目は、属性の修飾型名を表します。

MSBuild の Babel タスク

MSBuild の Babel タスクで不要な属性の除去を有効にするには、<PropertyGroup> 要素内で <CleanAttributes> プロパティを設定します。

<PropertyGroup> <CleanAttributes>System.Diagnostics.*Attribute;true</CleanAttributes> </PropertyGroup> <Babel CleanAttributes="$(CleanAttributes)" />

この例では、<CleanAttributes> プロパティに、除去する不要な属性の完全な型名に一致する正規表現のリストを指定しています。末尾の true は、この機能全体のスイッチです。

XML ルール

UnwantedAttributes という XML ルールのプロパティを使うと、指定した正規表現に一致するすべてのメンバーについて、属性の除去を細かく設定できます。ルールを定義することで、コードの特定の部分を不要な属性の除去から柔軟に除外できます。

Utilities 名前空間を属性の除去から除外する XML ルールの例を次に示します。

<Rule name="unwanted attributes" feature="optimizations" exclude="false"> <Pattern>Utilities.*</Pattern> <Properties> <UnwantedAttributes>false</UnwantedAttributes> </Properties> </Rule>

「不要な属性の除去」の最適化を利用すると、Babel Obfuscator は不要な属性を取り除いてコードサイズを減らし、必要不可欠な情報だけが難読化されたアセンブリに残るようにして、難読化されたコードを最適化します。

System.Enum 型の除去

列挙型の除去は、Babel Obfuscator が提供する最適化機能で、ターゲットアセンブリ内で定義された System.Enum 型を除去します。この最適化手法は、列挙型のフィールドを対応する値に置き換えます。その結果、コードベースがよりコンパクトになり、フィールド名の代わりに定数値が使われるため、逆アセンブルされたコードが理解しにくくなります。

コマンドライン

列挙型の除去は、コマンドラインで Babel の実行時に --enumremoval オプションを使って有効にできます。たとえば、次のように指定します。

babel myapp.exe --enumremoval

このコマンドは、難読化されたアセンブリから System.Enum 型を除去する最適化を有効にします。

MSBuild の Babel タスク

MSBuild の Babel タスクで列挙型の除去を有効にするには、<PropertyGroup> 要素内で <EnumRemoval> プロパティを true に設定します。

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

XML ルール

Babel の XML ルールには EnumRemoval というルールプロパティがあり、特定の列挙型を選択的に含めたり除外したりできます。それには、特定のパターンや名前空間に対する動作を指定する XML ルールを定義します。Utilities 名前空間を列挙型の除去から除外する XML ルールの例を次に示します。

<Rule name="enum removal" feature="optimizations" exclude="false"> <Pattern>Utilities.*</Pattern> <Properties> <EnumRemoval>false</EnumRemoval> </Properties> </Rule>

このルールを使うと、Utilities 名前空間内の列挙型は、最適化の処理で除去されません。

System.Enum 型の除去の最適化には、いくつかの利点があります。まず、難読化されたアセンブリのサイズが小さくなり、ディスク容量を節約できます。次に、列挙型のフィールドを対応する値に置き換えることで、逆アセンブルされたコードに難読化と複雑さのレイヤーが 1 つ加わり、攻撃者が基になるロジックや動作を理解することがより難しくなります。

Babel Obfuscator の System.Enum 型の除去の最適化を活用することで、コードベースのセキュリティを高めて整合性を保護しながら、難読化されたアセンブリのサイズと読みやすさを最適化できます。

Disgregate Removal

Disgregate Removal(プロパティとイベントのメタデータ除去)は、Babel Obfuscator が提供する最適化機能で、プロパティとイベントの情報をそれぞれのメタデータテーブルから除去します。この最適化手法では、プロパティの get_ メソッドと set_ メソッド、およびイベントの add_ メソッドと remove_ メソッドを、通常のメソッドに変換します。このメタデータを除去してメソッドを変換することで、メタデータのサイズが小さくなります。また、リネームと組み合わせると難読化が強化され、元のプロパティやイベントの復元がより難しくなります。

コマンドライン

プロパティとイベントのメタデータの除去を有効にするには、コマンドラインで Babel の実行時に --disgregateremoval オプションを使用します。たとえば、次のように指定します。

babel.exe myapp.exe --disgregateremoval

このコマンドは、難読化されたアセンブリからプロパティとイベントのメタデータを除去する最適化を有効にします。

MSBuild の Babel タスク

MSBuild の Babel タスクで Disgregate Removal を有効にするには、<PropertyGroup> 要素内で <DisgregateRemoval> プロパティを true に設定します。

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

XML ルール

さらに Babel では、XML ルールを使って、プロパティとイベントのメタデータ除去を選択的に有効または無効にできます。XML ルールを定義することで、特定のパターンや名前空間に対する動作を指定できます。Utilities 名前空間について Disgregate Removal を無効にする XML ルールの例を次に示します。

<Rule name="disgregate removal" feature="optimizations" exclude="false"> <Pattern>Utilities.*</Pattern> <Properties> <DisgregateRemoval>false</DisgregateRemoval> </Properties> </Rule>

このルールを使うと、Utilities 名前空間内のプロパティとイベントは、難読化の処理中に Disgregate Removal の最適化の対象になりません。

Disgregate Removal の最適化には、いくつかの利点があります。まず、メタデータテーブルのサイズが小さくなり、難読化されたアセンブリがよりコンパクトになります。次に、リネームと組み合わせるとコードベース全体の難読化が向上し、攻撃者が元のプロパティとイベントを理解して復元することがより難しくなります。

Babel Obfuscator の Disgregate Removal の最適化を利用することで、コードのセキュリティと保護を高め、難読化されたアセンブリのサイズを最適化し、コード構造に複雑さのレイヤーを 1 つ加えて、リバースエンジニアリングをより難しくできます。

Last updated on