.NET Tools .NET逆コンパイラと
|
|
|
製品版Dotfuscatorによる文字列の暗号化
これでひと安心と思うのはまだ早い。というのは、リテラル文字列から機能を推測するという解析手法に対して無防備のままだからである。前出の例なら「"は誤ったIDです。"」という文字列を手掛かりに、顧客IDのチェック・メソッドを突き止められる可能性がある。
このサンプル・コードでは、顧客IDが誤っていた場合には例外を投げるが、その際、引数に“XXXXは誤ったIDです。”という文字列を渡す。そこから逆にたどれば、その例外を投げる条件判断がIDをチェックする機能である可能性が高いと推測できる。
このような問題に対処するためには、Dotfuscator Community Editionの上位バージョンである「Dotfuscator Professional Edition」を使うことができる。これは、Visual Studio .NET 2003に付属するものではないので、別途製品を購入する必要がある。Professional Editionには、Community Editionにはない以下の機能がある。
- 文字のリネーム(Community Editionでは小文字のみ対応)
- リネーム・プレフィックス機能
- IL Disassemblerの打破
- 圧縮/不要コード除去
- .NET Compact Framework に対する包括的なサポート
- 制御フローの難読化
- 拡張オーバーロード誘導
- 増分難読化(インクリメンタルな難読化)
- サテライトDLLに対するシームレスな難読化
- 文字列の暗号化
- マネージC++アセンブリのサポート
個々の機能の詳細については、日本語版の販売元であるAG-TECHのサイトを参照していただくとして、ここで注目すべき機能は「文字列の暗号化」である。
Professional Editionの使い方は、Community Editionとほぼ同じである。しかし、Community Editionでは指定できなかった機能を、Professional Editionでは指定できる。文字列の暗号化を指定するには、[文字列の暗号化]タブをクリックして、暗号化したいメソッドにチェックを入れる。
「Dotfuscator Professional Edition」の実行画面 |
[文字列の暗号化]タブではメソッド内の文字列を暗号化することができる。 |
ここで注意すべき点は、名前の変更などの機能は、その機能を指定すれば自動的にすべての範囲が対象になるが、文字列の暗号化は指定したメソッド内だけに適用されるという点である。文字列の暗号化は時間のかかる処理であり、必要な場合に限って使うべき、ということでこのような仕様になっているようである。うっかりそれを見過ごすと、文字列の暗号化が行われていなかったという場合もあり得るので注意しよう。
さて、顧客IDをチェックするCheckメソッドにチェックを入れてからビルドを行うと、文字列が暗号化されたモジュールが出来上がる。実際にファイルをダンプすると、Community Editionではそのまま保存されている文字列が、Professional Editionでは暗号化されて読めないことが分かる。
Dotfuscator Community Editionで難読化したアセンブリ |
「は誤ったIDです。」という文字列が読める。 |
製品版であるDotfuscator Professional Editionで難読化したアセンブリ |
文字列は暗号化されて読み出すことができなくなっている。 |
またReflector for .NETでこのメソッドを逆コンパイルしようとすると例外が発生して読むことができない。
暗号化したメソッドをReflector for .NETで逆コンパイルしたところ |
製品版Dotfuscator Professional Editionで難読化したメソッドを逆コンパイルしようとすると、例外が発生してしまって使えない。 |
このように、難読化ツールを用いることで、リバース・エンジニアリングのさまざまな試みに対して、高度な妨害を行うことができる。完全なリバース・エンジニアリングの防止とはいえないが、ネイティブ・コードに比べ.NET Frameworkのリバース・エンジニアリングが容易だという特徴を解消する意味では十分だろう。
終わりに
アセンブリの中を見るためのツール。見られないためのツール。2つを並べて紹介してみた。矛盾の語源となった「最強の盾と矛のどちらが強いか」という視点でどちらが勝つか興味があるという人もいると思うが、結果は見てのとおり、盾の方が強かったということになる。もちろん、その盾も無敵ではなく、膨大な手間暇を注ぎ込めば解析できてしまう可能性を含んでいる。しかし、ちょっとしたイタズラ心でのぞいてみよう、という程度の小さな試みを排除するには十分すぎるだけの強度があるといえる。現実問題として、これだけの強度があれば大半の試みは排除できるだろう。しかし、1アセンブリに1メソッドだけあるような状態をつくると、いくら名前を変えたところで容易にメソッドの役割を推測されてしまう危険もある。使い方は間違えないようにしよう。
もう1つ、.NET Frameworkというものをよりよく理解するために、これらのツールを試すことも有効だと感じた。.NET Framework上で動作するプログラムを作成していても、その構造がどうなっているのか考えないで終わることも多い。しかし、こうやって逆コンパイルや難読化ツールを使ってみると、どこにどんな情報が格納され、どこにどんな弱点があるかが見えてくる。それらを通じて、より深く.NET Frameworkについて知ることも悪くないだろう。
INDEX | ||
[.NET Tools] | ||
.NET逆コンパイラとコードを難読化するDotfuscator | ||
1.クラス・ライブラリが何をしているか知りたいとき | ||
2.Reflector for .NETで逆コンパイルする | ||
3.コードの難読化を行うDotfuscator | ||
4.製品版Dotfuscatorによる文字列の暗号化 | ||
「.NET Tools」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|