.NET のアセンブリに含まれている重要なソース コードの詳細には、型名やメンバー名(密閉型のものも含む)、および高度な中間言語で書かれた命令などがあります。 Dotfuscator の難読化変換により、これらの詳細がアセンブリから削除されると同時にアプリケーションの機能が維持されることで、リバース エンジニアリングに対する防御が行われます。
変換
Dotfuscator Community には、名前の変更による変換を使用した基本的な保護機能が備わっています。 この変換は、型、メンバー、パラメーターの名前から意味を取り除くことで攻撃側ユーザーの作業をより困難にすることを目的としています。
自動的な逆コンパイルを妨害することを目的とした変換など、追加の変換は、Dotfuscator Professional にのみ用意されています。
ライブラリ モード
Dotfuscator では、入力アセンブリが次の 2 つのカテゴリに分類されます。
-
ライブラリ アセンブリ:Dotfuscator 構成に含まれていない他のアセンブリによって参照されるアセンブリです。
-
ライブラリ以外のアセンブリ:スタンドアロン アセンブリまたは他の入力アセンブリによって参照されるだけのアセンブリです。
Dotfuscator の変換は、入力のカテゴリによって異なる動作を行います。 Dotfuscator Community で最も重要な違いは、ライブラリ アセンブリのパブリック型と公的にアクセス可能なメンバーが名前変更されない点です。これは、それらのコード要素が外部アセンブリによって名前で参照されるためです。
入力の構成でライブラリ モードを明示的に無効化しておかない限り、入力はライブラリ アセンブリである必要があります。 入力が外部アセンブリによって参照されない場合は、その入力に対してライブラリ モードを無効化しておくことで、名前変更の量を増やすこともできます。
スマート難読化
スマート難読化は Dotfuscator の機能の 1 つで、既知の API 使用パターンおよびアプリケーションの種類に対し、自動的に組み込みの難読化規則を適用するものです。
たとえば、アセンブリで Enum.ToString()
などにより特定の列挙の名前を使用している場合、名前はコードやユーザーにとって重要な場合が多いため、スマート難読化により、その列挙のメンバーが名前変更対象から自動的に除外されます。
スマート難読化は処置を取る必要があることは認識できますが、静的分析がもたらす情報が十分でないためどの特定操作を行うべきかを判断できないことがあります。 このような場合、スマート難読化はそのような判断ができない代わりに警告を発します。
スマート難読化を有効にしている場合(既定の設定)、ビルドを行うと、通常のビルド出力に加えて、スマート難読化の情報と警告も生成されます。 これらは、ユーザー インターフェイスの下部に追加されるタブの中に表示されます。
宣言による難読化
Dotfuscator は、そのユーザー インターフェイスを使って難読化変換を構成できるだけでなく、 標準の .NET 属性を使ってアセンブリ内に宣言によって指定された構成にも従います。 この処理は宣言による難読化と呼ばれています。
宣言による難読化を有効にするには
-
必要に応じて難読化属性を使ってコードにアノテーションを付けます。
-
関連する入力アセンブリごとに、必ず[難読化属性の使用]オプションを有効にします。
- [難読化属性の除去]オプションも有効にすることを強くお勧めします。Dotfuscator によってアセンブリが処理された後には、難読化属性は必要でなくなるためです。
-
Dotfuscator 構成をビルドします。
たとえば、リフレクションによって呼び出されることが知られているメソッドの場合を考えましょう。 このメソッドが Dotfuscator によって名前変更された場合に、リフレクションを使った検索が行われると、実行時エラーが発生します。
次のコードに示すようにこのメソッドに対して ObfuscationAttribute
を使用すると、そのメソッドが名前変更対象から除外されるように指定することができます。
リフレクションからの呼び出し、名前の変更対象から除外:
[System.Reflection.Obfuscation(Exclude=true, Feature="renaming")]
public void CalledFromReflection(int someValue) {
Dotfuscator がこのソース コードで生成されたアセンブリを処理する際、構成内のすべての対象除外処理が行われるだけでなく、このメソッドが名前変更対象から除外されます。
グローバル オプション、[Ildasm を抑制する]
最近のバージョンの Visual Studio(15.6 以降)では、アセンブリを逆コンパイルして C# のコードにすることができます。 Dotfuscator により、アセンブリに対して Visual Studio がこの機能を使用しないようにすることができます。それには、すべての出力アセンブリに SuppressIldasmAttribute
を追加します。 これにより同時に、公式の .NET 逆アセンブラー、ildasm
がユーザーのアセンブラーに作用しなくなります。 この属性が Visual Studio と ildasm
での逆コンパイルに対してのみ防御し、サード パーティ製ツールに対しては防御しないことに注意してください。
この機能を有効化するには、Dotfuscator の GUI を使用するか、Dotfuscator CLI に -suppress:on
を渡します。