.NETアプリケーションは.NET ReflectorやILSpyのような逆コンパイラを
使用すると、簡単にソースコードを見ることができてしまいます。
リバースエンジニアリングを防ぐためにソースコードを読みにくくすることを
難読化と言い、.NETの開発元のMicrosoftもここやここで
難読化が必要であると言っています。
しかし、Visual Studioに付属の難読化ツール
Dotfuscator Community Edition (CE)は無料で使えるものの
文字列の暗号化や制御フローの難読化に対応しておらず
機能的に十分とは言えません。
詳細はDotfuscatorのエディション比較ページへ。
そこでこの記事では、フリーでオープンソースの難読化ツール
ConfuserExを使ってプログラムを難読化する手順を紹介します。
テストプログラム
難読化テスト用に簡単なプログラムを作ってみました。
入力した10進数をインクリメントしながら16進数に変換するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 10進数を16進数に変換して返す関数 string decToHex(int dec) { string hex = Convert.ToString(dec, 16); return hex; } private void button1_Click(object sender, EventArgs e) { // TextBoxのテキストをint型に変換 int dec = int.Parse(textBox1.Text); string str = ""; // 10進数をインクリメントしながら16進数に変換するループ for(int i = 0; i < 10; i++) { string hex = decToHex(dec); // 結果の文字列を作成 str += "10進数 = " + dec.ToString() + " "; str += "16進数 = " + hex + "\n"; // 10進数をインクリメント dec++; } // 結果をラベルに出力 label1.Text = str; } } |
逆コンパイルしてみる
テストプログラムをILSpyで逆コンパイルしてみます。
関数名から変数名、日本語の文字列までしっかり見えていることが分かります。
丸見えどころか、冗長なコードが整理されて見やすくなってすらいます。
ConfuserExで難読化する
ダウンロード
ConfuserExのバイナリをGitHubからダウンロードします。
難読化する
ダウンロードしたファイルを解凍してConfuserExを起動します。
難読化するプログラムを設定します。
Drag input modules hereの部分にプログラムをドラッグ&ドロップします。
難読化の設定をします。
Settingsタブを開き、<Global settings>を選択して+ボタンを押します。
右側のペンのボタンを押すと
難読化ルールの編集画面が開きます。
PresetをNormalに設定し、Doneボタンを押します。
これで難読化の設定が完了しました。
難読化を実行します。
Protect!タブを開き、Protect!ボタンを押します。
Finishedが表示されたら難読化は完了です。
プログラムのあるフォルダにConfusedフォルダが作成され
難読化されたプログラムが出力されています。
難読化できているか確認する
難読化したプログラムをILSpyで逆コンパイルしてみます。
しっかり難読化されていることが分かります。
クラス名、関数名、変数名は跡形もなく、文字列も暗号化されています。
for文もどこかへ消し飛んでしまいました。
以上、ConfuserExで.NETアプリケーションを難読化する方法を紹介しました。