[名前の変更]エディターには、設定用の 3 つのタブがあります。[除外]タブは、カスタム対象除外規則をグラフィカルに設定する場合に使用します。[オプション]タブは、名前の変更に関係するその他のオプションを構成する場合に使用します。[組み込み規則]タブは、カスタム規則の記述が不要で、一般的な名前変更の対象除外規則を実行する場合に使用します。
[名前の変更]エディターの[オプション]タブ
[名前の変更]エディターの[オプション]タブは、名前の変更オプションを設定したり、増分難読化に使用する割り当てファイルを指定する場合に使用します。
[名前の変更オプション]セクションには、拡張オーバーロード誘導を使用する、名前空間を保持する、階層を保持する、およびマネージ リソース名を保持するを選択または選択解除できる 4 つのチェック ボックスがあります。
使用する名前変更規則をドロップダウン ボックスの一覧から選択できます。 定義済みの名前変更規則は、名前の変更規則で説明しています。名前の変更規則とその制限事項については、ここをクリックしてください。
[名前の割り当てをランダムにする]チェック ボックスをオンにすると、非直線的な順序で新しい名前を割り当てます。 このため、英小文字の名前を {a, b, c, d,...} の順で割り当てるのではなく、{u, p, k, f,...} のように割り当てます。 このオプションは名前の変更規則で動作します。
[XML シリアライザーと互換性のある名前付きメンバーを作成する]チェック ボックスをオンにすると、名前の変更機能に追加規則が設定されます。 すべてのクラスおよびメンバーの名前は、XML シリアル化を許可する方法で変更されます。 XML シリアル化と名前の変更を参照してください。
[型名プレフィックス]チェック ボックスをオンにすることによって、名前の変更に使用するプレフィックスを選択することができます。 テキスト ボックスに入力した文字列が、難読化処理されたすべての型名の先頭に付加されます。 文字列を何も入力しないと、Dotfuscator が入力モジュールごとに、モジュール名を基に適宜プレフィックスを生成します。 名前の変更プレフィックスの詳細については、名前の変更プレフィックスを参照してください。
[入力割り当てファイル]セクションでは、Dotfuscator が連続して実行された場合にも名前付け規則が保持されるように、以前の実行で使用した割り当てファイルを指定できます。これは「増分難読化」として知られている処理です。 この機能の詳細については、「増分難読化」セクションを参照してください。 ここでは 2 とおりの方法を使用できます。 使用する割り当てファイル名およびパスがわかっている場合は、テキスト ボックスにファイル名とパスを直接入力できます。 もう 1 つの方法として、ファイル システムを参照して、ファイルを出力する適切な場所を選択することもできます。 テキスト ボックスの右側にある[参照]ボタンをクリックすると、[入力割り当てファイルの選択]ウィンドウが表示されます。このウィンドウには、ファイルの場所を参照するためのナビゲーション ツリーが表示されます。
ナビゲーションを簡単にするために、この画面の下部にはアスタリスク(*)の付いた注釈があり、出力割り当てファイルが、[設定]タブにある[レポート]-[名前の変更]タブで構成できることを通知しています。
拡張オーバーロード誘導によるメソッドの名前の変更
Dotfuscator は、メソッドの戻り値の型またはフィールドの型を、メソッドまたはフィールドの一意性を判断するときの条件として使用できるようにすることによって、Overload-Induction™(オーバーロード誘導)を拡張します。 この機能により、名前変更されたメソッド名およびフィールド名の重複性を最大 15% まで高めることができます。 さらに、戻り値の型やフィールドの型によるオーバーロードは(C#、VB などの)ソース言語では許可されていないので、逆コンパイルをいっそう困難なものにします。
この機能もアプリケーションのコンパイル時の解析に依存しています。 このため、リモート メソッド呼び出しはこの機能を利用できません。その理由は、同じ型のメソッドと戻り値の型だけが異なるリモート オブジェクトのメソッドを呼び出すときに、リモート処理があいまい一致の例外(ambiguous match exception)をスローするためです。 したがって、リモート処理を使用する場合には、2 つの選択肢があります。 1 つ目は、拡張オーバーロード誘導を使用しないことです。通常のオーバーロード誘導は行われ、まったく安全です。 2 つ目はリモート呼び出しされるクラスを名前の変更処理から除外することです。 このオプションをリモート呼び出しで使用することがないように、既定値ではこの機能は無効になっています。
同じような理由で、シリアル化可能とマークされているすべての型に対し、拡張オーバーロード誘導は自動的に抑制されています。 この動作が望ましくない場合は、構成ファイルの名前の変更セクションに enhancedOIOnSerializables
オプションを追加するか(名前の変更オプションを参照してください)、ユーザー インターフェイスの[名前の変更]エディターの[オプション]タブにある[シリアル化可能な型を対象とする]チェック ボックスをオンにすることによって、既定の動作を変更できます。
クラスの名前の変更オプション
完全なクラス名の変更
この既定の方法では、クラスおよび名前空間の名前は、新しい短い名前に変更されます。 この考え方は非常に単純です。 ここで挙げた例の場合、以下のようになります。
元の名前 | 変更後の名前 |
---|---|
Preemptive.Application.Main |
a |
Preemptive.Application.LoadData |
b |
Preemptive.Tools.BinaryTree |
c |
Preemptive.Tools.LinkedList |
d |
[名前空間を保持する]オプション
この方法は、名前空間の階層を保持したままクラスの名前を隠す方法としては優れています。 サイズの縮小効果や難読化の度合いはいくらか減少しますが、名前空間の名前は保持されます。 この方法は、難読化されたコードにリンクされている可能性のあるライブラリ、または難読化されたコードを既に使用しているアプリケーションにとっては有益です。 以下に、このような名前の変更の例を示します。
元の名前 | 変更後の名前 |
---|---|
Preemptive.Application.Main |
Preemptive.Application.a |
Preemptive.Application.LoadData |
Preemptive.Application.b |
Preemptive.Tools.BinaryTree |
Preemptive.Tools.a |
Preemptive.Tools.LinkedList |
Preemptive.Tools.b |
[階層を保持する]オプション
このオプションでは、名前空間やクラスの名前を変更しつつ、名前空間の階層を保持するように Dotfuscator に指示します。 たとえば、次のように指示します。
元の名前 | 変更後の名前 |
---|---|
Preemptive.Application.Main |
a.a.a |
Preemptive.Application.LoadData |
a.a.b |
Preemptive.Tools.BinaryTree |
a.b.a |
Preemptive.Tools.LinkedList |
a.b.b |
[マネージ リソース名を保持する]オプション
Dotfuscator では、名前が変更されたクラスと関連付けられるマネージ リソースの名前を自動的に変更します。これにより、それらが実行時に正しく読み込まれるようになります。プログラムでリソース名を作成してアプリケーションでマネージ リソースが読み込まれる場合は、マネージ リソース名を保持する
を選択してください。
名前の変更プレフィックス
ある種のケースにおいては、アセンブリ全体を通じてトップ レベルの型名として、たとえそれらの型が定義されているアセンブリ内でしか使用されない場合であっても、一意な名称を付与することが望ましいことがあります。 これは、すべてのアセンブリを一度に Dotfuscator で処理することにより実現します。 しかしながら、このやり方は必ずしもうまく行くとは限らないため、Dotfuscator を数回に分けて実行するような場合でも一意性を保持するために名前の変更プレフィックスを導入しました。
名前の変更プレフィックスは変更後の型名の先頭に付加されます。 このプレフィックスは、特定の Dotfuscator の実行時にすべてのアセンブリで使用されるようユーザーが指定することができます。あるいは、Dotfuscator 自身に対象となる型のモジュール名から適切なプレフィックスを生成させることもできます。
この機能の面白い利用方法としては、名前空間の誘導があります。 ピリオド(".")で終わる名前の変更プレフィックス(たとえば、"MY_PREFIX
.")を定義することにより、型の難読化処理結果をユーザーが定義した名前空間下に格納することができます。
例:
元の名前 | プレフィックス | 名前変更の種類 | 変更後の名前 |
---|---|---|---|
Application.Main |
[default] |
default |
MyApplicationa |
Application.LoadData |
myprefix |
default |
myprefixa |
Tools.BinaryTree |
myprefix |
keephierarchy |
a.myprefixa |
Tools.LinkedList |
myprefix |
keepnamespace |
Tools.myprefixa |
Tools.Proxy |
mynamespace. |
keepnamespace |
Tools.mynamespace.a |
名前の変更プレフィックスを構成するには、[名前の変更]の[オプション]サブ タブにある[型名プレフィックス]チェック ボックスをオンにします。 プレフィックスを自分で設定したい場合は、テキスト ボックスに入力します。空欄のままにしておけば、Dotfuscator にプレフィックスを生成させることができます。
XML シリアル化と名前の変更
Dotfuscator では、XML シリアライザーに準拠する方法でクラスやメンバーの名前を変更するように、名前の変更アルゴリズムをグローバルに切り替えることができます。 完全に難読化されたクラスをアプリケーションでシリアル化したい場合は、このモードで名前の変更機能を実行する必要があります。このモードは、シリアル化可能なクラスを名前の変更対象から除外する場合には必要ありません。
名前の変更機能がこのモードで実行されているときに従う規則の一覧は次のとおりです。
- 拡張オーバーロード誘導はオフになっています。
- すべての型のパブリック インスタンス プロパティおよびフィールドには、継承階層において一意な名前が与えられます。
- プロパティ メタデータは、
System.Xml.Serialization
名前空間のあらゆる属性で修飾されたプロパティに保持されます。 -
System.Collections.ICollection
インターフェイスを実装するパブリックの型では、Add
メソッドは名前の変更対象から除外され、プロパティ メタデータはItem
プロパティに保持されます。 -
System.Collections.IEnumerable
インターフェイスを実装するパブリックの型では、Add
メソッドおよびGetEnumerator
メソッドは名前の変更対象から除外されます。
このモードを設定する構成オプションについては、名前の変更オプションを参照してください。 このモードは[名前の変更]エディターの[オプション]タブで設定できます。
[名前の変更]エディターの[除外]タブ
[名前の変更]エディターの[除外]タブでは、プログラムに対する名前の変更処理の対象から除外する必要がある項目の設定を、あらゆる部分にわたってきめ細かく制御できます。
アプリケーションのツリー ビューを参照して、対象から除外する項目を確認し、特定の項目を名前の変更処理から除外できます。 また、除外の対象とする複数の項目を選択するための、独自のカスタム規則をビジュアルに作成することもできます。
作成した対象除外規則は、規則の結果をプレビューしながら、いつでも微調整することができます。 アプリケーションのツリー ビューでは、除外の対象として選択されたすべての項目が網掛け表示されます。 すべての規則を適用した場合の効果をプレビューすることも、選択した特定の規則の効果だけをプレビューすることもできます。
対象選択規則および対象除外規則の使用に関する詳細については、規則エディターを参照してください。
名前変更の除外規則の詳細については、名前の変更の対象除外規則を参照してください。
名前の変更の対象除外
対象除外リスト セクションは、入力アセンブリ名の変更を動的に微調整する方法を提供します。 ユーザーは、実行時に適用される規則のリストを指定します。 規則で特定のクラス、メソッド、またはフィールドを選択した場合、その項目の名前は変更されません。
これらの規則は、library オプションなどのオプションによって暗黙に適用される規則と併せて適用されます。
規則は論理的に OR
で結合されます。
名前空間、型、メソッド、またはフィールドの選択には、正規表現(RE)を使用できます。 これを実行するには、省略可能な regex
属性を使用します。 regex
の既定値は false です。 regex
が true の場合、name
属性の値は正規表現として解釈されます。regex
が false の場合、name は文字どおりに解釈されます。 正規表現は特定の文字(ピリオドなど)に特別な意味を割り当てているので、regex の値は重要です。
以下に、簡単な正規表現の例を示します。
.* すべてと一致
MyLibrar. MyLibrary、MyLibrari などと一致
My[\.]Test[\.]I.* My.Test.Int1、My.Test.Internal などと一致
Get.* GetInt、GetValue などと一致
Get* Ge、Get、Gett、Gettt などと一致
[名前の変更]エディターの[組み込み規則]タブ
Dotfuscator の[名前の変更]エディターの[組み込み規則]タブには、名前変更の対象除外規則が表示されます。 これらの規則は、特定のアプリケーションの種類またはテクノロジに適用される標準の対象除外です。 規則はそれぞれ解説文を持っており、自身が選択されたときにそれをフォームに表示します。 構成の組み込み規則は、対応するチェック ボックスをオンにすることによって有効にできます。
それぞれの規則の正確な定義は、インストール先の Common
サブディレクトリに記載されています。 この場所の典型的な例は、C:\Program Files (x86)\PreEmptive Protection Dotfuscator Professional A.B.C\Common
です。 この規則定義については、dotfuscatorReferenceRule
で始まる XML ファイルを参照してください。
関連