Dotfuscator には、すべてのクラス、メソッド、フィールド、プロパティ、およびイベントの名前を意味のない名前に変更する機能があります。逆コンパイルの出力を非常に理解しづらくするだけでなく、生成される実行可能ファイルのサイズが小さくなります。
例 :
処理前 | 処理後 |
---|---|
何らかの種類のリフレクション(XAML を含む)、エントリ ポイントを指定する構成ファイル、他のアプリケーションから呼び出されるライブラリなどを使用している場合に、名前の変更で問題が発生することがあります。そのような問題が存在していないことを確認するために、名前の変更後、アプリケーションを十分にテストすることが重要です。
ライブラリ モードはオフになっていると推定し、Dotfuscator はできる限りすべての名前を変更しようとします。リフレクションの特定の使用法が原因で、Dotfuscator は名前の変更時に、特定のエンティティへのすべての参照を更新できないことがあります。次の例では、4 つのクラスとそのフィールドを対象から除外しています。
サンプルのアプリケーションは、これらの型やメンバーを参照する場合、リフレクションを使用してそれらの名前を検索しています。名前が変更されると、アプリケーションは実行時にそれらを見つけられなくなる可能性があります。そのため、対応するチェック ボックスを使用して、名前の変更処理の対象からこれらを除外しています。
特定のコーディング規約のために、多数の特定の対象除外を作成しなければならない状況がある可能性があります。作成した後も、開発者はその規約に従うコードを追加した場合には、その新しいコードのために、さらにもう 1 つ特定の対象除外を作成することを覚えておかなければなりません。
これの解決策が、カスタム対象除外規則です。前の例から、型名が "Dungeon" で終わるすべての型と、それらの型内の特定の型のフィールドは、何らかの理由で名前の変更対象から除外される必要があることがわかったとします。多数の特定の対象除外を作成するかわりに、1 つのカスタム規則を作成することができます。
規則は右ペインに表示されます。
[型の追加]ボタンを使って規則のルート ノードを追加し、それに .*Dungeon
という名前を付けます。正規表現(regex
)オプションを true
に設定して、この名前を正規表現として扱う必要があることを示します。これにより、ノードは、型名が "Dungeon" で終わる型と一致します。[型を除外する](excludetype
)を true
に設定しているので、この名前に一致するあらゆる型が名前の変更対象から除外されます。もし、このオプションを false
に設定した場合には、一致する型は名前の変更対象から除外されません。それらの子ノードによって指定されるメンバーのみが除外されます。
次に、ルート ノードを右クリックし、この場合は[フィールドの追加]を選択して子ノードを追加します。このノードの名前を .*
とし、この名前も正規表現として扱う必要があることを示します。パブリック アクセス修飾子を持ち(+public
を設定する)、署名が string[]
であるフィールドのみを対象とするように規則を制限します。このシナリオには両方が必要です。
規則が構成されたら、ノードを選択して[プレビュー]ボタンをクリックすることができます。クリックすると、左側のツリー ビューで、カスタム規則に一致するエントリが強調表示されます。この例では、子ノードをプレビューしているので、条件に一致するフィールドが強調表示されています。"AdventureGame.Validation" の "Key" フィールドは除外されていないことに注目してください。これは、フィールドはこの子ノードに一致していますが、その親の型は親ノードに一致していない(つまり、クラス名 "Validation" は "Dungeon" で終わっていない)からです。
この結果として生じるカスタム規則の構成は、XML として構成ファイルに格納されます。この例では、次のような設定の XML が生成されます。
<type name=".*Dungeon" regex="true">
<field name=".*" speclist="+public" signature="string[]" regex="true" />
</type>
組み込み規則は、普遍的にかなり役立つカスタム対象除外規則です。既定で組み込まれているため、ユーザーはそれらを再実装する必要はありません。
それぞれの正確な定義は、%ProgramData%\PreEmptive Solutions\Common\dotfuscatorReferenceRule_v1.4.xml
に記載されています。
たとえば、System.Web.Services 属性を持つメソッドは、次のカスタム規則に変換されます。
<excludelist>
<type name=".*" regex="true" excludetype="false">
<comment>Exclude all methods that are decorated with attributes from the System.Web.services namespace.</comment>
<method name=".*" regex="true">
<customattribute name="System.Web.Services.*" regex="true" />
</method>
</type>
</excludelist>
[名前の変更]の[オプション]タブには、利用できる名前の変更オプションが多数あります。どの名前の変更規則を使用するか、明示的なメソッドのオーバーライドを導入するかどうかなど、その他多くのオプションが含まれます。これらについては、『Dotfuscator ユーザーズ ガイド』に詳しく説明されています。
この機能を有効にすると、Dotfuscator は、メソッドの戻り値の型またはフィールドの型を、メソッドまたはフィールドの一意性を判断するときの条件として使用できるようにすることによって、Overload-Induction(オーバーロード誘導)を拡張します。この機能により、名前変更されたメソッド名およびフィールド名の重複性を最大 15% まで高めることができます。さらに、戻り値の型やフィールドの型によるオーバーロードは(C#、VB などの)ソース言語では許可されていないので、逆コンパイルをいっそう困難なものにします。
メモ:XAML コードを含んでいるアセンブリについては、実行時に XAML とコードのリンク方法が決定されることから、通常、オーバーロード誘導は実行されません。結果として、[拡張オーバーロード誘導を使用する]オプションによって、このようなアセンブリが変更されることはありません。
Dotfuscator ユーザーズ ガイド:
Dotfuscator バージョン 4.28.1.5015. Copyright © 2017 PreEmptive Solutions, LLC