Dotfuscator を使用して作成したアプリケーションを難読化する
概要
.NET Framework をベースにして作成したアプリケーションは共通中間言語と呼ばれる形で作成されるため、逆アセンブリツールなどを使うことによって元のソースコードに近い形で読み取ることができてしまいます。ここでは Visual Studio に付属している難読化ツール「Dotfuscator」によってクラスやメソッド名など簡単には読み取れない形式に難読化する手順について説明します。
ここでは Visual Studio 2010 を使って説明していますが、2005 や 2008 でも Dotfuscator を使うことができます。
動作環境
対応 Visual Studio バージョン
- 2005
- 2008
- 2010
確認 Visual Studio バージョン
- 2005
- 2008
- 2010
内容
Dotfuscator について
Dotfuscator は .NET Framework で作成されたアプリケーションを逆アセンブリされた場合にソースコードを読み取りにくくさせるための難読化ツールです。Dotfuscator には Visual Studio に付属する無償版と有償の製品版があります。
無償版は機能の多くが制限されていたり Visual Studio が起動されていることが前提でないと使用できませんが、Visual Studio さえインストールすればだれでも使用することができます。有償版には無償版にはない強力な難読化機能が多く存在しますが、一般の人にはなかなか手を出しにくい価格で提供されています。
Dotfuscator はバージョンなどによって機能や価格、エディションが異なったりするので詳しくは下記のホームページを参照してください。
難読化手順
.NET Framework で作成されたアプリケーションは逆アセンブルで簡単に元のソースコードが読みとれてしまうということは前述しましたが、実際どうなのかというと右図のように exe ファイルを逆アセンブルすると名前空間やクラス名、メソッド名など元のソースコードがほとんど再現できてしまいます。
これらの名称をわかりにくく難読化するための手順について説明します。
Visual Studio でアプリケーションを作成し、exe ファイルを作成するところまでは通常の作成方法と全く同じです。
ビルドし exe ファイルを作成したら Visual Studio のメニューから「ツール」を選択し、「Dotfuscator Software Services」を選択します。
初回起動時は右図のように「使用許諾契約書」ダイアログが表示されますので、内容をよく読み「はい、使用許諾契約書に同意します。」にチェックをいれ「OK」ボタンをクリックします。
「Dotfuscator Software Services」が起動します。
難読化する exe ファイル(または dll ファイル)は現在開いているプロジェクトのものでなくてもかまいません。
左のツリーから「入力アセンブリ」を選択し、右の入力アセンブリから「...」ボタンをクリックします。
難読化したい exe ファイルを選択します。
選択した exe ファイルがリストに追加されます。複数のファイルを難読化したい場合は2行目以降の「...」ボタンをクリックして追加してください。
難読化する exe を選択したらツールバーから「プロジェクトのビルド」ボタンをクリックします。
プロジェクトに変更がある場合はプロジェクト保存確認ダイアログが表示されますので「はい」をクリックして保存します。
プロジェクトは「.xml」ファイルとして保存されます。難読後の exe ファイルも同じ場所に保存されるので任意のフォルダに .xml ファイルを保存してください。
ビルドが開始されますので完了されるまで待ちます。プログラムが巨大化ほどビルドに時間がかかる点に注意してください。右図のようになったらビルドが完了です。
メッセージ欄にはビルドの進行状況とどの程度難読化できたかなどの簡単な結果が表示されます。
左のツリーから「結果」を選択すると、クラス名やメソッド名がどのように変更されたか詳細を見ることができます。
クラス名やメソッド名の下に Dotfuscator のアイコンと「a」や「b」などの名前がありますが、これが難読化後の名称になります。このようにクラス名やメソッド名を意味のない名前に変えることによって逆アセンブルされてもソースコードの中身を読みにくくさせることができます。
難読化した exe ファイルはプロジェクトの保存で保存した .xml ファイルのフォルダに「Dotfuscated」というフォルダが作成され、その中に作成されます。exe ファイルの他に「Map.xml」ファイルが作成されていますが、これは難読化の結果ファイルなので使うことはありません。
難読化した exe はそのまま実行して使うことができます。しかし、右図のように不明なエラーで起動できない場合もあります。
今回は WPF でアプリケーションを作成したのですが、最初に表示するウインドウの XAML ファイルが文字列で指定されているため、難読化による名前変更によって参照先がなくなってしまうためエラーになってしまいます。
Windows Form アプリケーションの場合は From クラスを直接参照しているため、難読化してもエラーなく実行できます。しかしクラス名や列挙型などを名前で指定している場合は同様のエラーになる可能性があるので注意が必要です。
もし難読化したくないクラスなどがあれば、Dotfuscator の左のツリーから「名前の変更」を選択し、中央のタブから「除外」を選択します。
右のリストに各名前空間、クラス名などが表示されるので、難読化したくない項目にチェックをつけます。
ここでは最初に表示させるウインドウのクラス名を変更させたくないので「MainWindow」にチェックを入れています。
ビルドを行うと、MainWindows のクラス名の下に変更後の名前がないことが確認できます。(App クラスは「a」に変換されている)
難読化後の exe ファイルを実行すると正常にウインドウが表示されていることが確認できます。
難読化した exe ファイルを逆アセンブルしてみるときちんとクラス名やメソッド名が「a」や「b」に変更されていることが確認できます。
余談ですが、.NET Framework のライブラリで定義されているクラス名などはすでに Windows などでインストールされているアセンブリであるため名前変更の対象にはならないことに注意してください。
今回は作成されたデフォルトのプロジェクトをそのまま難読化したため、さほど難読化されていないイメージがあると思いますが、プロジェクトが大きくなるほどクラスの数なども増えるため難読化の効果がはっきりしてくると思います。
また、今回は無償版での手順を載せましたが、有償版を使用するとより複雑な難読化を行うことができたり、逆アセンブル自体を防ぐこともできるようになります。ただ、難読化はいろいろ弊害も発生する可能性も秘めているため、難読化する場合は設計当初から正常に動作するかを考慮しながら作る必要があります。