Silverlight アプリケーションを Dotfuscator で難読化する

概要

.NET Framework をベースにして作成したアプリケーションは共通中間言語と呼ばれる形で作成されるため、逆アセンブリツールなどを使うことによって元のソースコードに近い形で読み取ることができてしまいます。ここでは Visual Studio に付属している難読化ツール「Dotfuscator」によってクラスやメソッド名など簡単には読み取れない形式に難読化する手順について説明します。

ここでは Visual Studio 2013 を使って説明していますが、以前のバージョンでも Dotfuscator を使うことができます。

Dotfuscator

動作環境

Visual Studio
  • Visual Studio 2005 Standard Edition 以上
  • Visual Studio 2008 Standard Edition 以上
  • Visual Studio 2010 Professional 以上
  • Visual Studio Professional 2012 以上
  • Visual Studio Professional 2013 以上
Dotfuscator 全バージョン

動作確認環境

Visual Studio Visual Studio Professional 2013
Dotfuscator PreEmptive Dotfuscator and Analytics

内容

Dotfuscator について

Dotfuscator は .NET Framework で作成されたアプリケーションを逆アセンブリされた場合にソースコードを読み取りにくくさせるための難読化ツールです。Dotfuscator には Visual Studio に付属する無償版と有償の製品版があります。

無償版は機能の多くが制限されていたり Visual Studio が起動されていることが前提でないと使用できませんが、対象の Visual Studio がインストールされていればだれでも使用することができます。有償版では無償版にはない強力な難読化機能が多く存在しますが、一般の人にはなかなか手を出しにくい価格で提供されるところが悩ましいかもしれません。

Dotfuscator はバージョンなどによって機能や価格、エディションが異なったりするので詳しくは下記のホームページを参照してください。

Dotfuscator

解析されたコード

.NET Framework で作成されたアプリケーションは逆アセンブルで簡単に元のソースコードが読みとれてしまうということは前述のとおりですが、実際どうなのかというと図のようにアセンブリファイルを逆アセンブルすると名前空間やクラス名、メソッド名など元のソースコードがほとんど再現できてしまいます。

解析されたコード

難読化手順

まずは通常どおり Silverlight アプリケーションを作成して Release ビルドを行います。ここではボタンを2つ配置しているだけのアプリケーションを作成しています。

Release ビルド

プロジェクトのあるフォルダの「Bin\Release」フォルダにある「.xap」ファイルが Silverlight アプリケーションで使われるプログラム、ファイルをまとめたパッケージファイルになります。

XAP ファイル

実はこのファイルは ZIP ファイルとして圧縮、まとめたものなので、拡張子を「.zip」に変更することができます。

拡張子を .zip に変更

ZIP ファイルに変わりました。

ZIP ファイル

ファイルを開くと中にはマニフェストファイルと DLL が入っています。この DLL がプログラムをコンパイルしたものでアプリケーションとして実行されるものになります。

ちなみに DLL ファイルはビルドしたときに Release フォルダにも配置されるので、今回はこちらのファイルを難読化します。

ZIP ファイルの中身

Visual Studio のメニューから「ツール」を選択し、「PreEmptive Dotfuscator And Analytics」を選択します。

初回起動時は「使用許諾契約書」ダイアログが表示されますので、内容をよく読み「はい、使用許諾契約書に同意します。」にチェックをいれ「OK」ボタンをクリックします。

PreEmptive Dotfuscator And Analytics を選択

「PreEmptive Dotfuscator And Analytics CE」が起動します。

PreEmptive Dotfuscator And Analytics CE

左のツリーから「入力」を選択し、「入力の追加」ボタンをクリックします。

入力の追加

ビルドで生成した DLL ファイルを選択します。

ビルドで生成した DLL ファイルを選択

追加した DLL ファイルを選択し、「ライブラリ モード」「XAML の変換」のチェックを外します。

「ライブラリ モード」にチェックが入っていると public で定義されたクラスやメソッドなどが難読化されません。

「XAML の変換」にチェックが入っていると XAML で定義されたクラスが難読化されますが、作り方によっては起動エラーになってしまうので、エラーになるようであればチェックを外しておいてください。

「ライブラリ モード」「XAML の変換」のチェックを外す

基本的に全クラス、メソッド、プロパティ、変数名が難読化されますが、シリアライズなどで特定の名前空間、クラスを難読化したくない場合は左のツリーから「名前の変更」を選択、「除外」タブを選択して、対象の名前空間やクラスにチェックを入れます。

難読化の除外

「組み込み規則」では「Silverlight および WPF UserControls のフィールド」にチェックが入っていることを確認してください。これにチェックを入れることにより UserControls のフィールドが難読化対象外となり、正常に実行されるようになります。難読化しても正常に実行されるようであればチェックを外してもかまいません。

Silverlight および WPF UserControls のフィールド

設定が終わったらツールバーから「プロジェクトのビルド」ボタンをクリックします。

プロジェクトのビルド

プロジェクトに変更がある場合はプロジェクト保存確認ダイアログが表示されますので「はい」をクリックして保存します。

プロジェクト保存確認ダイアログ

プロジェクトは「.xml」ファイルとして保存されます。難読化したファイルは同じ場所に保存されます。

プロジェクト保存

ビルドが開始されるので完了まで待ちます。プログラムが巨大化ほどビルドに時間がかかる点に注意してください。図のようになったらビルドが完了です。

メッセージ欄にはビルドの進行状況と、どの程度難読化できたかなどの簡単な結果が表示されます。

ビルド完了

左のツリーから「結果」を選択すると、クラス名やメソッド名がどのように変更されたか詳細を見ることができます。

クラス名やメソッド名の下に Dotfuscator のアイコンと「a」や「b」などの名前がありますが、これが難読化後の名称になります。このようにクラス名やメソッド名を意味のない名前に変えることによって逆アセンブルされてもソースコードの中身を読みにくくさせることができます。

難読化結果

難読化したファイルは、プロジェクトの保存で保存した .xml ファイルのフォルダに「Dotfuscated」というフォルダが作成され、その中に作成されます。難読化したファイルの他に「Map.xml」ファイルが作成されていますが、これは難読化の結果ファイルなので使うことはありません。

難読化したファイル

難読化したファイルを逆アセンブルしてみると、いくつかのクラス名やメソッド名が「a」や「b」に変更されていることが確認できます。

今回は作成されたデフォルトのプロジェクトをほぼそのまま難読化したため、さほど難読化されていないイメージがあると思いますが、プロジェクトが大きくなるほどクラスの数なども増えるため難読化の効果がはっきりしてくると思います。

余談ですが、.NET Framework のライブラリで定義されているクラス名などはすでに Windows などでインストールされているアセンブリであるため名前変更の対象にはならないことに注意してください。

難読化したコードの解析

Silverlight では DLL をそのまま使用しませんので XAP ファイルとしてパッケージ化します。冒頭でも記載したとおり、XAP ファイルは ZIP ファイルの拡張子を変更しただけのものなので、XAP ファイルに含まれていたファイルと難読化した DLL を集めて ZIP ファイルを作成します。

ZIP ファイルの作成は OS の標準機能を使用してかまいません。

ファイルを ZIP 化

ZIP ファイルが作成されます。

ZIP ファイル

拡張子を「.xap」にし、ファイル名が異なる場合は本来のパッケージファイル名に変更します。

作成した XAP ファイルは配布場所に配置してください。

XAP ファイルに変更

実際に動作確認をして正常に動作するかどうか確認してください。

起動しないようであれば、難読化するコードを減らしたりなどして正常に動くまで確認します。Silverlight では XAML 関連で引っかかることが多いので注意してください。

動作確認

今回手順を載せていませんが、プログラムに署名をつける場合は、遅延署名状態でビルドを行い、アセンブリを難読化した後に再署名を行ってください。署名したまま難読化を行ってもビルド時につけた署名コードと難読化後の署名コードが一致しなくなるので起動できなくなります。

今回は無償版での手順を載せましたが、有償版を使用するとより複雑な難読化を行うことができたり、逆アセンブル自体を防ぐこともできるようになります。ただ、難読化はいろいろ弊害も発生する可能性も秘めているため、難読化する場合は設計当初から正常に動作するかを考慮しながら作る必要があります。