すがブロ

sugamasaoのhatenablogだよ

ソースコードの難読化と逆コンパイル

id:seiunsky:20060422:1145706371
でちょっと書いた難読化ツール(http://uwa.potetihouse.com/soft/nandoku.html)。
そして今回紹介するのは逆コンパイルするツール。
http://www.aisto.com/roeder/dotnet/
上記サイトのReflector for .NETというツールでガッツリいける。

ためしに以下のようなソースを作った。ボタンを押されたときに、同じウィンドウのテキストボックス内の文字列をメッセージボックスで表示する簡単なもの(+αとしてほかの文字列も表示できるようにした)。
ソースをまるっと載せるのは面倒なのでメソッドだけで。

private void button1_Click(object sender, EventArgs e)
{
    // 2バイト変数を使ってみる
    string 文字列 = "テスト";
    string 変数その2 = "テスト2";

    // 普通の変数
    string text = this.textBox1.Text;

    // 表示
    MessageBox.Show(文字列 + "\n" + 変数その2 + "\n" + text);
}

これをReflector for .NETで逆コンパイルしてみる。

private void button1_Click(object sender, EventArgs e)
{
      string text1 = "\u30c6\u30b9\u30c8";
      string text2 = "\u30c6\u30b9\u30c8\uff12";
      string text3 = this.textBox1.Text;
      MessageBox.Show(text1 + "\n" + text2 + "\n" + text3);
}

ここだけを見るとわからないだろうけど、名前空間などもきっちり再現されている。さすがに変数名は機械的に付けているようだけど、ソース自体を見る分にはなんとかなるレベルだと思う。……それと、こういうのを見ればどのように最適化されているかがわかるかもしれない。*1

では、今度は難読化したexeを逆コンパイルしてみよう。

private void 0(object 0, EventArgs 1)
{
      string text1 = "\u30c6\u30b9\u30c8";
      string text2 = "\u30c6\u30b9\u30c8\uff12";
      string text3 = this.2.Text;
      MessageBox.Show(text1 + "\n" + text2 + "\n" + text3);
}

こう見ると劇的な変化はないように見えるけど、よくよく見ると引数やメソッド名が無味乾燥な数字になっている。実は、逆コンパイルしたあとの名前空間やクラス名も同じように数字に置き換えられている。
ようするに、同じメソッドをすぐに見つけられたのは簡単なソースであったことと、自分で作ったものだったからで、知らないソースを解析するさいは地獄のような苦しみを味わうこと必須

結論:難読化してもロジックは(当たり前だが)読める。が、ちょっと覗いてみよう程度の覚悟の人を挫折させる効果は十分にある。……大規模なら気合入れてもかなり絶望的だ。
よほどすばらしいものでない限り、難読化されたものを読むくらいならプログラマーとしては自分で作るワイ!となりそうな予感。

*1:っていうか、最適化とか詳しい人はどうやってみてんだろうね