.NET Tools

.NET逆コンパイラとコードを難読化するDotfuscator

(株)ピーデー
川俣 晶
2003/09/23

Page1 Page2 Page3 Page4

クラス・ライブラリが何をしているか知りたいとき

 クラス・ライブラリは便利なものであり、プログラムを開発する際にはお世話になることが多い。.NET Frameworkに標準で含まれるものもあるし、ほかのベンダから提供されるものを使う場合もあるだろう。また、共通して使うクラスをクラス・ライブラリとして自分で開発することもあるだろう。

 しかし、クラス・ライブラリを使っていると、しばしばある種の問題に直面する。クラスの動作がはっきりしない、あるいは意図したとおりではない、という場合である。クラス・ライブラリのソース・コードがあればそれを見て確認できるが、それが提供されていない場合はリファレンス・マニュアルにより判断することになる。だが、これの出来が悪いと頭を悩ませることになる。マニュアルの記述があいまいで、どういう動作になるのが正しいか分からなかったり、マニュアルに記述された動作と実際の動作が違ったりする場合などは、本当に悩むことになる。

 ここでは1つの例として、以下のような宣言を伴うメソッドがクラス・ライブラリの中にあるとしよう。これは、与えられた2つのXY座標から、その2点間の距離を求めるメソッドとする。

public static int Distance( int x1, int y1, int x2, int y2 )

 このメソッドを使おうとしたとき、ふと次のような疑問を持ったとする。整数で示される2点間の距離は、必ずしも整数になるとは限らない。しかし、このメソッドは整数を返す。小数部が出たとき、それはどうなるのだろうか。切り捨てられるのだろうか。四捨五入なのだろうか。ソース・コードはないし、マニュアルにもそのことは書かれていない。そんな状況に陥ったとしよう。

 そのような場合に、.NET Frameworkが提供されるようになった当初からよく使われてきたテクニックは、.NET Framework付属のIL Disassembler(ildasm.exe)を使った逆アセンブルである。.NET Frameworkの実行ファイル(アセンブリ)はIL(Intermediate Language)と呼ばれる仮想的なマシン語によって記述されている。実行ファイルをILの命令コードによる記述へと復元するものが、Disassembler(逆アセンブラ)である。

 IL DisassemblerはGUIで操作できるので、使用はさほど難しくない。まずildasm.exeを探して実行し、[ファイル]メニューの[開く]で、目的のアセンブリ(具体的にはEXEファイルやDLLファイル)を開く。

IL Disassembler(ildasm.exe)の実行画面
アセンブリの内容がツリー構造で表示される。画面では、クラス「Calculate」の配下にコンストラクタ(.ctor)とDistanceメソッドが見える。

 次に、ツリー構造の中から目的のメソッドを探して、それをダブルクリックする。

ILで記述されているDistanceメソッドの内容
ツリーから該当するメソッドをダブルクリックするとこのウィンドウが表示される。しかし一般のプログラマーがこれを読んで理解するのは困難だ。

 これでプログラムが何をしているか、一目瞭然となった……といいたいところだが、恐らく読者のほとんどは「何が書いてあるのかさっぱり分からない」という感想を持ったと思う。確かに、表示形式は人間に見やすい形になったが、ILが読めなければ何の意味もない。低レベルなILの学習に迫られるプログラマーはほとんどいない。従って一般のプログラマーは読めないのが普通と思って間違いないだろう。

 では、こんな状況にはどう対処すればよいのだろうか。ILではなく、C#やVisual Basic .NET(以下VB.NET)など、一般のプログラマーが普段使っている言語に復元してくれるツールがあればベストである。そして、そういったツールが世の中にはいくつか存在する。

 

 INDEX
  [.NET Tools]
  .NET逆コンパイラとコードを難読化するDotfuscator
   1.クラス・ライブラリが何をしているか知りたいとき
     2.Reflector for .NETで逆コンパイルする
     3.コードの難読化を行うDotfuscator
     4.製品版Dotfuscatorによる文字列の暗号化
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間