.NET Tools

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

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

Page1 Page2 Page3 Page4

コードの難読化を行うDotfuscator

 結論からいえば、完全に逆コンパイルを防止することはできない。実行するために必要な情報をたどることで、かなりの情報が得られてしまう。しかし、簡単にソース・コードの意味を理解させないようにすることはできる。それを行うツールを「難読化ツール(obfuscator)」という。Visual Studio .NET 2003には、「Dotfuscator Community Edition」という難読化ツールが標準で含まれているので、これを利用している場合はすぐに試すことができる。難読化ツールというと難しそうに思えるかもしれないが、このツールは作成したアセンブリを自動的に書き換えるので、これまでの開発手順が変わるわけではない。アセンブリの作成後にこのツールを適用する手順が増えるだけである。

 さて、それでは実際に上記のコードを、Dotfuscator Community Editionで難読化してみよう。

 スタート・メニューから[Microsoft Visual Studio .NET 2003]を探し、[Visual Studio .NETツール]−[Dotfuscator Community Edition]を選ぶ。これで、Dotfuscator Community Editionが実行される。最初はユーザー登録を促すダイアログ・ボックスが表示されるかもしれない。続いて次のようなダイアログ・ボックスが表示される。

Visual Studio .NET 2003に付属する難読化ツール「Dotfuscator Community Edition」の起動時画面
スタート・メニューから[Microsoft Visual Studio .NET 2003]−[Visual Studio .NETツール]−[Dotfuscator Community Edition]を選んで実行できる。統合環境から[ツール]−[Dotfuscator Community Edition]でも実行可能。

 ここは、[プロジェクトの新規作成]を選び、[OK]ボタンを押す。

 次に[トリガ」タブをクリックし、[参照]ボタンを押して難読化したいアセンブリを選ぶ。

難読化するアセンブリの選択画面
[トリガ」タブで[参照]ボタンを押して難読化したいアセンブリを選ぶ。

 次に[ビルド]タブをクリックし、一時ファイルを置くための一時ディレクトリと、結果を出力するための出力先ディレクトリを設定し、[ビルド]ボタンをクリックする。

一時ディレクトリと出力先ディレクトリの設定
[ビルド]タブで一時ファイルを置くための一時ディレクトリと、結果を出力するための出力先ディレクトリを設定し、[ビルド]ボタンをクリックする。

 ビルドが完了したら、[出力]タブをクリックしよう。ツリーをたどると、難読化の内容が表示される。この例では、Checkというメソッド名が「a」という名前に置き換えられ、CustomerIDというクラス名が「b」という名前に置き換えられたことが分かる。つまり、分かりやすい名前が分かりにくい名前に置き換えられ、難読化されたわけである。

難読化されたアセンブリ
メソッド名が「a」や「b」などの分かりにくい名前に置き換えられている。

 さて、難読化した結果のアセンブリをReflector for .NETで開いてみよう。なお、筆者のシステム固有、あるいは特定のバージョンのReflector for .NETの問題かもしれないが、1つだけ問題点があった。Reflector for .NETは同じ名前の項目があると古い情報を表示し続けるようで、すでに読み込まれたものと同じ名前のアセンブリを見る場合には、Reflector for .NETのツリー表示上で対象となる名前を右クリックして[Close]を選び、いったんReflector for .NETを終了してから、再度目的のアセンブリを開く必要があった。

 さて、結果は以下のとおりである。

難読化したメソッドをC#で逆コンパイルしたところ
 
難読化したメソッドをVB.NETで逆コンパイルしたところ

 見てのとおり、アセンブリ内の名前がすべて入れ替わっている。ファイル名であるcorporatesecurity.dllはそのままだが、その配下の名前空間、クラス名、メソッド名などはすべて無意味な名前に置き換えられている。もし、このアセンブリの中に多数のクラスやメソッドが含まれているなら、膨大な無意味な名前の羅列が表示されることになる。その結果、その中から顧客IDをチェックするメソッドを判別することは極めて面倒な作業になる。また、引数の名前idも無意味な名前「A_0」に置き換えられている。もし、名前がidなら、もしかしたらこの引数が顧客IDを扱うかもしれないと推理することはできるが、「A_0」では予測不可能である。

 なお、汎用のクラス・ライブラリなどでは、外部から利用する名前が変わってしまうと問題を引き起こす場合があるが、これは特定の名前を難読化から除外する機能によって回避できる。

 このように、難読化を行うとプログラムの動作を維持したまま、極めてその内容を読みにくくすることができる。Visual Studio .NET 2003のユーザーならすぐに利用することができる機能でもある。企業機密を含むアセンブリを不特定多数者に配布する場合は活用するとよいだろう。


 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 記事ランキング

本日 月間