DOBON.NET DOBON.NETプログラミング掲示板過去ログ

逆アセンブラや逆コンパイルなどは可能なのでしょうか?

環境/言語:[XP3 VB2005]
分類:[.NET]

昔16bitの頃、逆コンパイラを試したことがあるのですが、大して出来て無くこんなもんだろうなと思っていたのですが、最近はかなり性能が良くなったと聞きます。

有料ソフトで、逆コンパイラ(Reflector for .NET)などあるのですが、本当に逆コンパイルなどは可能なのでしょうか?

自分のコードが、勝手に知らない第三者に見られるというのは、秘密を見られるようで非常に嫌なのですが・・・

どんなものなのでしょうか?
難読化ツールというものがあります。「.NET 難読化」で検索すると、幾つか見つかります。

.NET 難読化 - Google 検索
http://www.google.co.jp/search?q=.NET+%E9%9B%A3%E8%AA%AD%E5%8C%96
■No27622に返信(ザナドゥさんの記事)
> 自分のコードが、勝手に知らない第三者に見られるというのは、
> 秘密を見られるようで非常に嫌なのですが・・・
その「秘密にしたい」「見られたくない」ものは何を思い浮かべていますか?

ご存じかもしれませんが、逆コンパイルと言っても完全なソースコードではありません。
コンパイル対象にならないコメントがない、ローカル変数の名前は差し障りのないものが自動的に付与されるなど、元のソースコードとは違う形になります。
反面、アルゴリズムが読み取れる形までは逆コンパイルで到達すると思われます。

難読化はメソッドやプロパティの名前を"a"やら"b"やらと置き換え、そのアルゴリズムを読みづらくすることが目的です。
もちろん、”読みづらくする”だけであり、力(時間・施設など)をかければ、読破される可能性はあります。


難読化する、ネイティブコードで書くといった対策を打ったところで、読み手(解析)側が力をかければ、読破は可能です。
それらを踏まえて、どこまでのラインを守りたいかでどこまで対策するかを決めることになります。

簡単な解析から守れれば良いのであれば、難読化は一つのソリューションです。
■No27622に返信(ザナドゥさんの記事)
> 有料ソフトで、逆コンパイラ(Reflector for .NET)などあるのですが、
Reflector for .NET は無料ですよ。(Pro 版は有料ですが)
http://www.aisto.com/roeder/DotNet/
http://www.red-gate.com/products/reflector/


> 本当に逆コンパイルなどは可能なのでしょうか?
百聞は一見に如かず。無料の逆コンパイラや体験版などを使って、
どこまで可能なのか、ご自身の目で実際に確認してみては如何でしょう。
http://dobon.net/vb/dotnet/links/convertcs2vb.html#disassembler

なお Microsoft 標準では、MSIL Disassembler というツールがあります。
http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx


> 自分のコードが、勝手に知らない第三者に見られるというのは、
少なくとも、OS 側には読み込まれなければならないので、可視性をゼロにするわけには
いきません。難読化する事で身を守るか、読まれても困らないコードを書くか、
使用契約によって逆アセンブル等を禁じるといった対処療法になるかと思います。

> 秘密を見られるようで非常に嫌なのですが・・・
第三者による閲覧を防ぎたいなら、ASP.NET や XML Web サービスの利用を検討してみてください。
コードがサーバー内に配置されますので、第三者の閲覧を防ぐことができます。
みなさん、返信有り難うございます。

>その「秘密にしたい」「見られたくない」ものは何を思い浮かべていますか?

やはり、シェアウエアの暗証番号や、ロジックですね。
特に暗証番号はキツイです・・・



魔界の仮面弁士さんに教えて頂いた通り、Reflector for .NET、使ってみました。

驚きました・・・思った以上に筒抜けですね・・・・
シェアウエアの暗証番号は見つかるは、ロジックは丸分かりだは・・・
ここまで分かるのかと・・・


難読化ツール、検索してみました。
無料で、「NanDoKu」というのが見つかったので、早速試してみようと思います。


対策は、しないより、した方がいいですね。


■No27649に返信(ザナドゥさんの記事)
> 驚きました・・・思った以上に筒抜けですね・・・・
なので、パスワードの類は埋め込まないのが原則です。
(DB との固定的接続が必要な場合も、可能であれば Windows 認証等を利用する)

> ロジックは丸分かりだは・・・
シェアウェアのロジック自体が見えるなら、認証処理自体をスキップするように
作り直されてしまう可能性もありますね。そこまでする人は稀でしょうけれども。

> シェアウエアの暗証番号は見つかるは、
こういう場合は、暗証番号を直接、
  If TextBox1.Text = passcode Then
のように比較するのではなく、
  If GetHash(TextBox1.Text) = HashValue Then
のようにハッシュで比較した方が良いのですけれどね。
(ハッシュ値は不可逆なので、元の値を推測されずにすみます)

ハッシュの求め方は、下記の「暗号化」などに具体例があります。
http://dobon.net/vb/dotnet/index.html#string

あるいは、認証処理を Web サーバーなどで行うという手もあります。
まぁ、これも Fiddler や InetSpy などのツールで読み取ったり、
通信自体を偽装する事は、さほど難しくなかったりもするのですが。

その他、実行可能ファイルの動作を解析/変更するという意味では、
Spy++ や Managed Spy といったツールもありますね。
ロジックが見えるわけでは無いので、ソース変換とは毛色が違いますけれども。
http://msdn.microsoft.com/en-us/magazine/cc163617.aspx


> 難読化ツール、検索してみました。
エディションによるので、お使いのVB2005に付属しているかは分かりませんが、
Visual Studio 2005 なら、「Dotfuscator Community Edition 3.0」
Visual Studio 2008 なら、「Dotfuscator Community Edition 4.0」
が付属しているかと思います。2003 にも付いていたような。

ツールによっては、難読化しすぎると誤動作やパフォーマンス低下を
招くものもあるので、処置後は十二分にテストを行ってください。

> 対策は、しないより、した方がいいですね。
ですね。とはいえ、完全なるセキュリティが存在しない以上、
過ぎたる対策というのも無駄が多いので、要件に応じて、
どこまで対策をとるべきかを考えないといけませんね。
■No27649に返信(ザナドゥさんの記事)
> >その「秘密にしたい」「見られたくない」ものは何を思い浮かべていますか?
>
> やはり、シェアウエアの暗証番号や、ロジックですね。
> 特に暗証番号はキツイです・・・

どれだけ対策を打っても、不正をする人は不正をします。
解析した結果からシリアル番号がばらまかれるのも過去からよくある話だと思っています。
(.NET Framework が一般的になるより前から解析されてばらまかれることは割とありました)


簡単な難読化はした方が良いかもしれません。
私としては、あまり強固にする方に力をかけることは考えず、「買いたい」と思わせる機能作りに注力した方がお互いに幸せだと思います。
みなさん、いろいろと有り難うございます。
いろいろと試してみています。

困った現象が一つ。

Dotfuscator Community Edition 3.0で難読化した後、セットアッププロジェクトでセットアッププログラムを作成すると、難読化したはずのexeファイルが難読化する前の状態のファイルに戻ってしまっています。

exeフアイルのままユーザーに渡す分には難読化されているので問題ないのですが、セットアッププロジェクト後に渡すと難読化が自動で解かれています。

これは何か方法があるのでしょうか?

私の言いたいこと、分かって頂けますでしょうか?
■No27680に返信(ザナドゥさんの記事)
> 難読化したはずのexeファイルが難読化する前の状態のファイルに戻ってしまっています。
> 私の言いたいこと、分かって頂けますでしょうか?

インストーラ パッケージの作成時に、
再ビルドされてしまっているとか?
確かセットアッププロジェクトでは bin\Release\ じゃなくて、obj\Release にあるファイルを参照していたような記憶があります。
難読化の対象が bin\Release のファイルであるなら、難読化前の obj\Release がセットアップに含まれているのかもしれませんね。
上手くいかないですね〜。

bin\Releaseだけ難読化する・・・前の難読化する状態に戻ってしまう

obj\Releaseだけ難読化する・・・プログラムを起ち上げると「問題が発生・・・」デバックしてみると、○○が見つかりません・・・難読化したので名前が数字などに置き換えられた為??

bin\Releaseとobj\Releaseを両方を難読化する・・・上と同じ症状



ちなみに、bin\Releaseとobj\Releaseにある実行ファイルは同じ物と考えて良いのでしょうか?サイズは同じでした。

両方とも難読化してしまい、バックアップコピーをbin\Releaseだけしか取っていなかったので、少し焦ってます。

コピーした実行ファイルを、bin\Releaseとobj\Releaseにコピーしたら問題なく動いてくれていますが・・・




再ビルドさせない設定とかあるのでしょうか?
難読化とセットアッププロジェクトのスマートのやり方について、申し訳ありませんが、私は存じません。

もしかしたら、「プロジェクト出力」というやり方で登録せず、ファイルとして登録するという荒技もあるかもしれません。
ただ、それによる弊害があるかは確認できていません。

過去のやりとり一例
http://bbs.wankuma.com/index.cgi?mode=al2&namber=11360&KLOG=25


なお、マニフェストの事例は毎回同じものを埋め込むだけなので、両方同時に実行しても問題ありませんでした。
しかし、難読化は実行の度に結果が変動すると予想されるため、両方同時に実行しても解決にならないと思われます。
■No27708に返信(Azuleanさんの記事)
> 難読化とセットアッププロジェクトのスマートのやり方について、申し訳ありませんが、私は存じません。
同じく。

試していませんが、ビルド後イベントに組み込むことはできないでしょうか。
http://www.atmarkit.co.jp/fdotnet/dotnettips/352buildevent1/buildevent1.html
返信有り難うございます。

> 試していませんが、ビルド後イベントに組み込むことはできないでしょうか。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/352buildevent1/buildevent1.html

出来ましたら報告させて頂きます。

有り難うございます。
今更ですが、MSIL Disassemblerで難読化した後、プログラムを実行すると、○○(例:変数など)がありませんといって、エラーが出ないですか?


私の設定がいけないのでしょうか?
■No27783に返信(ザナドゥさんの記事)
> 今更ですが、MSIL Disassemblerで難読化した後、
……あれ?
MSIL Disassembler はオブファスケータではなくディスアセンブラだったような。
すいません書き間違えました。

MSIL Disassembler→Dotfuscator

でした。
2010/12/07(Tue) 22:51:22 編集(投稿者)

■No27783に返信(ザナドゥさんの記事)
> 今更ですが、MSIL Disassemblerで難読化した後、プログラムを実行すると、
> ○○(例:変数など)がありませんといって、エラーが出ないですか?

MissingMethodException とかそういった例外が出ると言うことですか?(事実は正確に)
だとすれば、難読化のやり方を間違えているとしか言えません。

一通りできあがった EXE, DLL 群をまとめて一度に難読化しないと、名前が変わるなどで一致しなくなり、実行時に例外が出ます。

構成や今のやり方がわからないので具体的な解決方法はコメントしかねます。
難読化のやり方をもう一度調べ直してください。
(もしくは、今の手間暇をかける労力に見合うアルゴリズム・実装なのか考え直して、見合わないと思うのであれば諦めるというのも手です)
Azuleanさん、魔界の仮面弁士さん、有り難うございました。


いろいろエラーを見ながら試行錯誤した結果、難読化したくない項目として、My・Settingにチェックをつけて、ビルドしましたら、エラーが出なくなりました。


ただ、インストーラーをセットアップすると、元に戻ってしまうと言う問題は残ったままですが・・・

有り難うございました。

DOBON.NET | プログラミング道 | プログラミング掲示板