難読化後の出力の表示と検証

ステップ 1 – 逆アセンブラの使用

.NET Framework SDK には、"ildasm" と呼ばれるディスアセンブラ ユーティリティが含まれています。これを使用すると、.NET アセンブリを IL アセンブリ言語のステートメントにデコンパイルすることができます。ildasm を起動するには、.NET Framework SDK がインストールされていること、パスが設定されていることを確認した後、コマンド ラインから ildasm と入力します。

メモ :Visual Studio.NET がインストールされていて、ildasm が起動しない場合は、ildasm へのパスが設定されていない可能性があります。Visual Studio コマンド プロンプトを開くには、[スタート] メニューの [Visual Studio [バージョン番号]] をポイントし、[Visual Studio Tools] をポイントして [Visual Studio [バージョン番号] コマンド プロンプト] をクリックします。その後、ildasm と入力します。

  • [ファイル] メニューの [開く] をクリックして、次を参照します。
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug
  • GettingStarted.exe を選択して [開く] をクリックします。逆アセンブルされたアセンブリのビューが表示されます。

ms227212.quickstart_ildasm1(ja-jp,VS.90).jpg

  • 現在表示されている、難読化されていない HelloWorld アプリケーションを、難読化されたアプリケーションと比較するために、ildasm をもう 1 つ起動します。今度は以下を参照します。
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated
  • GettingStarted.exe を選択して [開く] をクリックします。

ms227212.quickstart_ildasm2(ja-jp,VS.90).jpg

2 つの ildasm ウィンドウを並べて配置します。2 つの表示を比較してください。

難読化されていない逆アセンブリのウィンドウには、かなり理解しやすいメソッド名が表示されています。たとえば、ConverseButton_Click:void (object, class [mscorlib]System.EventArgs) というメソッドであれば、Converse ボタンがクリックされたときに呼び出されるメソッドと考えることができます。しかし、難読化されたアセンブリを見てください。Converse ボタンをクリックしたとき、どのメソッドが呼び出されるか推測できますか。見分けることは困難です。SaySomething メソッドがなくなっている点にも注目してください。これは、コード内のどこからも使用されていないメソッドが削除されたためです。

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 )

コードのリバース エンジニアリングを試みる者が、どれほど混乱させられるか想像してみてください。特に、複雑なアプリケーションの場合は、なおさら困難です。

ステップ 2 – 逆コンパイル

ソース コードを逆コンパイルできるのは、IL アセンブリ言語に詳しい知識の豊富なごく一部の人たちだけだと思うかもしれませんが、そうではありません。実際には、Reflector や Anakrino などの逆コンパイラを使用して、アプリケーションからソース コードを再作成することができます。これらのユーティリティを使うと、.NET のアセンブリをC#、VB、.NET、または C++ などの高水準言語に直接戻すことが可能です。

このセクションでは、無償で入手できる次の 2 つの逆コンパイラを使用します。

  1. Reflector for .NET、http://www.aisto.com/roeder/dotnet/
  2. Anakrino (GUI 版)/Exemplar (コマンド ライン版)、http://www.saurik.com/net/exemplar/

Dotfuscator で処理された GettingStarted.exe ファイルを指定して Anakrino/Exemplar を実行すると、次のエラーが表示されます。

Exemplar.exe has encountered a problem and needs to close.We are sorry for the inconvenience.

Dotfuscator で処理された GettingStarted.exe ファイルを指定して .NET Reflector を実行し、a() などのメソッドを調べようとすると、次の例外がスローされます。

This item appears to be obfuscated and can not be translated.

System.NotSupportedException:Cannot resolve local variable 'Label_0047'.
at Reflector.CodeModel.Memory.GotoStatement.Resolve()
at _12.VisitBlockStatement(IBlockStatement statement)
at _111.VisitStatement(IStatement value)
at _119.VisitMethodDeclaration(IMethodDeclaration value)
at _125.VisitMethodDeclaration(IMethodDeclaration value)
at _126.VisitMethodDeclaration(IMethodDeclaration value)
at _123.VisitMethodDeclaration(IMethodDeclaration value)
at _146._1(Boolean )

以上で、Dotfuscator Professional を使用することによって、2 つの主要な逆コンパイラによるリバース エンジニアリングを完全に妨害できることが検証されました。

© 2002-2007 PreEmptive Solutions. All rights reserved.