.NET 用に作成されたプログラムは、リバース エンジニアリングが簡単です。 .NET アプリケーションは、MSIL(Microsoft Intermediate Language。別称:CIL)と呼ばれる表現的で高級なアセンブラー言語にコンパイルします。これには、メソッド名と変数名が含まれており、簡単にソースの形式に逆コンパイルすることができます。 攻撃者は自由に利用できる逆コンパイラを使用して、あらゆる .NET アプリケーションのソースや、公開しているソフトウェアのライセンス コード、コピー保護メカニズム、所有権を有するビジネス ロジックなどを、合法的であるかどうかは別として、簡単に見ることができます。
このようなリバース エンジニアリング ツールには、逆アセンブラーや逆コンパイラがあります。逆アセンブラーにより、アセンブリの MSIL が露呈されます。逆コンパイラはアセンブリ内の MSIL を C# などのソース言語に逆変換します。
.NET アプリケーションが非常に簡単にリバース エンジニアリングできることを自身で確認するには、GettingStarted サンプル(または自身のアプリケーション)に対して、各タイプのツールを使用した例をお読みください。
逆アセンブル
逆アセンブラーは、コンパイル後のバイナリを、実際の内容を読み取ることができるアセンブリ コードに変換するツールです。 .NET Framework SDK には、.NET アセンブリを MSIL アセンブリ言語に変換する、"ILdasm" という逆アセンブラーが同梱されています。
ILdasm の使用
-
[スタート]メニューにある[Developer Command Prompt for VS 20xx]のショートカット(古いバージョンの Visual Studio の場合は、[Visual Studio コマンド プロンプト(20xx)])で、「ildasm」を入力します。
メモ: Visual Studio がインストールされていない場合でも、.NET Framework SDK をインストールすれば、インストール ディレクトリに ildasm.exe が見つかるため、ILdasm を使用することができます。 -
[ファイル]メニューの[開く]をクリックして、
Debug
構成の GettingStarted サンプルを出力を参照します(例:C:\dotfuscator-pro-samples\GettingStarted\bin\Debug
) 。 -
GettingStarted.exe を選択します。
-
現在表示されている、難読化されていない HelloWorld アプリケーションを、Dotfuscator で保護されたバージョンと比較するために、ILdasm をもう 1 つ起動します。
-
今度は
Release
構成のサンプル ビルドの出力を参照します(例:C:\dotfuscator-pro-samples\GettingStarted\bin\Release
)。 -
GettingStarted.exe を選択します。
-
[開く]をクリックします。
難読化されていない逆アセンブリのウィンドウには、かなり理解しやすいメソッド名が表示されていることに注目してください。 たとえば、ConverseButton_Click: void (object, class [mscorlib]System.EventArgs)
というメソッドであれば、[Converse]ボタンがクリックされたときに呼び出されるメソッドと考えることができます。 しかし、難読化されたアセンブリを見てください。Converse ボタンをクリックしたとき、どのメソッドが呼び出されるか推測できますか。見分けることは困難です。
SaySomething
メソッドがなくなっている点にも注目してください。 このメソッドは、コード内のどこからも使用されていないため、Dotfuscator によって除去されました。
元のアセンブリから SayHello:string()
メソッドをダブルクリックし、難読化されたアセンブリから a:string()
メソッドをダブルクリックします。 この 2 つのメソッドは同じものですが、逆アセンブルした IL コードをよく調べると、難読化されたアセンブリで文字列が暗号化されており、コードの判読が難しくなっているのがわかります。
たとえば、難読化されていないアセンブリのウインドウから次の行を探してください。
IL_0000: ldstr "Hello, my name is "
次に、難読化された方のウィンドウから、この文字列を探してみてください。 なかなか見つからないのは、文字列が暗号化されているためです。暗号化された文字列は次のように表示されています。
IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50
28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60
12 62 43 64 )
コードのリバース エンジニアリングを試みる攻撃者が、どれほど混乱させられるか想像してみてください。特に、複雑なアプリケーションの場合は、なおさら困難です。
逆コンパイル
リバース エンジニアリングできるのは、MSIL アセンブリ言語を知っている、ごく一部の技術的な人々に限定されるものではありません。 さらに一歩進めて、実際には、逆コンパイラを使用して、アプリケーションからソース コードを再作成することができます**. これらのユーティリティを使うと、.NET のアセンブリを C#、VB、.NET、または Managed C++ などの高水準言語に直接戻すことが可能です。 .NET アプリケーションのソースを簡単に表示するのに使用できる逆コンパイラはたくさんあります。
ILSpy の使用
ILSpy は、無料で使用できる逆コンパイラです。
逆コンパイルされたバージョンの GettingStarted.exe
を ILSpy で表示するには
-
ILSpy をダウンロードします。
-
ZIP アーカイブを解凍し、
ILSpy.exe
を実行します。 -
ILSpy インターフェイスで、[File]メニューを開いて[Open]を選択します。
-
C:\dotfuscator-pro-samples\GettingStarted\bin\Debug
を参照します。 -
コード ツリーを使用して、アセンブリの内容を調べます。 元のソース コードとの類似点に注目してください。プライベート メンバーとローカル変数の名前は保持されており、制御フローは本質的に同じです。
GettingStarted.exe
に対して Dotfuscator を使用した後でも、ILSpy を使って、GettingStarted.exe
の保護されたバージョンを未保護バージョンと同様の方法で表示することができます。 ただし、サンプル アプリケーション GettingStarted.exe
を Dotfuscator で保護した後で逆コンパイルする際に ILSpy エラーが発生することに気づくでしょう。
Reflector の使用
Reflector は、.NET の商用逆コンパイラです。 アプリケーションを Dotfuscator によって保護した後では、Reflector のリバース エンジニアリング効果が大幅に低下します。 難読化された GettingStarted.exe
ファイルに対して Reflector を実行し、a()
などのメソッドを調べようとすると、次のメッセージが表示されます。
This item appears to be obfuscated and can not be translated.