構成ファイル リファレンス
構成ファイルの編集方法については、保護の拡大または構成エディター インターフェイスを参照してください。
- バージョン
- プロパティ リストとプロパティ
- グローバル オプション セクション
- 入力管理
- library オプション
- Verbose、Quiet、Investigate オプション
- SuppressIldasmAttribute オプション
- デバッグ オプション
- NoDotfuscatorAttribute オプション
- 入力アセンブリ リスト
- ユーザー定義のアセンブリ ロード パス
- 出力ディレクトリ
- 一時ディレクトリ
- 難読化属性の機能割り当て
- 名前の変更セクション
- 制御フローの難読化セクション
- 文字列の暗号化セクション
- 除去セクション(不要コードの除去)
- リンク セクション
- PreMark セクション
- 署名セクション
- デジタル署名セクション
- EventList セクション
- PreEmptive Analytics セクション
- 拡張属性セクション
- SmartObfuscation セクション
- XML 構成ファイルに関する注意
- カスタム規則
Dotfuscator 構成ファイルには、任意の名前または拡張子を付けることができますが、通常の拡張子は .xml
です。
構成ファイルには、指定したアプリケーションがどのように難読化処理されるかについての情報が含まれています。
構成ファイルは、dotfuscator_v2.5.dtd
(またはそれ以前のもの)に準拠する XML ドキュメントです。
このセクションでは、Dotfuscator の XML 構成ファイルについて説明します。 構成ファイルを生成するために、Visual Studio、構成エディター、コマンドラインのいずれのインターフェイスを使用している場合にもリファレンスとして役立つように、各構成オプションを詳しく解説します。
バージョン
.xml ファイルの Version 属性は必須情報であり、ご利用になる Dotfuscator のバージョンに適合している必要があります。 Version 属性は、準拠する DTD のバージョン番号に一致する必要があります。 Dotfuscator のある時点のリリースは、以前のバージョンから変更されていない構成ファイルを使用できるように設計されています。 たとえば、Version 1.0 の構成ファイルを使用して Dotfuscator 1.1 を実行できます。このとき、構成ファイルを編集する必要はありません。
メモ:構成ファイルのバージョンは、必ずしも Dotfuscator のバージョンと同じであるとは限りません。Dotfuscator のどのバージョンも、同じバージョンではなくても特定のバージョンの構成ファイルを参照することを想定しています。
バージョン:
<dotfuscator version="2.2">
プロパティ リストとプロパティ
<propertylist>
(プロパティ リスト)セクションは省略可能であり、構成ファイルで後から利用される可能性のある(<プロパティ>
と呼ばれる)変数の定義および値の代入を行うことができます。
このセクションで定義したプロパティ定義は、構成プロパティと呼ばれます。
構成プロパティ:
<!-- 拡張可能なプロパティを定義します -->
<!-- 省略可能 -->
<propertylist>
<property name="name" value="myapp"/>
<property name="outdir" value="c:\myapp\out"/>
</propertylist>
変数またはプロパティ参照は、このセクション内で定義しなくても、構成ファイル内で使用することはできます。 たとえば、コマンド ラインで変数を定義したり、環境変数を利用することができます。 プロパティは、次のアルゴリズムを使用してそのプロパティに関連付けられた値を検索し、文字列の置き換えを行うことによって機能します。
- 外部のプロパティ リストで値を確認します。
- 見つからない場合は、プロパティと同じ名前の環境変数を確認します。
- それでも見つからない場合は、構成ファイルの propertylist セクションに構成の定義がないかどうかをチェックします。
- それでも見つからない場合は、値に空の文字列を使用します。
外部のプロパティは、–p
オプションを使用して、コマンド ラインから渡されます。
組み込みの外部プロパティには次の 3 つがあります。
applicationdir
。Dotfuscator のインストール ディレクトリを表しますappdatadir
。Dotfuscator のローカル データ ディレクトリを表しますconfigdir
。構成ファイルが存在するディレクトリを示します
プロパティは、構成ファイルの作成に役立ちます。この構成ファイルは、複数のアプリケーションや同じアプリケーションのさまざまなバージョン、あるいはさまざまなビルド環境間での移植を容易にするテンプレートとしての役割を果たします。 プロパティは、次の構文で参照されます。
プロパティの構文:
${property_name}
プロパティ参照は大文字と小文字を区別するので、${OutDir}
は ${outdir}
とは異なるプロパティを参照します。
現在、プロパティの参照は、<file>
要素の dir
属性または name
属性の値としてのみ使用でき、構成ファイルのどの場所でも使用できるわけではありません。
<file>
要素を使用するセクションの一覧は以下のとおりです。
- inputassembly
- mapinput
- mapoutput
- output
- tempdir
- assembly
- removalreport
- transform
- key
- loadpaths
- program
- filelist
- smartobfuscationreport
- pfx
プロパティ参照は、構成ファイル内のその他の場所では文字どおりに解釈されます。 プロパティ参照は、入れ子にすることはできません。入れ子にすると、エラーになります。
プロパティ参照の使用例:
<output>
<file dir="${testdir}\output"/>
</output>
グローバル オプション セクション
グローバル オプション セクションは、実行全体にわたって適用する構成オプションを定義するためにあります。 このセクションでは、各オプションについて詳しく説明します。このセクションは必須ではありません。
メモ:オプションは大文字と小文字を区別しません。
入力管理
入力管理には、manual
(既定値)と automatic
の 2 つのモードがあります。
このオプションは、処理する入力を Dotfuscator で決定する方法を制御します。
manual
は、Dotfuscate タスクが MSBuild から呼び出されたときに InputAssemblies プロパティからの入力と構成ファイルに列挙された入力をマージすることを指定します。
このマージは、Dotfuscate が呼び出されるたびに行われますが、構成ファイルを変更するものではありません。
automatic
は、Dotfuscate タスクが MSBuild から呼び出されたときに InputAssemblies プロパティに指定された入力のみを使用することを指定します。
構成ファイルに指定された入力は無視されます。
Dotfuscate タスクの一環として、構成ファイルは、タスクに指定された入力内容を反映するよう自動的に更新されます。
このため、Dotfuscator 構成エディターで構成ファイルを開いた場合は、MSBuild によって判別された直近の入力に照らして構成を変更することができます。
この設定に関係なく、ビルド時に Dotfuscate タスクに指定された Properties のプロパティ値は、構成ファイルに指定されたプロパティ値と(ビルド時に)マージされます。 ただし、Properties は保存されません。
メモ:
automatic
の値は、Dotfuscate
MSBuild タスクでのみ使用できます。automatic
を有効にした場合には、Dotfuscator 構成エディターやコマンド ラインでビルドを行うことはできなくなります。
メモ:入力管理設定が
automatic
の場合には、リンクはサポートされません。
入力管理設定:
<global>
<input_management>automatic</input_management>
</global>
library オプション
このオプションは Dotfuscator 3.0 で非推奨となり、 個々の入力アセンブリに対して適用できる、より詳細な library オプションに置き換えられました。 Dotfuscator が旧バージョンの構成ファイルを読み込んだ場合にも、このオプションは有効なものとして処理されますが、構成エディターでその構成ファイルを保存すると、新しいオプションが使用されます。 アセンブリ単位のライブラリ モードを参照してください。
library オプション:
<global>
<!— library オプションを設定します -->
<option>library</option>
</global>
Verbose、Quiet、Investigate オプション
これらのオプションは、対応するコマンド ライン オプションと同じであり、構成ファイルまたはコマンド ラインを使って有効にすることができます。 コマンド ラインからオプションの設定を解除する方法はありません。
Verbose、Quiet、Investigate オプション:
<global>
<!-- 詳細表示モードで実行します -->
<option>verbose</option>
<!-- メッセージ非表示モードで実行します -->
<option>quiet</option>
<!-- 調査のみを実行して割り当てファイルを生成します -->
<option>investigate</option>
</global>
SuppressIldasmAttribute オプション
このオプションを設定することにより、Microsoft の Ildasm ユーティリティがアセンブリ IL を表示しないよう Dotfuscator に指示します。 これは .NET 2.0 以上を対象とするアセンブリにのみ有効です。
SuppressIldasm オプション:
<global>
<option>suppressildasm</option>
</global>
デバッグ オプション
Dotfuscator では、下記のオプションのいずれかを設定することで、出力アセンブリと一緒にデバッグ シンボルを生成させることができます。
これらのオプションは、コマンド ラインでの /debug
スイッチや構成エディター内のデバッグ シンボルの出力オプションに相当します。
構成ファイルのグローバル オプション | コマンド ライン スイッチ | 構成エディターの説明 |
---|---|---|
(なし) | (なし) または /debug:off |
なし |
DebugAuto |
/debug:auto |
自動的に入力アセンブリに基づく |
Debug (非推奨) |
/debug:on |
JIT 最適化なし。PDB のシーケンス ポイント (非推奨) |
DebugImpl (非推奨) |
/debug:impl |
JIT 最適化なし。MSIL のシーケンス ポイントト (非推奨) |
DebugOpt (非推奨) |
/debug:opt |
JIT 最適化。MSIL のシーケンス ポイント (非推奨) |
Pdb (非推奨) |
/debug:pdb |
JIT 最適化。PDB のシーケンス ポイント (非推奨) |
デバッグ シンボルには、ソース ファイルのパス、ローカルの変数名、および行番号などの情報が含まれています。 通常、これらはアセンブリと同じディレクトリで個別の PDB ファイルに格納されます。 デバッガーはデバッグ時にこの情報を使用してブレーク ポイントを設定し、式の値を特定します。
デバッグ オプションの 1 つを有効にすると、入力アセンブリの既存のデバッグ シンボルを読み込み、Dotfuscator によって行われる変更を反映するために更新されたデバッグ シンボルを生成します。
その後、元のソース コードに対してアプリケーションのデバッグを続行し、難読化されたコードにブレーク ポイントを設定できます。
これらの設定は各アセンブリにアタッチされている DebuggableAttribute
にも作用します。これは、たとえば、JIT(ジャストインタイム)最適化を無効にするなど、デバッグを可能にする方法を .NET ランタイムに指定します。
デバッグ オプションが何も設定されないと、Dotfuscator は入力アセンブリ用にシンボルがあっても、出力アセンブリ用のデバッグ シンボルを生成しません。
入力アセンブリにある DebuggableAttribute
のインスタンスは出力アセンブリからは削除されます。
DebugAuto オプション
DebugAuto
オプションを使用すると、入力アセンブリのシンボルと同じ形式で、対応する出力アセンブリの更新済みデバッグ シンボルを自動的に作成します。
<global>
<option>debugauto</option>
</global>
この設定は、各入力アセンブリで存在するシンボルの種類に応じて、移植可能な PDB(Portable PDB) または元の .NET Framework 形式の PDB を生成できます。
入力アセンブリに、関連付けられているデバッグ シンボルがない場合、Dotfuscator は対応する出力シンボルを生成しません。
入力アセンブリに DebuggableAttribute
があると、それは "そのまま" 出力アセンブリに保持されます。
この設定は、.NET Core や .NET Standard アセンブリなど、mscorlib
アセンブリを参照しないアセンブリをサポートします。
この設定は .NET 1.0 または 1.1 をターゲットとするアセンブリはサポートしません。
その場合は、Debug
を使用してください。
Debug、DebugImpl、DebugOpt、および Pdb オプション
Dotfuscator では、これら 4 つのオプションそれぞれが、元の .NET Framework PDB 形式ですべての出力アセンブリ用のデバッグ シンボルを作成します。
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を無効にし
PDB ファイルのシーケンス ポイントを使用 -->
<global>
<option>debug</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を無効にし
アセンブリの IL の暗黙のシーケンス ポイントを使用-->
<global>
<option>debugimpl</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を次のように設定:
JIT 最適化を有効にし
アセンブリの IL の暗黙のシーケンス ポイントを使用-->
<global>
<option>debugopt</option>
</global>
<!-- PDB ファイルを作成し、
DebuggableAttribute を設定しない。ランタイムの既定値は次のとおり:
JIT 最適化は有効で、
PDB ファイルのシーケンス ポイントを使用 -->
<global>
<option>pdb</option>
</global>
これらの設定では、移植可能な PDB を使用する入力アセンブリでも、生成するのは 元の .NET Framework 形式の PDB のみです。
入力アセンブリに、関連付けられているデバッグ シンボルがない場合、Dotfuscator では高水準のソース言語(C# など)ではなく、.NET 中間言語(IL)に基づくソース ファイルと行番号情報で出力シンボルを生成します。
入力アセンブリにある DebuggableAttribute
は削除されます。
設定に応じて、新しい DebuggableAttribute
がアセンブリに追加され、その意味を上の XML コメントで説明します。
これらの設定がサポートされるのは、mscorlib
アセンブリを参照するアセンブリのみです。
これらのオプションのいずれかが指定され、入力アセンブリ(.NET Core または .NET Standard アセンブリなど)が mscorlib
を参照しない場合、その出力アセンブリにはデバッグ シンボルが含まれず、DebuggableAttribute
のインスタンスはすべて削除されます。
DebugImpl
、DebugOpt
、および Pdb
オプションは、.NET 2.0 以上を対象とするアンブリに対してサポートされます。
これらのオプションのいずれかが指定され、入力アセンブリが以前のバージョンの .NET を対象としている場合、その出力アセンブリにはデバッグ シンボルが含まれず、DebuggableAttribute
のインスタンスはすべて削除されます。
NoDotfuscatorAttribute オプション
Dotfuscator は既定値では、処理するアプリケーションに DotfuscatorAttribute
という名前のカスタム属性を挿入します。
この属性には、プログラムの難読化に使用する Dotfuscator のバージョンに関する情報が格納されます。この情報には製品 ID(Community あるいは Professional)とバージョン番号があります。
これの意図するところは次の 3 つです。
- プログラムに対して使用された Dotfuscator のバージョンを確認するため。
- Dotfuscator の将来のバージョンでは、この情報を使用して、入力として指定されたサード パーティ製のアセンブリが難読化処理済みであるかどうかを識別し、そうであった場合に特別な処置をするようにするため。
- PreEmptive Solutions 社は他社のツール ベンダーと協力して、難読化処理されたコードをデバッグする際の苦痛を和らげることに積極的に取り組んでおり、それらのツールがこの属性によって処理対象を識別できるようにするため。
上の事項が、「匿名の」難読化済みプログラムのセキュリティを向上させることほど重要でない場合、あるいはサイズを縮小させることの方が優先度が高い場合には、構成ファイル内に nodotfuscatorattribute
というオプションを手作業で設定することにより、このような属性の挿入を行わないようにできます。
NoDotfuscatorAttribute オプション:
<global>
<option>nodotfuscatorattribute</option>
</global>
入力アセンブリ リスト
入力アセンブリ リストには、難読化するアセンブリおよび/またはパッケージのファイル名とディレクトリを含めます。 また、パッケージまたはアセンブリ レベルで設定する構成オプションもここに含めます。
複数のモジュールから成るアセンブリの場合は、マニフェストを持つモジュールだけを含めます。
入力アセンブリ リスト:
<input>
<asmlist>
<inputassembly>
...
<file dir="c:\temp" name="myproj.dll"/>
</inputassembly>
...
</asmlist>
</input>
アセンブリ単位のライブラリ モード
入力アセンブリにライブラリ モードを指定するには、その入力アセンブリの <inputassembly>
要素に library
オプションを追加します。
<inputassembly>
<option>library</option>
...
</inputassembly>
アセンブリ単位の宣言による難読化
宣言による難読化の有効化と無効化
入力アセンブリに対する宣言による難読化を有効にするには、その入力アセンブリの <inputassembly>
要素に honorOAs
オプションを追加します。
<inputassembly>
<option>honoroas</option>
...
</inputassembly>
難読化属性の除去
入力アセンブリに対する難読化属性の除去を有効にするには、その入力アセンブリの <inputassembly>
要素に stripOA
オプションを追加します。
<inputassembly>
<option>stripoa</option>
...
</inputassembly>
アセンブリ単位の差し込み処理
Dotfuscator では、特定の入力アセンブリ用のコードの差し込みを制御することができます。 このオプションの設定が及ぼす影響については、[差し込み]エディターのセクションで説明します。
差し込みが有効になっている場合、Dotfuscator はインストルメンテーション属性とチェック属性を受け取り、不要なインストルメンテーション属性とチェック属性を出力アセンブリから除去します。 既定の動作は、次のオプションの一方または両方を指定することにより、入力アセンブリ レベルで変更できます。
nohonorsos
は、アセンブリで宣言されたインストルメンテーション属性とチェック属性を Dotfuscator が処理できないようにします。nostripsos
は、インストルメンテーション属性とチェック属性の処理後、アセンブリからそれらの不要な属性を Dotfuscator が除去しないようにします。
アセンブリ単位の差し込み処理:
<inputassembly>
<!-- インストルメンテーション属性とチェック属性を除去しません -->
<option>nostripsos</option>
<!-- インストルメンテーション属性とチェック属性を使用しません -->
<option>nohonorsos</option>
...
</inputassembly>
アセンブリ単位の XAML の変換モード
この設定は、特定の入力アセンブリに次のマークアップを含めることができることを Dotfuscator に示します。そのマークアップは、Silverlight アプリケーションで用いられる XAML、あるいは Windows Presentation Foundation アプリケーションで用いられるコンパイル済みの XAML リソース(BAML)です。いずれのマークアップも、名前変更のために分析され対象に加えられます。 Dotfuscator で処理するため、変換されるマークアップは要素の分離コード参照とともに名前変更される識別子を持ちます。 マークアップ リソースから参照されるプロパティは、そのプロパティ メタデータは保持されますが、名前が変更されます。
入力アセンブリに XAML の変換モードを指定するには、その入力アセンブリの <inputassembly>
要素に <option>
要素を追加します。
アセンブリ単位の XAML の変換モード:
<inputassembly>
<option>transformxaml</option>
<file dir="c:\temp" name="myproj.dll"/>
</inputassembly>
ユーザー定義のアセンブリ ロード パス
入力アセンブリ内で使用している型の情報を知るためには、入力アセンブリによって参照されるアセンブリを読み込む必要があります。 Dotfuscator は、Visual Studio や CLR 自体で使用される規則に類似した検索規則を使用します。
既定値の検索規則では参照されるアセンブリが見つからない場合のために、検索するディレクトリを追加指定する手段が用意されています。 Dotfuscator はアルゴリズムの最終ステップとして、これらのディレクトリを指定された順序で検索します。 ただし、追加オプション(プロパティおよび[設定]タブの[アセンブリ ロード パス]にある[最初に検索]チェック ボックス)が使用されていると、Dotfuscator はその標準検索を適用する前にロード パスから検索します。
ユーザー定義のアセンブリ ロード パスを XML 構成ファイルに追加するには、次のようにします。
ユーザー定義のアセンブリ ロード パスの追加:
<input>
<loadpaths>
<option>prepend</option>
<file dir="C:\temp" />
...
</loadpaths>
....
</input>
出力ディレクトリ
これは、出力アセンブリが書き込まれるディレクトリです。 アプリケーションは無条件に、このディレクトリにあるファイルを常に上書きします。
出力ディレクトリ:
<!-- 出力先ディレクトリが必要です -->
<output>
<file dir="c:\work"/>
</output>
一時ディレクトリ
このセクションは省略可能であり、Dotfuscator の作業ディレクトリを指定します。 指定しない場合、既定値であるシステムの一時ディレクトリが作業ディレクトリになります。 アプリケーションは、作業ディレクトリを使用して入力アセンブリで ildasm および ilasm を実行します。 逆アセンブルされた出力は、入力アセンブリに埋め込まれたすべてのリソースと共に、このディレクトリに格納されます。 これらのファイルは、処理の終了後、自動的に削除されます。
一時ディレクトリ:
<!-- 一時ディレクトリは省略可能です -->
<!-- 指定しない場合はシステムの一時ディレクトリが既定値として使用されます -->
<tempdir>
<file dir="c:\temp"/>
</tempdir>
難読化属性の機能割り当て
機能割り当ては、宣言による難読化のための機能です。 Dotfuscator の「宣言による難読化」のサポートの詳細については、カスタム属性を使用した宣言による難読化を参照してください。 このセクションでは、機能割り当てについて説明し、Dotfuscator が認識するネイティブな機能文字列を紹介します。
構成ファイル内の <obfuscationattributemap>
要素は、難読化属性の feature プロパティから取得した文字列を、Dotfuscator が認識する 1 つ以上の機能文字列に割り当てる場所です。
これらの割り当ては、XML 構成ファイル内で次のように指定します。
難読化属性の機能割り当て:
<obfuscationattributemap>
<feature name="testmode">renaming, controlflow</feature>
</obfuscationattributemap>
名前の変更セクション
名前の変更セクションでは、ユーザーは入力割り当てファイルおよび出力割り当てファイルの場所や、名前の変更から項目を除外するための詳細な規則など、名前の変更に固有のオプションを指定できます。
名前の変更セクションは省略可能です。 このセクションが存在しない場合は、以下の既定の処理が適用されます。
- 既定の名前の変更が行われます(名前空間は削除されます)。
loweralpha
の名前変更規則を使って新しい名前が選択されます。- 割り当てファイルは増分難読化の読み取りを行いません。
- 割り当てファイルは {CurrentWorkingDir}/Dotfuscator/Map.xml に書き込まれます。
- アプリケーションの種類に従って行われる対象除外以上の除外は行われません。
「識別子の名前の変更」セクションでは、名前の変更オプション、割り当てファイル、およびカスタム対象除外について詳しく説明します。 以下のセクションでは、それぞれの概要を説明します。
名前の変更規則
Dotfuscator では、難読化処理時に識別子の名前を生成するためのアルゴリズムがいくつか定義されており、その中から選んで使用できます。
- Lower Alpha:これは、Dotfuscator のすべてのバージョンにおける名前の変更規則の既定値で、小文字の英文字を使用します。
{a,b,c,...}
- Upper Alpha:この規則では、大文字の英文字を使用します。
{A,B,C,...}
- Numeric:この規則では、数字だけを使用します。
{0,1,2,...}
- Unprintable:この規則では、Unicode の上位部分にある印字不能文字群を使用します。
名前の変更規則は、<renaming>
要素の属性として指定します。
使用できる値は、loweralpha
、upperalpha
、numeric
、または unprintable
です。
名前の変更規則:
<renaming scheme="unprintable">
...
</renaming>
名前の変更オプション
Dotfuscator には、名前の変更アルゴリズムが名前空間
を処理する方法を決定するためのオプションがいくつか用意されています。
すなわち、"keepnamespace
" と "keephierarchy
" です。これらについては、識別子の名前の変更で詳しく説明します。
Dotfuscator では、難読化された型名に対し、既定値の文字列またはユーザー指定の文字列をプレフィックスとして付加するように指定できます。
この機能を使用する場合は、prefix
オプションを指定します。
詳細については、名前の変更プレフィックスを参照してください。
名前の変更プレフィックス機能の有効化:
<renaming>
<!-- 次の設定により、名前変更のプレフィックス機能が有効になります -->
<option>prefix</option>
...
</renaming>
Dotfuscator では、戻り値の型を使用する拡張オーバーロード誘導も使用できます。
この機能を有効にするためのオプションは enhancedOI
です。このオプションについては、オーバーロード誘導によるメソッドの名前の変更で詳しく説明します。
拡張オーバーロード誘導の適用:
<renaming> <!-- 拡張オーバーロード誘導を適用します-->
<option>enhancedOI</option>
...
</renaming>
拡張オーバーロード誘導は、既定では、シリアル化可能とマークされているクラスには適用されません。
シリアル化可能な型も含め、すべての型に拡張オーバーロード誘導を適用したい場合は、enhancedOIOnSerializables
オプションを使用します。
拡張オーバーロード誘導シリアル化オプションの適用:
<renaming>
<!-- シリアル化可能な型にも拡張オーバーロード誘導を適用します-->
<option>enhancedOIOnSerializables</option>
...
</renaming>
XML シリアライザーと互換性のある方法で型やメンバーの名前を変更するように、名前の変更アルゴリズムを変更することができます。
名前の変更アルゴリズムを変更して XML シリアライザーとの互換性を保つ:
<renaming>
<!-- XML シリアル化の互換性-->
<option>xmlserialization</option>
...
</renaming>
詳細については、XML シリアル化と名前の変更を参照してください。
名前の変更オプションの <explicitoverrides>
を使用すると、Dotfuscator は明示的な(構文上でない)メソッドのオーバーライドを導入することによって、より多くのメソッドの名前を変更できるようになります。
つまり、オーバーライドされるメソッドが、オーバーライドするメソッドとは異なる名前を持つことができます。
たとえば、メソッドで Object.ToString() をオーバーライドする場合、通常、Dotfuscator はオーバーライドの関係を壊さないで名前を変更することはできません。これは、一般的に入力アセンブリには Object クラスがないため、ToString() の名前は変更されないからです。
この設定を有効にすると、Dotfuscator はオーバーライドするメソッドの名前を変更でき、そのメソッドが Object.ToString() をオーバーライドするように意図して作られていることを CLR に指示するメタデータを導入できます。
詳細については、名前の変更時、明示的なメソッドのオーバーライドを導入するを参照してください。
明示的なメソッドのオーバーライドを導入する:
<renaming>
<!-- オーバーライドされるメソッドが、オーバーライドするメソッドとは
異なる名前を持つことができます -->
<option>explicitoverrides</option>
</renaming>
オーバーロードされたメソッドが同じ名前になるようにしたい場合は、名前の変更オプションの <explicitoverrides>
を使用しないでください。
<randomizeRenaming>
オプションを使用すると Dotfuscator は非直線的な順序で新しい名前を割り当てます。
このため、英小文字の名前を {a, b, c, d,...} の順で割り当てるのではなく、{u, p, k, f,...} のように割り当てます。
このオプションは名前の変更規則で動作します。
名前のランダムな割り当てを使用する
<renaming>
<!-- 名前のランダムな割り当てを使用する -->
<option>randomizeRenaming</option>
...
</renaming>
メモ:名前の変更オプションは、大文字と小文字を区別しません。
名前の変更の対象除外リスト
このセクションは、入力アセンブリの名前変更を動的に微調整する方法を提供します。 このセクションには、実行時に適用される "対象除外規則" のリストを含めることができます。 規則で特定のクラス、メソッド、フィールド、プロパティ、またはイベントを選択した場合、その項目の名前は変更されません。
- これらの規則は、library オプションなどのグローバル オプションが暗黙に適用される規則と共に適用されます。
- 各規則は論理的に
OR
で結合されるため、1 つでも規則にマッチした項目の名前は変更されません。 - 対象除外リストは、型、メソッド、フィールド、プロパティ、イベント、アセンブリ、モジュール、または名前空間による名前の除外をサポートしています。
- 各種規則については、識別子の名前の変更で詳しく説明します。
名前の変更の参照規則
参照規則を使用すると、外部ファイルから規則をインポートして、構成間で共有できるようになります。
Dotfuscator の組み込みの名前の変更規則は、これを使用して %ProgramData%\PreEmptive Solutions\Common から規則をインポートしています。
規則は rulekey
属性で参照されます。値には、参照される規則に定義した GUID を指定します。
参照規則リスト:
<referencerulelist>
<referencerule rulekey="{0D471A86-E98F-4493-849B-85BD4CC884A1}"/>
<referencerule rulekey="{C9D9BF84-4F0D-4e9f-B3EC-3038235AE741}"/>
</referencerulelist>
出力割り当てファイル
この機能は、特定の実行中に Dotfuscator が使用したすべての名前の変更割り当てのログを作成します。 これは、統計セクションも提供します。
このオプションを指定することで、Dotfuscator の名前の変更機能に対し、名前の変更がどのように行われたかを追跡記録するよう指示できます。その結果、ユーザーは名前の変更状況をすぐに調査できるほか、今後 Dotfuscator を実行する際に入力として使用することができます。 このオプションで作成されるファイルは、その後増分入力ファイル オプションで使用されます。
このファイルを不注意で失ってしまうと、将来のアプリケーションの増分更新の機会を失う可能性があります。 そのため、このファイルを適切にバックアップしておくことが非常に重要になります。 このような理由から、Dotfuscator は(同じ名前の)既存のファイルが検出された場合には、自動的にそのファイルの名前を変更してから、新しい割り当てファイルで既存の割り当てファイルを上書きするようになっています。
Dotfuscator に既存の割り当てファイルの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性を設定します。
割り当てファイルの形式については、識別子の名前の変更で説明します。
属性を上書きに設定する:
<renaming>
...
<mapping>
<mapoutput overwrite="true">
<file dir="c:\work" name="testout.xml"/>
</mapoutput>
</mapping>
</renaming>
HTML 形式の名前の変更レポート
出力割り当てファイルは、本来は解析向きの XML ドキュメントとしてフォーマットされます。
名前の変更レポートを判読可能にするために、出力割り当てファイルを HTML 形式のドキュメントに変換するよう指示することができます。
Dotfuscator は、あらかじめ定義されている XSL ドキュメントを出力割り当てファイルに適用することにより、変換処理を実施します。
既定の HTML レポートが好みでない場合は、任意で、変換に使用する XML ドキュメントに独自のものを指定できます。
出力レポートは、XML 形式の割り当てファイルと同じディレクトリに置かれます。
ファイル名は XML ファイルと同じで、拡張子が .xml
ではなく .html
になります。
HTML 形式の名前の変更レポート:
<renaming>
...
<mapping>
<mapoutput overwrite="true">
<file dir="c:\work" name="testout.xml"/>
<transform>
<!-- 独自の XSL ファイルの指定は任意です -->
<file dir="c:\mytransforms" name="map.xsl"/>
</transform>
</mapoutput>
</mapping>
</renaming>
入力割り当てファイル
Dotfuscator では、入力割り当てファイルによって、前回の Dotfuscator の実行で作成された名前をインポートすることができます(「増分難読化」として知られている処理です)。 Dotfuscator はクラス、メソッド、およびフィールドの名前を、入力割り当てファイルに示されている名前に変更するように最善の努力をします。
<mapinput>
要素に入力割り当てファイルを指定できます。
この要素には任意の obfuscatereferences
属性もありますが、記述しなければ既定値である "true
" になります。
この属性は、入力割り当てファイルに含まれているが、入力アセンブリのセット内には定義されていない名前を Dotfuscator でどのように処理するかを制御します。
true の場合、現在の入力アセンブリのセット内にこのような名前への参照があれば、その名前は変更されます。
入力割り当てファイル:
<renaming>
...
<mapping>
<mapinput obfuscatereferences="true">
<file dir="c:\work" name="testin.xml"/>
</mapinput>
</mapping>
</renaming>
制御フローの難読化セクション
制御フロー セクションでは、制御フローの難読化から項目を除外するための詳細な規則など、制御フローの難読化に固有のオプションを指定できます。
制御フロー セクションは省略可能です。 このセクションが存在しない場合、制御フローの難読化は無効になります。
制御フローの難読化レベル
制御フローの難読化のレベルは、"low
"(低)、"medium
"(中)、"high
"(高)という 3 つの値のいずれかに設定されます。
これらのレベルは、Dotfuscator の制御フローの難読化アルゴリズムの強力さに対応します。
一般に、レベルが高いほど難読化はより強力になりますが、それと引き換えにコード サイズは増加し、パフォーマンスが低下します。
これは、制御フローの難読化が強力であればあるほど、より多くの分岐命令をコードに追加することになるからです。
制御フローの難読化のレベルは、難読化されるすべてのメソッドに対しグローバルに適用されます。
制御フローの難読化オプション
"disable
" オプションは、主に利便性とトラブルシューティングのために用意されています。
このオプションを設定すると、制御フロー セクションの残りの部分の内容に関係なく、Dotfuscator は制御フローの難読化をまったく行いません。
制御フローの難読化オプション:
<controlflow level="high">
<!-- 本セクションの残り部分を無視し、制御フローの難読化処理をスキップします-->
<option>disable</option>
...
</controlflow>
メモ:制御フロー関連のオプションは、大文字と小文字を区別しません。
制御フローの対象除外リスト
このセクションは、入力アセンブリの制御フローの難読化を動的に微調整する方法を提供します。 このセクションには、実行時に適用される "対象除外規則" のリストを含めることができます。 規則で特定のクラスまたはメソッドを選択すると、その項目は制御フローの難読化の対象になりません。
メモ:library オプションは名前の変更処理の場合とは異なり、制御フローの難読化には 影響しない点に注意してください。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目は制御フローの難読化の対象になりません。
対象除外リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるモジュールの除外をサポートしています。
各種規則については、制御フローの難読化で詳しく説明します。
文字列の暗号化セクション
文字列の暗号化セクションでは、文字列の暗号化の対象になる型およびメソッドを指定するための詳細な規則など、文字列の暗号化に固有のオプションを指定できます。
文字列の暗号化セクションは省略可能です。 このセクションが存在しない場合、文字列の暗号化機能は無効になります。
文字列の暗号化オプション
このオプションは、主として利便性とトラブルシューティングのために使用されます。 このオプションを設定すると、文字列の暗号化セクションの残りの部分の内容に関係なく、Dotfuscator は文字列の暗号化をまったく行いません。
ユーザー文字列の暗号化オプション:
<stringencrypt>
<!--本セクションの残り部分を無視し、文字列暗号化処理をスキップします-->
<option>disable</option>
...
</stringencrypt>
メモ:文字列の暗号化オプションは、大文字と小文字を区別しません。
文字列の暗号化対象選択リスト
このセクションは、入力アセンブリに対する文字列の暗号化機能を動的に微調整する方法を提供します。 このセクションには、実行時に適用される対象選択規則のリストを含めます。 規則で特定のクラスまたはメソッドを選択すると、その項目は文字列の暗号化の対象になります。
メモ:名前の変更処理とは異なり、library オプションは文字列の暗号化には影響しない点に注意してください。
各規則は論理的に OR で結合されるため、1 つでも規則にマッチした項目は文字列暗号化の対象になります。
対象選択リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるメソッド選択をサポートしています。
各種規則については、ユーザー文字列の暗号化で詳しく説明します。
除去セクション(不要コードの除去)
<removal>
セクションでは、不要コードの除去の対象になる型およびメンバーを指定するための詳細な規則など、除去機能に固有のオプションを指定できます。
<removal>
セクションは省略可能です。
このセクションが存在しない場合、除去機能は無効になり不要コードの除去は行われません。
除去無効オプション
このオプションは、主として利便性とトラブルシューティングのために使用されます。 このオプションを設定すると、除去セクションの残りの部分の内容に関係なく、Dotfuscator は除去処理をまったく行いません。
除去無効オプション:
<removal>
<!--本セクションの残り部分を無視し、除去(不要コードの除去)処理をスキップします-->
<option>disable</option>
...
</removal>
メモ:除去オプションは、大文字と小文字を区別しません。
ConstOnly オプション
このオプションは定数のみ除去を有効にするために使用します。 このモードでは、定数宣言のみが除去されます。 未使用の型、メソッドおよびフィールドは出力アセンブリに反映されます。
定数のみ除去オプション:
<removal>
<!--不要コードの完全な除去ではなく定数のみ除去を使用します-->
<option>constonly</option>
...
</removal>
メモ:除去オプションは、大文字と小文字を区別しません。
除去トリガー リスト
不要コードの除去におけるトリガーとは、Dotfuscator がコードで使用されている型やメソッドおよびフィールドを判断するために行う静的依存関係の分析の開始点です。 別の言い方をすると、トリガーとはアプリケーションあるいはライブラリのエントリ ポイントであると言えます。
与えられたトリガーは Dotfuscator によって分析され、そのアプリケーションまたはライブラリが機能するにはどのクラス、メソッドおよびフィールドが必要であるかを判断します。 たとえば、トリガーが呼び出すすべてのメソッド、およびこれらのメソッドが呼び出すメソッドは、Dotfuscator で必要であると判断されます。 つまり、Dotfuscator に対して特定の Main メソッドが必要であると通知した場合、その Main メソッドが呼び出すすべてのメソッドも必要であるということです。
なお、library オプションを使用する場合、トリガー リストは必要ありませんが、あっても受け付けられます。
トリガー リストは、library オプションなどのオプションが暗黙に適用されるトリガーと共に使用されます。
トリガー リストにトリガーを指定する方法は、構成ファイルの他の部分で除外および選択の対象にする要素を選択する方法と同じです。 このリストには、実行時に適用される規則のリストを含めます。 規則で特定のメソッドあるいはフィールドを選択すると、そのメソッドあるいはフィールドはトリガーになります。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目はトリガーになります。
トリガー リストは、型、メソッド、アセンブリ、モジュール、または名前空間によるフィールド、メソッド、プロパティ、およびイベントの指定をサポートしています。
各種規則については、不要コードの除去で詳しく説明します。
条件付き対象選択リスト
ある型が静的依存関係の分析によって検出できない場合(すなわち型が動的に読み込まれる場合)、その型は条件付きで対象として選択される必要があります。これは、その型自体は依存関係の分析対象になりますが、そのメンバーは依然として除去の対象になることを意味します。 この機能の詳細については、対象選択トリガーと条件付き対象の理解を参照してください。
このセクションは、条件付きで対象として選択される型を動的に指定する方法を提供します。 このセクションには、実行時に適用される対象選択規則のリストを含めます。 規則で特定の型を選択すると、その項目は条件付きで対象として選択されます。
各規則は論理的に OR
で結合されるため、1 つでも規則にマッチした項目は条件付きで対象として選択されます。
対象選択リストは、名前、アセンブリ、モジュール、または名前空間による型の選択をサポートしています。
各種規則については、不要コードの除去で詳しく説明します。
除去の参照規則
参照規則を使用すると、外部ファイルから規則をインポートして、構成間で共有できるようになります。
Dotfuscator の組み込みの除去規則は、これを使用して %ProgramData%\PreEmptive Solutions\Common\dotfuscatorReferenceRule_v1.4.xml から規則をインポートしています。
規則は rulekey
属性で参照されます。値には、参照される規則に定義した GUID を指定します。
参照規則:
<referencerulelist>
<referencerule rulekey="{0D458786-E99F-4593-849B-8512493884A1}"/>
<referencerule rulekey="{C1159284-4F0D-4e9f-B3EC-303828419741}"/>
</referencerulelist>
除去レポート
除去レポートは、統計セクションを含むある特定の実行中に Dotfuscator によって除去されたすべての要素の概要を提供します。 Dotfuscator は除去レポートを解析可能で変換が容易な XML 形式で書き込みます。 名前変更割り当てファイルのように、Dotfuscator は既定の変換ファイルを持っており、このファイルを使用して判読可能な HTML 形式のレポートを生成できます。
Dotfuscator は同じ名前の既存の除去レポートが検出された場合には、自動的にそのレポートの名前を変更してから、新しいレポートで既存レポートを上書きするようになっています。
Dotfuscator に既存の除去レポートの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性を設定します。
XML 形式の除去レポート ファイルについては、不要コードの除去で説明します。
除去レポート:
<removal>
<removalreport overwrite="true">
<file dir="c:\work" name="report.xml"/>
<transform>
<!-- 独自の XSL ファイルの指定は任意です -->
<file dir="c:\mytransforms" name="removal.xsl"/>
</transform>
</removalreport>
</removal>
リンク セクション
リンク セクションでは、アセンブリのリンクに固有のオプションを指定できます。 リンク機能の詳細については、アセンブリのリンクを参照してください。
リンク セクションは省略可能です。 このセクションが存在しない場合、アセンブリのリンク機能は無効になります。
リンク無効オプション
このオプションは、主として利便性とトラブルシューティングのために使用されます。 このオプションを設定すると、リンク セクションの残りの部分の内容に関係なく、Dotfuscator はリンク処理をまったく行いません。
リンク無効オプション:
<linking>
<!-- 本セクションの残り部分を無視し、リンク処理をスキップします -->
メモ:リンク オプションは、大文字と小文字を区別しません。
リンク アセンブリ
<linkedassembly>
要素は、1 つ以上の入力アセンブリを特定の出力アセンブリにリンクすることを指定します。
リンク セクションには複数の <linkedassembly>
要素を含むことができるため、このリンク機能を使って複数の出力アセンブリを作成できます。
唯一、1 つの入力アセンブリを複数の出力アセンブリにリンクさせることはできないという制限があります。
<linkedassembly>
要素には子要素を含むことができ、名前変換ポリシーなどのリンク処理オプションや、プライマリ アセンブリ、入力アセンブリのリスト、および出力アセンブリの名前を指定できます。
オプション
現在指定できるオプションは "名前変換ポリシー" のみで、次のいずれかを指定できます。
- donotmangle(改変しない)
- manglesilently(暗黙の改変)
- mangleandwarn(改変して警告)
プライマリ アセンブリ
<primaryinput>
要素はプライマリ アセンブリを定義します。このアセンブリのマニフェスト情報を基に、出力アセンブリのマニフェストが作成されます。
このアセンブリは、次で説明する <assemblylist>
要素にも記述する必要があります。
リンクするアセンブリ
リンクするアセンブリは、<assemblylist>
要素を使って列挙します。
また、各アセンブリは入力アセンブリとしても列挙する必要があります。
出力アセンブリ
<outputassembly>
要素には出力アセンブリの名前と、任意でエントリ ポイント メソッドを指定できます。
アセンブリは出力先ディレクトリに指定された名前で書き込まれます。
例
次の例の <linkedassembly>
要素は、入力アセンブリの Driver.exe
と LibraryC.dll
を out.exe
という名前のアセンブリにリンクすることを指定しています。
エントリ ポイント メソッドは Driver
アセンブリ内の Main
メソッドであると明示的に設定されています。
メモ:エントリ ポイントを明示的に指定する必要があるのは、そのエントリ ポイントがあいまいな場合のみです。これはたとえば、出力アセンブリが .exe であったり、入力アセンブリに複数のエントリ ポイントがあったりする場合です。
リンク アセンブリ:
<linkedassembly>
<option>donotmangle</option>
<primaryinput>
<assembly>
<file dir="${configdir}" name="Driver.exe" />
</assembly>
</primaryinput>
<assemblylist>
<assembly>
<file dir="${configdir}" name="Driver.exe" />
</assembly>
<assembly>
<file dir="${configdir}" name="LibraryC.dll" />
</assembly>
</assemblylist>
<outputassembly name="out.exe">
<entrypoint>
<type name="Driver.Form1">
<method name="Main" signature="" />
</type>
</entrypoint>
</outputassembly>
</linkedassembly>
PreMark セクション
PreMark セクションでは、ウォーターマークに固有のオプションを指定できます。 アセンブリのウォーターマークの詳細については、ウォーターマークを参照してください。
メモ:PreMark セクションは省略可能です。このセクションが存在しない場合、ウォーターマーク機能は無効になります。
PreMark オプション
ウォーターマーカはいくつかの構成オプションをサポートしています。
usepassphrase
オプションは、ウォーターマーク文字列を暗号化してから選択されているアセンブリに適用するよう、ウォーターマーカに指示します。
truncatestring
オプションは、ウォーターマーク文字列が指定されたアセンブリに収まらない場合には文字列を切り捨てるように指示します。
既定の動作では、ウォーターマーク文字列が大きすぎる場合にはビルドが中止されます。
詳細については、ウォーターマーク文字列の長さを参照してください。
disable
オプションは、主に利便性とトラブルシューティングのために用意されています。
このオプションを設定すると、PreMark セクションの残りの部分の内容に関係なく、Dotfuscator はウォーターマーク処理をまったく行いません。
PreMark オプション:
<premark>
<!--本セクションの残り部分を無視し、ウォーターマーク処理をスキップします-->
<option>disable</option>
<!-- ウォーターマーク文字列を暗号化します -->
<option>usepassphrase</option>
<!-- 文字列が大きすぎる場合は、文字列を切り詰めて処理を続行します -->
<option>truncatestring</option>
...
</premark>
メモ:PreMark オプションは、大文字と小文字を区別しません。
PreMark の要素
premark セクションには子要素を含むことができ、ウォーターマークを設定する入力アセンブリや、ウォーターマーク文字列を暗号化する際に使用するパスフレーズ、使用する文字エンコード、およびウォーターマーク文字列自体を指定できます。
ウォーターマークを設定するアセンブリ
ウォーターマークを設定するアセンブリは、<assemblylist>
要素を使って列挙します。
また、各アセンブリは入力アセンブリとしても列挙する必要があります。
<passphrase>
<passphrase>
要素では、ウォーターマーク文字列を暗号化する際に使用するパスフレーズを指定します。
usepassphrase
オプションを設定しパスフレーズを指定すれば、ウォーターマーク文字列は暗号化されます。
<encoding>
<encoding>
要素では、ウォーターマーク文字列をエンコードする際に使用する文字エンコード(つまり "文字コード")を指定します。<encoding>
要素はname
属性を持ち、サポートされる文字コードを設定できます。 文字コードとその名前については、文字コードで説明します。
<watermark>
<watermark>
要素には、選択したアセンブリに適用する文字列を指定します。
文字列は、まず文字コードによりエンコードされ、次にオプションで暗号化されます。
例
次の例は、MyApp.exe
にウォーターマークを適用するように PreMark を構成しています。
ウォーターマーク文字列の MY WATERMARK
は、まず 6bit-a
文字コードを使ってエンコードされてから、パスフレーズ "mommy
" を使って暗号化されます。
PreMark の要素:
<premark>
<option>usepassphrase</option>
<option>truncatestring</option>
<assemblylist>
<assembly>
<file dir="${configdir}" name="MyApp.exe" />
</assembly>
</assemblylist>
<passphrase>mommy</passphrase>
<encoding name="6bit-a" />
<watermark>MY WATERMARK</watermark>
</premark>
署名セクション
署名セクションでは、厳密名の出力アセンブリに Dotfuscator で署名するかどうか、また署名する場合の方法を指定できます。 アセンブリの署名に関する詳細については、厳密名のアセンブリの難読化を参照してください。
署名セクションは省略可能です。 このセクションが存在しない場合、厳密名の入力アセンブリは Dotfuscator の処理後に再署名されず、Authenticode デジタル署名は適用されません。
<key> 要素の指定
署名するときに Dotfuscator が使用するキーまたはキー ペアを <key>
要素で指定できます。
<key>
要素には、子要素の <file>
または <container>
のいずれかを含むことができます。
<file>
要素は、キーまたはキー ペアを含んでいるファイルを参照します。
<container>
要素は "name
" 属性を持ち、キー コンテナーの名前を指定できます。
<file> 要素:
<key>
<file dir="c:\temp" name="key.snk" />
</key>
<container> 要素:
<key>
<container name="foo"/>
</key>
<resign> 要素:
Dotfuscator の処理前に既に署名されているアセンブリに再署名する場合は、<resign>
要素を使用します。
使用するキーを指定するカスタム属性がアセンブリに記述されている場合、<key>
要素の指定は必要ありません。
属性を無視したい場合は dontuseattributes
オプションを設定し、<key>
要素を指定します。
アセンブリにキーを指定するカスタム属性がない場合は、<key>
要素を指定する必要があります。
次の例では、Dotfuscator にはキーを指定するカスタム属性をすべて無視するように通知し、代わりに手作業でキー ファイルを指定しています。
<resign> 要素:
<signing>
<resign>
<option>dontuseattributes</option>
<key>
<file dir="c:\temp" name="key.snk" />
</key>
</resign>
...
</signing>
<delaysign> 要素:
入力アセンブリが遅延署名されているとき、その署名プロセスを Dotfuscator で自動的に完了させる場合は、<delaysign>
要素と共に <key>
子要素を指定できます。
<delaysign> 要素:
<signing>
...
<delaysign>
<key>
<file dir="c:\temp" name="key.snk" />
</key>
</delaysign>
</signing>
デジタル署名セクション
デジタル署名セクションでは、出力アセンブリに対し Dotfuscator で Authenticode デジタル署名を行うかどうか、また署名を行う場合の方法を指定できます。
デジタル署名セクションは省略可能です。 このセクションが存在しない場合、Authenticode 署名は適用されません。
<pfx> 要素の指定
Authenticode 署名で使用するコード署名権限によって提供されている PKCS #12 ファイルを <pfx>
要素を用いて指定できます。
<pfx> 要素には、<file>
子要素があります。この要素にはコード署名証明書を含む PKCS #12(.pfx)ファイルの場所を指定します。
また、<pfx>
要素は、証明書のロック解除に使用するパスワードを指定する password 属性もあります。
<pfx> 要素:
<pfx password="secret123">
<file dir="c:\temp" name="authenticode.pfx" />
</pfx>
<digitalsigning> 要素
出力アセンブリに Authenticode 署名を行うには、<digitalsigning>
要素を提供できます。子要素として <pfx>
も使用します。
disable オプションは、主に利便性とトラブルシューティングのために用意されています。 このオプションを設定すると、Authenticode 署名セクションの残りの部分の内容に関係なく、Dotfuscator は Authenticode 署名をまったく行いません。
<timestampurl> 子要素を使用すれば、Authenticode のタイムスタンプ サービスの URL を指定することができます。 この URL は Dotfuscator の署名プロセス時にアクセスされ、そこから追加データが提供されます。その追加データを使用すれば、アセンブリの Authenticode 署名は、コード署名証明書の有効期限が切れた後も有効なままになります。 この要素は省略可能です。 ただし、省略した場合にはこの追加データは含まれないので、コード署名証明書の有効期限が切れるとアセンブリの Authenticode 署名は無効になります。
<digitalsigning> 要素:
<digitalsigning>
<!--本セクションの残り部分を無視し、Authenticode 署名をスキップします-->
<option>disable</option>
<!--Authenticode 署名に使用する証明書を指定します-->
<pfx password="secret123">
<file dir="c:\temp" name="authenticode.pfx" />
</pfx>
<!--任意でタイムスタンプ サービスへの URL を指定します-->
<timestampurl>http://timestamp.comodoca.com/authenticode</timestampurl>
</digitalsigning>
EventList セクション
eventlist(イベント リスト)セクションでは、ビルド前およびビルド後のイベントを指定できます。 Dotfuscator のビルド イベントの詳細については、ビルド イベントを参照してください。
eventlist セクションは省略可能です。
<event> 要素
イベントは本質的には 1 つのプログラムであり、Dotfuscator のビルド工程におけるある特定の時点に Dotfuscator が実行するものです。
プログラム名、作業ディレクトリ、およびコマンド ライン引数を指定できます。
さらに、イベントは、<option>
要素を使って追加の構成設定をサポートすることもできます。
<event>
要素は type
属性を持ちます。
現在、Dotfuscator が認識できるタイプは prebuild
と postbuild
の 2 つです。
実行するプログラムは <program>
要素を使って指定します。
イベント <program> 要素
イベントの発生時に実行するプログラムは、<program>
要素で指定します。
この要素は、プログラムとプログラムの場所を指定する <file>
要素だけでなく、コマンド ライン引数や作業ディレクトリを指定する <environment>
要素も含んでいます。
commandline
属性には、ファイルやディレクトリと同様に、プロパティ マクロを含むことができます。
プロパティ マクロ:
<program>
<file dir="c\temp" name="copyfiles.bat" />
<environment commandline="${myproperty}" workingdir="c:\temp" />
</program>
ビルド前のイベント オプション
ビルド前のイベントは 1 つのオプションをサポートしています。オプションは、ビルド前イベントの <event>
要素の中に入れ子で <option>
要素を記述して設定できます。
オプション | |
---|---|
haltonfail | ビルド イベント プログラムがゼロ以外のエラー コードを返した場合、Dotfuscator のビルドを中止します。 |
ビルド後のイベント オプション
ビルド後のイベントはいくつかのオプションをサポートしています。オプションは、ビルド後イベントの <event>
要素の中に入れ子で <option>
要素を記述して設定できます。
オプション | |
---|---|
haltonfail | ビルド イベント プログラムがゼロ以外のエラー コードを返した場合、Dotfuscator のビルドを中止します。 |
runoneachmodule | 出力モジュールごとに 1 回、ビルド後のイベントを実行します。 |
always | Dotfuscator のビルドが成功したか失敗したかにかかわらず、常にビルド後のイベントを実行します。 |
buildfails | Dotfuscator のビルドが失敗した場合にのみ、ビルド後のイベントを実行します。 |
buildsuccessful | Dotfuscator のビルドが成功した場合にのみ、ビルド後のイベントを実行します。 |
例
以下に、XML 構成ファイル内でビルド前およびビルド後のイベントを設定する箇所を示します。 ビルド前のイベントでは、c:\temp\copyfiles.bat プログラムを引数なしで実行します。 ビルドが成功したら、ビルド後のイベントでは、出力アセンブリごとに PEVerify プログラムを実行します。 出力アセンブリ名はプロパティとして PEVerify に渡されていることに注目してください。
XML 構成ファイルの例:
<eventlist>
<event type="prebuild">
<program>
<file dir="c\temp" name="copyfiles.bat" />
<environment commandline="" workingdir="c:\temp" />
</program>
</event>
<event type="postbuild">
<option>runoneachmodule</option>
<option>haltonfail</option>
<program>
<file dir="C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin" name="PEVerify.exe" />
<environment commandline="${dotf.current.out.module}"
workingdir="${dotf.destination}" />
</program>
</event>
</eventlist>
PreEmptive Analytics セクション
PreEmptive Analytics セクションでは、入力アセンブリのインストルメンテーション属性の処理方法を制御するオプションを指定できます。 差し込みおよび遠隔測定の詳細については、[差し込み]エディターを参照してください。
PreEmptive Analytics セクションは省略可能です。
sos
要素は mergeruntime
属性を定義します。この属性にはtrue
(既定値)または false
を指定できます。
true
の場合、Dotfuscator は PreEmptive Analytics ライブラリを入力アセンブリの 1 つにマージします。
false
の場合、Dotfuscator はランタイム ライブラリ DLL をほかの入力アセンブリと一緒に出力先ディレクトリへ書き込みます。
PreEmptive Analytics には、[差し込みを有効にする]、[分析メッセージの送信]、[改ざんメッセージの送信]、[Shelf Life メッセージの送信]、および[デバッグ チェック メッセージの送信]という追加オプションがあります。
sendanalytics
オプションは、アプリケーション分析のスタートアップ、シャットダウン、および機能のメッセージを PreEmptive Analytics Endpoint へ送信するコードを、マークされたアセンブリに追加するよう Dotfuscator に指示します。
分析しないで改ざんメッセージを送信したい場合には、このオプションの設定を解除します。
dontsendtamper
オプションは、改ざんが検出されても改ざん通知を送信しないよう、Dotfuscator に指示します。
これは、改ざんを検出してアプリケーションにローカルで対応させたいが、アプリケーションから PreEmptive Analytics Endpoint へメッセージを送信させたくない場合に有用です。
sendshelflife
オプションは、Shelf Life の状態メッセージを送信するロジックを追加するコードを、マークされたアセンブリに追加するよう Dotfuscator に指示します。
これには、警告、期限切れ、および Sign of Life メッセージが含まれます。
senddebug
オプションは、アタッチされたデバッガーが検出された場合、例外メッセージを送信するロジックを追加するコードを、マークされたアセンブリに追加するよう Dotfuscator に指示します。
disable
オプションは、主に利便性とトラブルシューティングのために用意されています。
このオプションを設定すると、入力アセンブリ内にどのような属性があろうと、sos セクション内にほかのオプションがあろうと関係なく、Dotfuscator はこの属性の処理をまったく行いません。
PreEmptive Analytics の処理:
<sos mergeruntime="true">
<!-- PreEmptive Analytics の処理を無効にします -->
<option>disable</option>
<!-- 起動、シャットダウン、および機能のメッセージを送信します -->
<option>sendanalytics</option>
<!-- 改ざんメッセージを送信しません -->
<option>dontsendtamper</option>
<!-- Shelf Life メッセージを送信します -->
<option>sendshelflife</option>
<!-- デバッグ チェック メッセージを送信します -->
<option>senddebug</option>
</sos>
拡張属性セクション
Dotfuscator では、アプリケーションのソース コードを変更しなくても、メソッドやアセンブリに拡張属性を付けることができます。 拡張属性は、コード内のサポートされている既存のカスタム属性を変更したり、サポートされている属性の新しいインスタンスとして動作することができます。 アプリケーションの処理および変換を行う際、Dotfuscator は拡張属性をカスタム属性と同等のものとして扱います。
<codetransformlist>
要素を使用すると、属性がコードに埋め込まれているものであっても、拡張属性を使って、それをサポートされている特定のコード変換に割り当てることができます。
これは属性のオーバーロードをサポートしており、同じ属性のセットで複数の変換処理(アプリケーション分析など)を作動させることができます。
サポートされている属性の引数は、<propertylist>
要素を使用して指定できます。
チェック属性およびインストルメンテーション属性のページに一覧表示されているすべての属性が、サポートされる属性です。
メソッド レベルの属性
ほとんどの拡張属性はメソッド レベルで設定できます。 メソッドを識別するには、定義している型、名前、および署名を指定する必要があります。
例:
<extattributes>
<extattribute name="PreEmptive.Attributes.FeatureAttribute">
<codetransformlist>
<codetransform name="analytics"/>
</codetransformlist>
<type name = "MyApplicaton.MainForm">
<method name="Main" signature="string[]" />
</type>
<propertylist>
<property name="Name" value="Execute"/>
<property name="ActivationStatusSinkElement" value="field"/>
<property name="ActivationStatusSinkName" value="activated"/>
</propertylist>
</extattribute>
</extattributes>
アセンブリ レベルの属性
ApplicationAttribute
、BinaryAttribute
、および BusinessAttribute
などの拡張ランタイム属性は、アセンブリ レベルで設定できます。
アセンブリを識別するには、その名前を <assembly>
要素に指定する必要があります。
例:
<extattributes>
<extattribute name="PreEmptive.Attributes.ApplicationAttribute">
<codetransformlist>
<codetransform name="sosruntime" />
</codetransformlist>
<assembly>
<file dir="${configdir}" name="MyApp.exe" />
</assembly>
<propertylist>
<property name="Version" value="" />
<property name="Name" value="" />
<property name="ApplicationType" value="" />
<property name="Guid" value="00000000-0000-0000-0000-000000000000" />
</propertylist>
</extattribute>
</extattributes>
SmartObfuscation セクション
スマート難読化により、Dotfuscator はアプリケーションの種類に特有の規則に基づいて、名前の変更や除去を実行できない要素を自動検出できるようになります。 スマート難読化は既定で有効に設定されており、ほとんどの場合は有効にしておく必要があります。 ユーザーが積極的な難読化を行ってもアプリケーションを損なわないと確信している場合には、このセクションのオプションを使用して無効に設定することができます。
スマート難読化にはレポート機能が用意されており、このセクションでレポートの詳細を構成できます。
詳細属性に使用できる値は、すべて
、警告のみ
、および なし
です。
既定値は all
です。
スマート難読化レポートは、任意でディスクに書き出すことができます。
Dotfuscator は同じ名前の既存のスマート難読化レポートが検出された場合には、自動的にそのレポートの名前を変更してから、新しいレポートで既存レポートを上書きします。
Dotfuscator に既存のスマート難読化レポートの名前を自動的に変更させないように指示するには、構成ファイルに overwrite="true"
という属性が必要になります。
XML 形式のスマート難読化レポートについては、「スマート難読化」セクションで説明しています。
SmartObfuscation:
<smartobfuscation>
<!—- 本セクションの残り部分を無視し、スマート難読化処理をスキップします -->
<option>disable</option>
<smartobfuscationreport verbosity="all" overwrite="true">
<!-- 出力レポート ファイルの指定は任意です -->
<file dir="c:\myapp" name="smartobfuscation.xml"/>
</smartobfuscationreport>
</smartobfuscation>
XML 構成ファイルに関する注意
Dotfuscator は、構成ファイルおよび割り当てファイルに XML 形式のドキュメントを使用します。
これらのドキュメントは読み込まれると、doctype
で指定される文書型定義(DTD)によって検証されます。
Dotfuscator は検証を実行するために、関連する DTD にアクセスできる必要があります。
Dotfuscator は、DTD を検索するために以下の手順を実行します。
- DTD URI がローカル ファイルを指定する場合は、Dotfuscator は指示された場所でそのファイルを検索します。 見つからない場合は、エラーが発生します。
- DTD の URI が Web リソースを指定する場合は、Dotfuscator は最初に URI で指定された名前を持つファイルが Dotfuscator のキャッシュ内にあるかどうかを調べます。 Dotfuscator のキャッシュは、%ProgramData%\PreEmptive Solutions\Common directory ディレクトリにあります。
- 見つからない場合、Dotfuscator は DTD を取得するために URI にアクセスします。 見つかった場合、Dotfuscator は次回の要求がネットワークにアクセスする必要がないように、インストール ディレクトリに DTD をキャッシュします。 DTD が見つからない場合、または Dotfuscator がネットワークから DTD を取得できない場合は、エラーが発生します。
カスタム規則
Dotfuscator では、アプリケーションに対する難読化規則をカスタマイズすることができます。
対象選択規則および対象除外規則は、名前の変更、制御フローの難読化、文字列の暗号化および入力アセンブリの除去について動的に微調整する方法を提供します。
これらの規則は、library オプションなどのオプションによって暗黙に適用される規則と併せて適用され、論理的に OR
で結合されます。
対象除外規則
対象除外リスト セクションは、入力アセンブリの名前の変更および制御フローの難読化を動的に微調整する方法を提供します。 ユーザーは、実行時に適用される規則のリストを指定します。 規則で特定のクラス、メソッド、またはフィールドを選択した場合、その項目の名前は変更されません。また、その項目は制御フローの難読化の対象から除外されます。
これらの規則は、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 などと一致
正規表現の構文の詳細については、.NET Framework のドキュメントを参照してください。
名前空間の対象除外
このオプションは、指定した名前空間内のすべての型とそのメンバーを対象から除外します。 名前空間の指定には正規表現を使用できます。
正規表現:
<namespace name="My.Excluded.Namespace"/>
型の対象除外
このオプションは、名前または属性指定子によって型を対象から除外します。 型名の指定には正規表現を使用できます。 型名は完全修飾名である必要があります。 内側の(入れ子になっている)クラスは、外側と内側のクラスの間に ‘/’ を区切り文字として使用して指定します。 たとえば、次のように記述します。
内側の(入れ子になっている)クラス:
<type name="Library.Class1/NestedClass"/>
属性指定子の選択や選択解除には、speclist
属性を使用します。
speclist
属性は、型の有効な属性指定子をカンマで区切って指定します。
利用可能な値は以下のとおりです。
利用可能な値:
abstract
interface
nestedassembly
nestedfamily
nestedfamorassem
nestedprivate
nestedpublic
notpublic
public
sealed
serializable
enum
属性指定子の前に ‘-‘ を付けると、規則の意味が反転します(つまり、指定した属性を持たないすべてのクラスを対象から除外します)。
‘+’ を指定することもできますが、必要ありません。
このリストに暗黙に適用される規則は、論理的に AND-
で結合されます(つまり、対象から除外する型のセットは、各規則に一致するすべての型の共通部分となります)。
たとえば、次の規則は、public 型かつ sealed 型のものを対象から除外します。
Public 型かつ Sealed 型を対象から除外する規則:
<type name=".*" speclist="+public,+sealed" regex="true"/>
<type>
要素を使用して型を選択し、選択した型内からフィールド、メソッド、プロパティ、およびイベントを除外する規則を指定することもできます。
これにより、メンバーを除外しても、メンバーが所有している型は除外しないでおくことができます。
これを実行するには、省略可能な excludetype
属性を使用します。
指定がない場合、既定値は true
であり、その型名が名前の変更または制御フローの難読化の対象から除外されます。
フィールド、メソッド、プロパティ、およびイベントの対象除外規則の指定:
<type name="MyCo.Test.MyOtherTest" excludetype="false">
<!-- ここで指定したメソッドとフィールドは除外されます -->
...
</type>
型の規則がプロパティやイベントの規則を含んでいない場合、対象から除外される型のすべてのプロパティ名およびイベント名は保持されます。 型の規則がプロパティの規則を 1 つ以上含んでいる場合は、それらのプロパティ名のみが保持され、それ以外のプロパティ名はすべて削除されます。 型の規則がイベントの規則を 1 つ以上含んでいる場合は、それらのイベント名のみが保持され、それ以外のイベント名はすべて削除されます。
注意:型が対象から除外されておらず、ライブラリ オプションが設定されていない場合、Dotfuscator はプロパティ名とイベント名を削除します。
名前の変更にのみ適用:
applytoderivedtypes
属性を指定することによって、継承階層全体に型の規則を適用することができます。
この属性の値を true
に設定すると、型の規則および、それに含まれるすべてのメソッド、フィールド、プロパティ、イベント、カスタム属性、またはスーパータイプの規則が、選択されている型とそれから派生するすべての型に適用されます。
指定がない場合、既定値は false
であり、指定した型にのみ型の規則が適用されます。
メソッドの対象除外
メソッドの除外は、まず <type>
要素を使用して型を選択し、次に対象から除外するメソッドを選択する規則を指定することによって行われます。
メソッドは、名前や属性指定子によって対象から除外できるほか、署名によっても除外できます。
利用可能な属性指定子:
abstract
assembly
family
familyorassembly
final
private
public
static
virtual
属性指定子が明示的に設定されていない場合、speclist
属性は選択条件として使用されません。
次の例では、"Set" で始まるすべてのパブリック インスタンス メソッドが選択されます。
<method regex="true" name="Set.*" speclist="+public,-static"/>
メソッドの署名は、signature
属性を使用して指定します。
署名は、メソッドの戻り値の型とパラメーターの型を特定します。
戻り値の型とパラメーターの型:
signature="" <!-- 空の署名 -->
signature="string(int,MyClass,MyClass[])"
署名が明示的に設定されていない場合、メソッドの署名は選択条件として使用されません。
次の例では、署名によってメソッドが選択されます。
署名によるメソッド:
<method name="DoIt" signature="string(int, System.Console, System.Collection.ICollection, float[])"/>
"Module:mod_name
" という名前の特別な型セレクターを使用すると、グローバル メソッドを指定できます。mod_name
には、グローバル メソッドを含んでいるモジュールの名前を指定します。
フィールドの対象除外
フィールドの除外は名前の変更でのみ有効です。
フィールドの除外は、まず <type>
要素を使用して型を選択し、次に対象から除外するフィールドを選択する規則を指定することによって行われます。
フィールドもまた、名前および属性指定子によって対象から除外できます。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
notserialized
属性指定子が明示的に設定されていない場合、フィールドの属性は選択条件として使用されません。
次の例では、"ENUM_
" で始まる静的フィールドがすべて選択されます。
"ENUM_" で始まる静的フィールド:
<field regex="true" name="ENUM_.*" speclist="+static"/>
フィールドの署名は、signature
属性を使用して指定します。
署名はフィールドの型を指定します。
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、フィールドの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル フィールドを指定できます。mod_name
には、グローバル フィールドを含んでいるモジュールの名前を指定します。
プロパティの対象除外
プロパティの除外は名前の変更でのみ有効です。 プロパティの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 プロパティの規則は、(親の型の規則の条件を満たすすべての型のプロパティのうちで)条件を満たすすべてのプロパティを選択します。 サポートされる選択条件は、プロパティ名およびプロパティの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、プロパティの属性は選択条件として使用されません。
次の例では、"Sample" で始まるすべてのプロパティが選択されます。
<propertymember regex="true" name="Sample.*"/>
プロパティの署名は、signature
属性を使用して指定します。
署名はプロパティの型を指定します。
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、プロパティの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル プロパティを指定できます。mod_name
には、グローバル プロパティを含んでいるモジュールの名前を指定します。
イベントの対象除外
イベントの除外は名前の変更でのみ有効です。 イベントの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 イベントの規則は、(親の型の規則の条件を満たすすべての型のフィールドのうちで)条件を満たすすべてのイベントを選択します。 サポートされる選択条件は、イベント名およびイベントの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、イベントの属性は選択条件として使用されません。
"On" で始まるすべてのイベントが選択されます。
<eventmember regex="true" name="On.*"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル イベントを指定できます。mod_name
には、グローバル イベントを含んでいるモジュールの名前を指定します。
カスタム属性による対象除外
型、メソッド、フィールドは、カスタム属性を基に選択的に除外できます。 カスタム属性の規則では、項目(型、メソッド、フィールド、プロパティ)の追加情報であるカスタム属性の名前を基に項目を選択します。 型、メソッド、フィールド、プロパティを選択する規則の中に、カスタム属性の規則を 1 つ以上入れ子にすることができます。
型、メソッド、フィールド、プロパティの規則には、カスタム属性の規則を複数関連付けることができます。 この場合、カスタム属性の規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true>
<customattribute name="MyCustomAttribute"/>
...<customattribute name="MyOtherCustomAttribute"/>
</type>
カスタム属性の規則では、カスタム属性の名前の条件を正規表現によって記述することもできます。
次の例も、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true>
<customattribute name="My.*CustomAttribute" regex="true"/>
</type>
次の例は、MyCustomAttribute
という名前のカスタム属性を持つすべてのメソッドを除外する方法を示しています。
カスタム属性を持つメソッドの対象除外:
<type name=".*" excludetype="false" regex="true">
<method name=".*" regex="true">
<customattribute name="MyCustomAttribute"/>
</method>
</type>
カスタム属性の規則は、allowinheritance
属性を指定することによって、サブタイプやオーバーライドするメソッドおよびプロパティに適用することができます。
この属性の値が true
に設定されていると、指定したカスタム属性を持つサブタイプやオーバーライドするメソッドおよびプロパティも対象から除外されるようになります。
スーパータイプによる対象除外
型は、スーパータイプによって選択的に対象から除外できます。 スーパータイプの規則では、指定した型が継承する型の名前を基に型を選択します。 型を選択する規則の中に、スーパータイプの規則を 1 つ以上入れ子にすることができます。
型の規則には、スーパータイプの規則を複数関連付けることができます。 この場合、スーパータイプの規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、MySupertype
から継承するすべての型が選択されます。
MySupertype から継承するすべての型:
<type name=".*" excludetype="false" regex="true">
<supertype name="MySupertype"/>
</type>
スーパータイプの規則では、スーパータイプの名前の条件を正規表現によって記述することもできます。
次の例では MySupertype
または MyOtherSupertype
のいずれかから継承するすべての型を選択する方法を示しています。
MySupertype または MyOtherSupertype から継承するすべての型:
<type name=".*" excludetype="false" regex="true">
<supertype name="My.*Supertype" regex="true"/>
</type>
アセンブリの対象除外
アセンブリは、名前によって対象から除外できます。 アセンブリが対象から除外されると、そのアセンブリのモジュール内のすべての型およびメンバーが除外されます。 以下のような状況では、アセンブリを対象から除外するのが妥当です。
- アセンブリ A は難読化する必要がある
- アセンブリ B は難読化してはならない
- アセンブリ B はアセンブリ A に依存している
つまり、A は B だけにサービスを提供しています。 B の内部に埋め込まれた A への参照を難読化する場合、B は A と同時に処理されるよう指定しますが、名前の変更や制御フローの難読化の対象からは除外します。
アセンブリの対象除外:
<assembly>
<file dir="c:\src\app1\" name="ExcludedLib.dll"/>
</assembly>
モジュールの対象除外
モジュールは、名前によって対象から除外できます。 アセンブリ属性を使用すると、モジュールを特定のアセンブリに限定できます。 アセンブリ属性を指定する場合、アセンブリ名は物理ファイル名ではなく論理アセンブリ名で指定する必要があります。 モジュールが対象から除外されると、そのモジュールで定義されているすべての型およびメンバーが対象から除外されます。
当然、指定したモジュールが複数のアセンブリ間で共有されている場合、そのモジュールはすべてのアセンブリから除外されます。
モジュールをすべてのアセンブリから除外する:
<module name="MyLibResource.dll" assemblyname="MyLib"/>
対象選択規則
対象選択リスト セクションは、入力アセンブリに対する文字列の暗号化および不要コードの除去機能を動的に微調整する方法を提供します。 ユーザーは、実行時に適用される規則のリストを指定します。 規則で特定のクラス、メソッド、フィールド、プロパティ、またはイベントを選択すると、その項目は文字列の暗号化および不要コードの除去の対象として選択されます。
これらの規則は、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 などと一致
メモ:正規表現の構文の詳細については、.NET Framework のドキュメントを参照してください。
名前空間の対象選択
このオプションは、指定した名前空間内のすべての型とそのメソッドを対象として選択します。 名前空間の指定には正規表現を使用できます。
正規表現:
<namespace name="My.Included.Namespace"/>
型の対象選択
このオプションは、名前または属性指定子によって型を対象として選択します。 型名の指定には正規表現を使用できます。
型名は完全修飾名である必要があります。
内側の(入れ子になっている)クラスは、外側と内側のクラスの間に ‘/’ を区切り文字として使用して指定します。 たとえば、次のように記述します。
内側の(入れ子になっている)クラス:
<type name="Library.Class1/NestedClass"/>
属性指定子の選択や選択解除には、speclist
属性を使用します。
speclist
属性は、型の有効な属性指定子をカンマで区切って指定します。
利用可能な値は以下のとおりです。
属性指定子:
abstract
interface
nestedassembly
nestedfamily
nestedfamorassem
nestedprivate
nestedpublic
notpublic
public
sealed
serializable
enum
属性指定子の前に ‘-‘ を付けると、規則の意味が反転します(つまり、指定した属性を持たないすべてのクラスを対象として選択します)。
‘+’ を指定することもできますが、必要ありません。
このリストに暗黙に適用される規則は、論理的に AND
で結合されます(つまり、対象として選択する型のセットは、各規則に一致するすべての型の共通部分となります)。
たとえば、次の規則は public かつ sealed である型のメソッドをすべて対象として選択します。
Public 型かつ Sealed 型であるメソッドの対象選択:
<type name=".*" speclist="+public,+sealed" regex="true"/>
<type>
要素を使用して型を選択し、選択した型内から個別のメソッドを対象として選択する規則を指定することもできます。
これにより、ある型の一部のメソッドでのみ文字列を暗号化でき、それ以外のメソッドでは暗号化できないようになります。
なお、<type>
要素の excludetype
属性は文字列の暗号化の対象選択には使用されないことに注意してください。
ある型の一部のメソッドにおける暗号化:
<type name="MyCo.Test.MyOtherTest">
<!-- ここで指定した個々のメソッドが対象として選択されます -->
...
</type>
<type>
要素が入れ子になった <method>
要素を含んでいない場合は、すべてのメソッドが対象として選択されます。
これは、対象除外規則とは対照的です。
除外にのみ適用:
applytoderivedtypes
属性を指定することによって、継承階層全体に型の規則を適用することができます。
この属性の値を true
に設定すると、型の規則および、それに含まれるすべてのメソッド、フィールド、プロパティ、イベント、カスタム属性、またはスーパータイプの規則が、選択されている型とそれから派生するすべての型に適用されます。
指定がない場合、既定値は false
であり、指定した型にのみ型の規則が適用されます。
メソッドの対象選択
メソッドの選択は、まず <type>
要素を使用して型を選択し、次に対象とするメソッドを選択する規則を指定することによって行われます。
メソッドは、(前述の型のセクションで説明したように)名前や属性指定子によって対象として選択できるほか、署名によっても選択できます。
利用可能な属性指定子:
abstract
assembly
family
familyorassembly
final
private
public
static
virtual
属性指定子が明示的に設定されていない場合、speclist
属性は選択条件として使用されません。
次の例では、Set
で始まるすべてのパブリック インスタンス メソッドが選択されます。
Set で始まるすべてのパブリック インスタンス メソッド:
<method regex="true" name="Set.*" speclist="+public,-static"/>
メソッドの署名は、signature
属性を使用して指定します。
署名は、メソッドの戻り値の型とパラメーターの型を特定します。
メソッドの戻り値の型とパラメーターの型:
signature="" <!-- 空のパラメーター リスト -->
signature="string(int,MyClass,MyClass[])"
署名が明示的に設定されていない場合、メソッドの署名は選択条件として使用されません。
次の例では、署名によってメソッドが選択されます。
署名によるメソッドの選択:
<method name="DoIt" signature="string(int, System.Console, System.Collection.ICollection, float[])"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル メソッドを指定できます。mod_name
には、グローバル メソッドを含んでいるモジュールの名前を指定します。
フィールドの対象選択
フィールドの対象選択は、除去トリガーおよび除去の条件付き選択対象でのみ有効です。
フィールドの選択は、まず <type>
要素を使用して型を選択し、次にフィールドを選択する規則を指定することによって行われます。
フィールドは、(前述の型のセクションで説明したように)名前および属性指定子によって選択できます。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
notserialized
属性指定子が明示的に設定されていない場合、フィールドの属性は選択条件として一切使用されません。
次の例では、"ENUM_
" で始まる静的フィールドがすべて選択されます。
"ENUM_" で始まる静的フィールド:
<field regex="true" name="ENUM_.*" speclist="+static"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル フィールドを指定できます。mod_name
には、グローバル フィールドを含んでいるモジュールの名前を指定します。
プロパティの対象選択
プロパティの対象選択は、不要コードの除去でのみ有効です。 プロパティの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 プロパティの規則は、(親の型の規則の条件を満たすすべての型のプロパティのうちで)条件を満たすすべてのプロパティを選択します。 サポートされる選択条件は、プロパティ名およびプロパティの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、プロパティの属性は選択条件として使用されません。
次の例では、"Sample
" で始まるすべてのプロパティが選択されます。
"Sample" で始まるプロパティ:
<property regex="true" name="Sample.*"/>
プロパティの署名は、signature
属性を使用して指定します。
署名はプロパティの型を指定します。
プロパティの型を指定する署名:
signature="" <!-- 空の署名 -->
signature="int"
署名が明示的に設定されていない場合、プロパティの型は選択条件として使用されません。
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル プロパティを指定できます。mod_name
には、グローバル プロパティを含んでいるモジュールの名前を指定します。
イベントの対象選択
イベントの対象選択は、不要コードの除去でのみ有効です。 イベントの規則は、型の規則によって限定されるので、規則の編集ビューでは型ノードの子として表示されます。 イベントの規則は、(親の型の規則の条件を満たすすべての型のフィールドのうちで)条件を満たすすべてのイベントを選択します。 サポートされる選択条件は、イベント名およびイベントの属性です。
利用可能な属性指定子:
public
private
static
assembly
family
familyandassembly
familyorassembly
属性指定子が明示的に設定されていない場合、イベントの属性は選択条件として使用されません。
次の例では、"On
" で始まるすべてのイベントが選択されます。
"On" で始まるイベント:
<event regex="true" name="On.*"/>
Module:mod_name
という名前の特別な型セレクターを使用すると、グローバル イベントを指定できます。mod_name
には、グローバル イベントを含んでいるモジュールの名前を指定します。
カスタム属性による対象選択
型およびメソッドは、カスタム属性を基に選択的に対象として選択できます。 カスタム属性の規則では、項目(型またはメソッド)の追加情報であるカスタム属性の名前を基に項目を選択します。 型またはメソッドを選択する規則の中に、カスタム属性の規則を 1 つ以上入れ子にすることができます。
型またはメソッドの規則には、カスタム属性の規則を複数関連付けることができます。 この場合、カスタム属性の規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型:
<type name=".*" excludetype="false" regex="true>
<customattribute name="MyCustomAttribute"/>
...<customattribute name="MyOtherCustomAttribute"/>
</type>
カスタム属性の規則では、カスタム属性の名前の条件を正規表現によって記述することもできます。
次の例も、カスタム属性の MyCustomAttribute
または MyOtherCustomAttribute
を持つすべての型が選択されます。
MyCustomAttribute または MyOtherCustomAttribute を持つ型の選択:
<type name=".*" excludetype="false" regex="true>
<customattribute name="My.*CustomAttribute" regex="true"/>
</type>
次の例は、MyCustomAttribute
という名前のカスタム属性を持つすべてのメソッドを対象として選択する方法を示しています。
MyCustomAttribute を持つメソッドの対象選択:
<type name=".*" excludetype="false" regex="true">
<method name=".*" regex="true">
<customattribute name="MyCustomAttribute"/>
</method>
</type>
カスタム属性の規則は、allowinheritance
属性を指定することによって、サブタイプやオーバーライドするメソッドおよびプロパティに適用することができます。
この属性の値が true
に設定されていると、指定したカスタム属性を持つサブタイプやオーバーライドするメソッドおよびプロパティも対象から除外されるようになります。
スーパータイプによる対象選択
型は、スーパータイプを基に選択的に対象として選択できます。 スーパータイプの規則では、指定した型が継承する型の名前を基に型を選択します。 型を選択する規則の中に、スーパータイプの規則を 1 つ以上入れ子にすることができます。
型の規則には、スーパータイプの規則を複数関連付けることができます。 この場合、スーパータイプの規則のいずれか 1 つにでも項目がマッチすれば、その項目は選択されます。
次の例では、MySupertype
から継承するすべての型が選択されます。
MySuperType から継承する型の選択:
<type name=".*" excludetype="false" regex="true">
<supertype name="MySupertype"/>
</type>
スーパータイプの規則では、スーパータイプの名前の条件を正規表現によって記述することもできます。
次の例では MySupertype
または MyOtherSupertype
のいずれかから継承するすべての型を選択する方法を示しています。
MySupertype または MyOtherSupertype から継承する型の選択:
<type name=".*" excludetype="false" regex="true">
<supertype name="My.*Supertype" regex="true"/>
</type>
アセンブリの対象選択
アセンブリは、名前によって対象として選択できます。 アセンブリが対象として選択されると、そのアセンブリのモジュール内のすべての型およびメソッドが対象として選択されます。
アセンブリの対象選択:
<assembly>
<file dir="c:\src\app1\" name="IncludedLib.dll"/>
</assembly>
モジュールの対象選択
モジュールは、名前によって対象として選択できます。 アセンブリ属性を使用すると、モジュールを特定のアセンブリに限定できます。 アセンブリ属性を指定する場合、アセンブリ名は物理ファイル名ではなく論理アセンブリ名で指定する必要があります。 モジュールが対象として選択されると、そのモジュールで定義されているすべての型およびメンバーが対象として選択されます。
当然、指定したモジュールが複数のアセンブリ間で共有されている場合、そのモジュールはすべてのアセンブリに対して処理対象として選択されます。
モジュールの対象選択:
<module name="MyLibResource.dll" assemblyname="MyLib"/>