難読化エージェント
難読化の処理中、Babel はあらかじめ定義された一連のルールに基づいて、さまざまなタスクを実行できます。このルールの集まりを難読化エージェントと呼びます。
エージェントは、難読化によって生じ、結果のアセンブリを壊すおそれのある一般的な問題を避けるように設計されています。たとえばエージェントは、リフレクションで使用されるシンボルなど、特定のシンボルが難読化されないようにします。こうしたシンボルを難読化すると、ランタイム環境で問題が起こり、エラーやクラッシュにつながることがあるためです。
そのために、エージェントはターゲットアセンブリに対して一連のタスクを実行します。これらのタスクはあらかじめ構成されており、複雑さはさまざまです。シリアル化可能な型のフィールドの確認のように単純なものもあれば、MSIL コードの静的解析のように高度な手法を使うものもあります。
Babel Obfuscator で使用できるエージェントタスクの名前は次のとおりです。
| タスク名 | 説明 |
|---|---|
| Base types | 指定した基本型から派生した型のリネームを防ぎます |
| Code analysis | コード解析用に予約された型のリネームを防ぎます |
| Dynamic language | 動的言語ランタイムが使用するシンボルのリネームを防ぎます |
| Exposed attributes | 特定の属性を持つシンボルのリネームを防ぎます |
| Razor webapp | Razor Web アプリの難読化を処理します |
| Reflected enums | リフレクションで使用される列挙型のリネームを防ぎます |
| Reflected strings | リフレクションで使用される文字列の難読化を防ぎます |
| Reflected types | リフレクションで使用される型のリネームを防ぎます |
| Serializable types | シリアル化可能な型のリネームを防ぎます |
| WinRT types | WinRT のプライベート型のリネームを防ぎます |
難読化エージェントのタスクは、製品の新しいリリースのたびに更新されます。そのため Babel は常に最新の CLR の設計規則に対応しており、どのシンボルを難読化すべきで、どのシンボルを難読化すべきでないかを正確に判断できます。
あらかじめ定義されたこれらのルールに従うことで、Babel Obfuscator は、難読化されたコードが完全に機能し、アプリケーションを壊すおそれのある問題が起こらないようにします。
全体として、難読化エージェントは Babel の重要なコンポーネントです。CLR の設計規則に反してシンボル名が難読化されるのを防ぐことで、.NET アプリケーションを確実に保護できるようにします。
エージェントのルールの上書き
難読化エージェントは既定で有効になっています。難読化が正しく行われるように、可能な限り有効のままにしてください。エージェントを無効にすると、ランタイム環境で問題が起こり、エラーやアプリケーションのクラッシュにつながることがあるため、一般にはお勧めしません。ただし、特定の難読化結果を得るために、一部のエージェントタスクを無効にしたい場合もあります。
重要な点として、エージェントタスクはルールの処理フェーズの後に実行されます。つまり、メンバーに対して強制されていないカスタム XML ルールは、エージェントタスクによって上書きされます。そのため、既定の設定を変更する前に、エージェントタスクを無効にしたりカスタマイズしたりした場合の影響を慎重に検討してください。
XML ルールを使うと、特定のエージェントタスクをスキップできます。それには、agent 機能を対象とする除外ルールを定義し、ルールの Properties 要素の子である TaskNameList 要素に、スキップするタスクの名前を指定します。これにより、指定したタスクは難読化の際に実行されなくなります。
たとえば、「Serializable types」タスクと「Reflected strings」タスクを無効にするには、次のような XML ルールを定義します。
<Rule name="rule1" feature="agent" exclude="true">
<Pattern>ACME.Data.*</Pattern>
<Properties>
<TaskNameList>Serializable types;Reflected strings</TaskNameList>
</Properties>
</Rule>「agent」機能を対象とするこのルールでは、exclude 属性が「true」に設定されています。これにより Babel Obfuscator は、アセンブリの処理時にエージェントタスクの Serializable types と「Reflected strings」を実行しません。
タスクを無効にすると、実行時に予期しない問題が起こることがあるため、常に無効にできるとは限りません。そこで、特定のシンボルについて目的の難読化結果を得る方法の 1 つが、XML ルールを使い、locked 属性を「true」に設定してルールを強制することです。こうすると、エージェントはそのルールを上書きできません。
<Rule name="rule1" feature="renaming" exclude="false" locked="true">
<Target>Classes</Target>
<Pattern>ACME.Data.*</Pattern>
<Description>Force renaming of all types in ACME.Data namespace,
including serializable ones.
</Description>
</Rule>このルールは、シリアル化可能な型もすべて含めて、ACME.Data 名前空間内のすべてのクラスのリネームを強制します。