解決済みの質問

逆コンパイル

C#で書いた単純なプログラムをコンパイルして、それをテキストエディタで開いたところ、なんだかソースコードのような文字列がかなりそのまま実行バイナリの中に含まれています。
これって簡単に逆コンパイルとかされないでしょうか。

プログラムのバイナリを圧縮や暗号化して、実行時にそれを展開するような方法があると聞いたのですが、それはC#でもできますか?
別のプログラムは圧縮ファイルを解凍するような方法じゃなくて、1つのプログラム内でそういうことできませんか?

投稿日時 - 2003-06-23 14:25:37

QNo.582767

困ってます

質問者が選んだベストアンサー

#7です。書き方が悪かったですね、すみません。

 参考URLにあげた、「dotfuscator」というツールの、Community Editionだそうです。これの製品説明より、引用。。。。
Dotfuscator Community Edition 1.2 は学生および個人利用者向けの評価用フリーバージョンです。 この製品では PreEmptive Solutions 社が特許を保有するオーバーロード誘導リネームシステムをご利用いただけますが、 逆コンパイラ対策テクノロジーおよびサイズ縮小機能はご利用いただけません。
。。。。。
って、ちょっと待て。表示に偽りアリだぞ>MS
英語版だと約1万8千円、日本語版だと2万9千円。


 VS.NET2003は、マイクロソフトは「ライセンスを無料で配布する」といっていましたが、ボリュームライセンスならディスクキットを有料で買う必要があるでしょう。私のいる会社では、アップデート用のディスクキットを購入したようです。

参考URL:http://www.agtech.co.jp/products/PreEmptive/

投稿日時 - 2003-07-16 08:43:24

お礼

なんどもありがとうございます。

これは目的にぴったりのものですね。

しかしアップデートのキットはどうやら6/30日申し込み締め切りのようです。
学校で買ってもらうか・・・それとも自分で買うか・・・。
急ぐものではないので、そのうち何とかしてみようと思います。

ありがとうございました。

投稿日時 - 2003-07-18 09:33:14

ANo.8

4人が「このQ&Aが役に立った」と投票しています

[  前へ  |  ]

ベストアンサー以外の回答(7件中 1~5件目)

ANo.7

#5,6です。しつこくてすみません。

 C#ですが、バージョンは2002ですか?マイクロソフトにユーザ登録しましたか?

 ユーザ登録していれば2003が送られていると思いますが、インストールしましたか?インストールオプションに「リバースエンジニアリングを禁止するツール」がありました。私の所はエンタープライズアーキテクト、最上位バージョンなので、なかったらごめんなさい。

投稿日時 - 2003-07-14 15:14:18

お礼

回答ありがとうございます。
学校で配布されてるアカデミックのボリュームライセンス版なのですが、そういうのはあるのでしょうか。

また、"禁止するだけで、すると法に触れる" 程度のもだと、プロトコルや暗号が解析されて意味がないのですが、"全く、あるいはほとんどできない" ようにするものなのでしょうか。

投稿日時 - 2003-07-15 15:03:24

ANo.6

 #5です。すみません、間違えてました。「完全名」ではなく「厳密名」でした。

 AssemblyInfo.[vb,cs]に、アプリケーション情報、確定したバージョンを記入し、「厳密名ツール(sn.exe)」で厳密名をつけます。

 詳しくはMSDNのトピック「厳密な名前付きアセンブリの作成と使用」を参照してください。参考URLにも記事がありますので、適宜参照してください。

参考URL:http://www.atmarkit.co.jp/fdotnet/technology/index/index.html

投稿日時 - 2003-07-09 08:18:46

お礼

ありがとうございます。

これが使えるかどうかいろいろと検討してみようと思います(改ざんされたものが実行できなくても、コード解析されて暗号化されたプロトコルがわかってしまうと、あまり意味がないかも)。

投稿日時 - 2003-07-11 09:48:47

ANo.5

>Winnyって知ってます?
 まぁ、名前くらいは。通信系はそんなにこなしていないので素人考えかもしれませんが、プログラムをクラックしなくても、データをフェッチすればプロトコルを解析することはできるのではないでしょうか。匿名とはいえ、最終的な相手のIPアドレスと自分のIPアドレスは必要なのですから、わかっているもの同士で同じメッセージを投げ合えば、アドレスが記入されている部分がわかる・・・というのは安易ですかねぇ?相手のIPアドレスまで暗号化する??

 プログラムの改変を禁じるということでは、.NET Frameworkでは、ストロングネームを使うという手があります。ただ、認証機関によって発行された証明書がいるようないらないような。この辺は.NETのヘルプをみてください。「ストロングネーム」か、「完全名」か、手元にないのであやふやです。.NETを使わない頃は、全体のCRCを求めて、その値をプログラム中に埋め込む、なんてことをやったかな??

投稿日時 - 2003-07-04 21:50:48

お礼

回答ありがとうございます。
Winnyでは通信内容がすべて暗号化されているので、プログラムをクラックしないかぎり通信の内容がわからないようです。

>わかっているもの同士で同じメッセージを投げ合えば、アドレスが記入されている部分がわかる・
だから、かならず第三者を経由し、絶対にチャットの相手と直接つながないことにします(この辺もWinnyのパクリ)。

ストロングネームというのはSystem.Security.Policy.StrongNameですね。
お勉強してみます。

全体のCRCを使う方法って、CRCを埋め込んだ時点でCRCが変わってしまうような気がするんですが、どうなっているんでしょう。

投稿日時 - 2003-07-08 15:05:36

ANo.4

 まず、クラックというか、「解析されないアセンブリは作れない」と思ってください。最悪、C#のソースまで戻せなくても、機械語にすれば、やっていることはわかるのですから(労力度外視)。

 で、ご心配されている「クラックされる」危険性はどれくらいあるのでしょうか。また、クラックされることで発生するリスクはどのようなものがあるのでしょうか。
 例えば、特定顧客向けのシステムであれば、契約書などに「逆アセンブルなどによって元のコードを改変した場合は保証の対象外とする」と一文加えておけばクリアされます。
 例えば、不特定多数に配布する、いわゆる市販プログラムであっても、使用許諾書に一文加えればすみます。
 例えば、使用しているアルゴリズムを保護したいのであれば、特許や著作権などの法律的な保護をつけることができます。
 つまり、改変したものについては「それは保証の対象外だ」と堂々と言え、真似たものについては法的に差し止めや金銭の要求ができるのです。
 こういった、プログラム外のところで保護する方法は検討されているのでしょうか。プログラムをいじるより、プログラム外で保護する方が低コストですむと思うのですが??

 通信のプロトコルということですが、「文字列」であれば、逆アセンブルしなくてもバイナリエディタで見るだけで読めます。特に.NETの場合、付属しているILDASMという逆アセンブルツール(と紹介しているサイトがあるが、中間コードを表示するツール)で見ることができます。文字列を保護したいということであれば、プログラム外で暗号化し、プログラム中で復号する方法があります。復号に使うキーをどこにどうやって埋めるか、どうやって実行速度を確保するかは、一つの問題です。

 それとも、まさか自衛隊や警察用のシステムでしょうか??もしそうなら、こんなところで聞くこと自体が間違っていますよ!?よっぽどうまく質問しないと、時系列を追えばどんなシステムを作っているか想像できてしまいますよ?

 そういうアブナいシステムでないとすると、そこまでクラックされることにこだわる理由がわからないのですが??

投稿日時 - 2003-07-01 16:42:09

お礼

回答ありがとうございます。

>「クラックされる」危険性はどれくらいあるのでしょうか
Winnyって知ってます? あれと同じ第三者経由P2Pの原理で、匿名メッセンジャ&プレゼンスサービスを作りたいと思っています。
ファイル共有ソフトではありません(笑)。
Winnyがクラックされないようにかなり努力していたようなので、それ相当のものなのだと思います。

>クラックされることで発生するリスク
プロトコルや内部でのみ使用するIDなどが解析されますと、匿名性が崩れてしまいます。

>プログラムをいじるより、プログラム外で保護する方が
一応フリーソフトで考えてるので、そういうことはあまり考えていないのです。

>通信のプロトコルということですが、「文字列」であれば、逆アセンブルしなくてもバイナリエディタで見るだけで読めます
だから通信は全部暗号化するので、逆アセンブルされないかぎりは解読されることはないのですが・・・。

改変されないというのはどうも無理みたいなので、改変されたら起動しないとか、なにか良い方法はありませんかね・・・。

投稿日時 - 2003-07-04 09:26:27

ANo.3

 C#のソースファイルは簡単にディスアセンブルできます。ツールもどこかに落ちている、という情報を見たことがあります(曖昧な言い方)。

 見られたくない「文字列」は、外部に暗号化してしまっておくという手はあります。ただ、暗号/復号キーをどこにどうやって埋めるかが問題ですが。

 昔、DOSの時代に実行ファイルを圧縮するというのがありました。なんだったっけ?ファイル読み込み時に割り込んで圧縮したものかどうかを調べ、圧縮したものなら解凍したイメージを代わりに流す、そんなイメージだったと思います。DOSの時代だからできたとこだと思います。
#WTERMが自己解凍しながら実行していたような?

 実行ファイルが実行される仕組みはご存じでしょうか。ウイルスのように、実行手順を途中でハックするか、自己解凍ファイルのように自分自身を解凍するコードを付加すればいいのですが、前者は.NETではほとんど不可能と思われます。.NETは「ウイルスに取り付かれない/取り付かれても実行されない」のがウリですから。後者も、一時ファイルを作らずに、ということになればほとんど不可能でしょう。

 結局、どんなことしても、クラックしてやろうという人はクラックしますから、何もしないのが低コストです。

投稿日時 - 2003-07-01 12:21:53

お礼

回答ありがとうございます。
やはり・・・C#じゃこういうプログラムは作れないんでしょうか・・・。
メモリ上に展開したオブジェクトを呼び出せればと思ったんですが・・・。

クラックされるとプログラムがまったく成り立たなくなってしまうから困っているんです・・。

それでは視点を変えてクラックされて改変されても、大丈夫のような機構ってどんなのがあるでしょう。

投稿日時 - 2003-07-01 15:14:03

あわせてチェックしたい
  • 展開 ...
  • プログラミング<暗号入力プログラム>について ...
  • 圧縮ファイルの展開 ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら