Dotfuscator のソリューション
現在、大部分の商用難読化プログラムは、意味のない識別子を適用する名前変更技法を採用しています。一般的に、このような識別子は 1 文字程度の短さです。難読化プログラムがコードを処理する際、置き換え用に次に利用可能な意味のない識別子を選択します。これは一見、単純な名前変更規則ですが、ハッシュまたは文字セットのオフセットよりも大きな利点があります。つまり、これは、リバース エンジニアリングできません。プログラム ロジックを保持したまま、名前が意味を持たなくなります。この時点で、人間にはかなり理解できなくなります。a
、t.bb()
、ct
、2s(e4)
といった識別子に対して、これらの識別子が意味するものを invoiceID
、address.print()
、userName
、deposit(amount)
のような概念であると解釈するのは困難です。それにもかかわらず、プログラム ロジックはリバース エンジニアリングされることがあります。
より厳重に難読化を行うには、PreEmptive Solutions が考案した、米国で特許を取得したアルゴリズムである、オーバーロード誘導を使用します。これも意味のない名前の変更を使用しますが、巧妙な機能が追加されています。メソッドの識別子は、徹底的にスコープ分析が行われた後、最大限にオーバーロードされます。オーバーロード誘導は、1 つの古い名前を 1 つの新しい名前に置き換えていくのではなく、できる限り多くのメソッドの名前を同じ名前に変更します。このように厳重に難読化を行うと、ロジックは壊れませんが、理解不能になります。実際の例を見てみましょう。次の簡単な例で、オーバーロード誘導技術の威力が理解できます。
難読化前のソース コード |
---|
private void CalcPayroll(SpecialList employeeGroup) { while (employeeGroup.HasMore()) { employee = employeeGroup.GetNext(true); employee.UpdateSalary(); DistributeCheck(employee); } } |
Dotfuscator によるオーバーロード誘導を行った後の リバース エンジニアリングされたソース コード |
---|
private void a(a b) { while (b.a()) { a = b.a(true); a.a(); a(a); } } |
この例でわかるのは、難読化後のコードの方がサイズが小さくなっていることです。名前の変更での良い副作用は、サイズが小さくなることです。たとえば、20 文字の長さの名前の場合、a()
に名前を変更すると、領域は大幅に (具体的には 19 文字分) 節約されます。また、名前の変更は文字列ヒープ エントリを節約することでも領域を節約します。すべての名前を "a
" に変更するということは、"a
" が 1 度だけ格納されることを意味し、名前が "a
" に変更されたメソッドあるいはフィールドは、それぞれがその名前をポイントできるのです。オーバーロード誘導は、最短の識別子を連続的に再使用するので、この効果を高めます。一般的に、オーバーロード誘導されたプロジェクトでは、最大 70% のメソッドが名前を a()
に変更されています。
Dotfuscator は処理を行うときに、デバッグ情報と不必要なメタデータを MSIL ファイルから削除します。Dotfuscator は、保護とセキュリティの強化だけでなく、MSIL ファイルのサイズの縮小にも役立ちます。
重要なのは、難読化がソース コードではなく、コンパイルされた MSIL コードに適用される処理であると理解することです。開発環境や開発ツールは、名前の変更に対応させるために変更されることはありません。ソース コードは、いかなる方法でも変更されず、読み取られることすらありません。難読化された MSIL コードは、機能上、従来の MSIL コードと同等であり、共通言語ランタイム (CLR) で実行すると、結果は同じになります。(ただし、逆は当てはまりません。難読化された MSIL を厳密に逆コンパイルできる場合でも、元のソース コードと比較すると、意味に重大な格差があります。) 次の図は、Dotfuscation 処理の流れを示しています。
PreEmptive Solutions は 1996 年より、Java 用の DashO ツールを使用することから始めて、中間コンパイル言語で作成されたソフトウェアの保護および改良を行う作業に取り組んでいます。DashO 製品は、その機能、汎用性、および米国で特許を取得した独自の機能により市場で優勢を保ってきました。
Dotfuscator は、知的財産の保護について心配することなく、強力な .NET プラットフォームを利用できるようにするツール ファミリとして提供されます。Dotfuscator には、3 つのエディションがあります。
Dotfuscator Community Edition は、基本的な難読化機能を提供する無料版の難読化プログラムです。この主な目的は、識別子の名前を変更し、リバース エンジニアリングを明確に妨げることです。Dotfuscator Community Edition は、高度なテクノロジを組み込んで、このような保護を促進します。さらに、(意味のない識別子に名前を変更した結果として) サイズの縮小も行われます。
Dotfuscator Community Edition では、以下の機能はご利用いただけません。
- Visual Studio から独立して処理を実行すること。つまり、商用のビルド環境では使用できません。
- .NET 2.0 のジェネリック型とジェネリック メソッドの名前変更。
- Microsoft Office 統合アプリケーション用に作成された、マネージ コードの Dotfuscator 処理。
- Microsoft SQL Server 2005 内部で実行させるための、マネージ コードの Dotfuscator 処理。
- グローバル オプション以外でのライブラリ モードのサポート (ライブラリ モードはすべての入力アセンブリでオンまたはオフに設定されます)。
- グローバル オプション以外での宣言による難読化の設定のサポート (宣言による難読化の設定はすべての入力アセンブリでオンまたはオフに設定されます)。
- CLR を対象とする C++ アプリケーションのサポート。
以上の制限を持たない Dotfuscator が必要な場合は、Dotfuscator Professional Edition に関する詳しい情報が公開されている PreEmptive Solutions を参照してください。
このマニュアルでは、Dotfuscator Community Edition のライセンス所有者が使用できる機能を アイコンで示しています。
Dotfuscator Community Edition の登録ユーザーは、Dotfuscator Enhanced Community Edition を無償ダウンロードで入手できます。このエディションには Dotfuscator Community Edition の機能が含まれているほかに、次の機能が追加されています。
緊密な Visual Studio 統合
SO シグナルを使用した、ランタイム インテリジェンスによるアプリケーション強化のサポート
SO シグナルを使用した、アプリケーションの改ざんの検出および通知のサポート
このマニュアルでは、Community Edition に含まれていない機能で、Dotfuscator Enhanced Community Edition では使用できる機能を アイコンで示しています。
Dotfuscator Professional Edition には Dotfuscator Community Edition の機能のほかに、非常に多くの機能が含まれています。商用アプリケーションおよびエンタープライズ アプリケーションを製造する企業に適した、業界をリードする難読化プログラムです。Dotfuscator Professional Edition を使用すると、逆コンパイラを妨害する優れた保護機能、メモリの節約と読み込み時間の短縮を可能にする高度なサイズ縮小、シームレスな構成のための緊密な Visual Studio.NET 統合、パッチ リリースのための増分難読化、アセンブリに一意なタグを付けるウォーターマーク、そして電話および電子メールによるテクニカル サポートが利用できます。このマニュアルでは、Dotfuscator Professional Edition のライセンス所有者が使用できる機能を アイコンで示しています。
次の表は、Dotfuscator 製品を機能別に比較したものです。
機能 | Professional Edition | Dotfuscator Enhanced Community Edition | Community Edition |
---|---|---|---|
サイズ縮小/余分なコードの除去 | |||
.NET Compact Framework の包括的なサポート | |||
制御フローの難読化 | |||
拡張オーバーロード誘導 | |||
増分難読化 | |||
サテライト DLL のシームレスな難読化 | |||
文字列の暗号化 | |||
アセンブリのリンク | |||
ビルド前とビルド後のビルド イベントのサポート | |||
厳密名のアセンブリの自動的な再署名 | |||
MSBuild との統合 | |||
ソフトウェアのウォーターマーク処理 | |||
Visual Studio.NET から独立して実行可能 | |||
各種名前変更規則 | |||
PDB デバッグのサポート | |||
名前の変更プレフィックス | |||
C++ .NET アセンブリのサポート | |||
スタック トレースの自動変換 | |||
XML/HTML レポート ファイル | |||
ジェネリック型とジェネリック メソッドのサポート | |||
ビルド スクリプトを使用した統合 | |||
緊密な Visual Studio 統合 | |||
SO シグナルによる、ランタイム インテリジェンスの有効化 | |||
SO シグナルによる、アプリケーションの改ざんの検出および通知の有効化 | |||
複数アセンブリにまたがる難読化 | |||
使用されていないメタデータの削除 | |||
名前の変更 | |||
宣言による難読化のサポート |
© 2002-2007 PreEmptive Solutions. All rights reserved.