不要コードの除去
小さいアプリケーションほど、ダウンロード、インストール、読み込み、および実行速度がより高速になります。 Dotfuscator の除去機能はコードを静的に分析して、未使用の型、メソッド、およびフィールドを検出し、それらを除去します。 Dotfuscator は処理を行うときに、不必要なメタデータを MSIL ファイルから削除することで、アプリケーションをより小さくし、攻撃者が入手できるデータを減らします。
静的分析ではコード全体を調べ、トリガーまたはエントリー ポイントと呼ばれる一連のメソッドから分析を開始します。 通常、外部アプリケーションによって呼び出されることが予期されるメソッドは、トリガーとして定義されている必要があります。 たとえば、単純なスタンドアロン アプリケーションでは、Main
メソッドがトリガーとして定義されます。 1 つのアセンブリに複数のトリガーを定義することができます。
Dotfuscator は、各トリガー メソッドのコード全体を調べ、使用されているフィールド、メソッド、型を記録します。 その後、呼び出されているメソッドを同様の方法で分析します。 この処理は、呼び出されているメソッドがすべて分析されるまで続けられます。 この処理が終了した時点で、アプリケーションの実行に最低限必要な型とそのメンバーのセットを判別できます。 出力アセンブリには、これらの型だけが含まれます。
Dotfuscator は、すべての入力アセンブリの一覧と、それらがどのように除去されたかを示すレポートを XML 形式で生成します。 各アセンブリには、型とそれらのメンバー(メソッド、フィールド、プロパティなど)の一覧と共に、その項目が除去されたかどうかを示す属性が表示されます。 また、レポートには、各アセンブリにアタッチされているマネージ リソースの除去状況も記載されます。 最後にレポートは、不要なコードの除去による全体的な効果に関する統計セクションを提供します。
制限事項
除去で生じる可能性のある問題は、名前の変更で生じる可能性のある問題と非常に類似しています。 Dotfuscator は、ある特定のメソッド(リフレクション / XAML など)が呼び出されていることを見分けられない場合、実行時に必要とされるものを削除しようとすることがあります。
対象選択
可能な対象選択は 2 種類あり、どちらも特定の対象選択およびカスタム規則によって制御することができます。
メソッド A()
がメソッド B()
を呼び出すアプリケーションを考えてみましょう。
-
対象トリガー:メソッドを対象トリガーとして選択した場合、Dotfuscator はそのメソッドを保持するだけでなく、そのメソッドのあらゆる子孫を Dotfuscator が調べるコール グラフに保持するようにします(この場合も、リフレクションのようなものをスキップします)。 メソッド
A()
に対象トリガーを設定した場合は、A()
とB()
の両方が保持されます。 -
条件付き対象選択:条件付き選択対象として設定されたメソッドはすべて保持されますが、追加メソッドを保持する場合に、その呼び出しツリーは検討されません。 メソッド
A()
に条件付き対象選択を設定した場合、A()
は保持されますが、B()
は(Dotfuscator が把握しているその他のメソッドによって呼び出されない限り)除去されます。
オプション
[除去の種類]には 2 つのオプションがあります。
- 使用されていないメタデータとコードを削除:積極的に検索を行い、使用されていない型やメソッドを削除したい場合に使用します。
- リテラルのみ削除(const 定義):文字列の暗号化の威力を強化するために使用します。暗号化されていない const 文字列が削除されるようになります。 文字列の暗号化が有効になっている場合は、除去でこのオプションをオンにしてください。
ウォーターマーク(PreMark)
ウォーターマークは、ソフトウェアの無許可コピーの出所を追跡することに役立ちます。実行時の動作に影響を与えることなく、著作権情報や一意の ID 番号などのデータを .NET アプリケーション内に埋め込むために使われます。 Dotfuscator のウォーターマーク アルゴリズムでは、アプリケーションのサイズが増加することはありません。また、アプリケーションに支障を来す余分なメタデータを生成することもありません。