- ベストアンサー
逆コンパイル
C#で書いた単純なプログラムをコンパイルして、それをテキストエディタで開いたところ、なんだかソースコードのような文字列がかなりそのまま実行バイナリの中に含まれています。 これって簡単に逆コンパイルとかされないでしょうか。 プログラムのバイナリを圧縮や暗号化して、実行時にそれを展開するような方法があると聞いたのですが、それはC#でもできますか? 別のプログラムは圧縮ファイルを解凍するような方法じゃなくて、1つのプログラム内でそういうことできませんか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#7です。書き方が悪かったですね、すみません。 参考URLにあげた、「dotfuscator」というツールの、Community Editionだそうです。これの製品説明より、引用。。。。 Dotfuscator Community Edition 1.2 は学生および個人利用者向けの評価用フリーバージョンです。 この製品では PreEmptive Solutions 社が特許を保有するオーバーロード誘導リネームシステムをご利用いただけますが、 逆コンパイラ対策テクノロジーおよびサイズ縮小機能はご利用いただけません。 。。。。。 って、ちょっと待て。表示に偽りアリだぞ>MS 英語版だと約1万8千円、日本語版だと2万9千円。 VS.NET2003は、マイクロソフトは「ライセンスを無料で配布する」といっていましたが、ボリュームライセンスならディスクキットを有料で買う必要があるでしょう。私のいる会社では、アップデート用のディスクキットを購入したようです。
その他の回答 (7)
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
#5,6です。しつこくてすみません。 C#ですが、バージョンは2002ですか?マイクロソフトにユーザ登録しましたか? ユーザ登録していれば2003が送られていると思いますが、インストールしましたか?インストールオプションに「リバースエンジニアリングを禁止するツール」がありました。私の所はエンタープライズアーキテクト、最上位バージョンなので、なかったらごめんなさい。
お礼
回答ありがとうございます。 学校で配布されてるアカデミックのボリュームライセンス版なのですが、そういうのはあるのでしょうか。 また、"禁止するだけで、すると法に触れる" 程度のもだと、プロトコルや暗号が解析されて意味がないのですが、"全く、あるいはほとんどできない" ようにするものなのでしょうか。
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
#5です。すみません、間違えてました。「完全名」ではなく「厳密名」でした。 AssemblyInfo.[vb,cs]に、アプリケーション情報、確定したバージョンを記入し、「厳密名ツール(sn.exe)」で厳密名をつけます。 詳しくはMSDNのトピック「厳密な名前付きアセンブリの作成と使用」を参照してください。参考URLにも記事がありますので、適宜参照してください。
お礼
ありがとうございます。 これが使えるかどうかいろいろと検討してみようと思います(改ざんされたものが実行できなくても、コード解析されて暗号化されたプロトコルがわかってしまうと、あまり意味がないかも)。
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
>Winnyって知ってます? まぁ、名前くらいは。通信系はそんなにこなしていないので素人考えかもしれませんが、プログラムをクラックしなくても、データをフェッチすればプロトコルを解析することはできるのではないでしょうか。匿名とはいえ、最終的な相手のIPアドレスと自分のIPアドレスは必要なのですから、わかっているもの同士で同じメッセージを投げ合えば、アドレスが記入されている部分がわかる・・・というのは安易ですかねぇ?相手のIPアドレスまで暗号化する?? プログラムの改変を禁じるということでは、.NET Frameworkでは、ストロングネームを使うという手があります。ただ、認証機関によって発行された証明書がいるようないらないような。この辺は.NETのヘルプをみてください。「ストロングネーム」か、「完全名」か、手元にないのであやふやです。.NETを使わない頃は、全体のCRCを求めて、その値をプログラム中に埋め込む、なんてことをやったかな??
お礼
回答ありがとうございます。 Winnyでは通信内容がすべて暗号化されているので、プログラムをクラックしないかぎり通信の内容がわからないようです。 >わかっているもの同士で同じメッセージを投げ合えば、アドレスが記入されている部分がわかる・ だから、かならず第三者を経由し、絶対にチャットの相手と直接つながないことにします(この辺もWinnyのパクリ)。 ストロングネームというのはSystem.Security.Policy.StrongNameですね。 お勉強してみます。 全体のCRCを使う方法って、CRCを埋め込んだ時点でCRCが変わってしまうような気がするんですが、どうなっているんでしょう。
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
まず、クラックというか、「解析されないアセンブリは作れない」と思ってください。最悪、C#のソースまで戻せなくても、機械語にすれば、やっていることはわかるのですから(労力度外視)。 で、ご心配されている「クラックされる」危険性はどれくらいあるのでしょうか。また、クラックされることで発生するリスクはどのようなものがあるのでしょうか。 例えば、特定顧客向けのシステムであれば、契約書などに「逆アセンブルなどによって元のコードを改変した場合は保証の対象外とする」と一文加えておけばクリアされます。 例えば、不特定多数に配布する、いわゆる市販プログラムであっても、使用許諾書に一文加えればすみます。 例えば、使用しているアルゴリズムを保護したいのであれば、特許や著作権などの法律的な保護をつけることができます。 つまり、改変したものについては「それは保証の対象外だ」と堂々と言え、真似たものについては法的に差し止めや金銭の要求ができるのです。 こういった、プログラム外のところで保護する方法は検討されているのでしょうか。プログラムをいじるより、プログラム外で保護する方が低コストですむと思うのですが?? 通信のプロトコルということですが、「文字列」であれば、逆アセンブルしなくてもバイナリエディタで見るだけで読めます。特に.NETの場合、付属しているILDASMという逆アセンブルツール(と紹介しているサイトがあるが、中間コードを表示するツール)で見ることができます。文字列を保護したいということであれば、プログラム外で暗号化し、プログラム中で復号する方法があります。復号に使うキーをどこにどうやって埋めるか、どうやって実行速度を確保するかは、一つの問題です。 それとも、まさか自衛隊や警察用のシステムでしょうか??もしそうなら、こんなところで聞くこと自体が間違っていますよ!?よっぽどうまく質問しないと、時系列を追えばどんなシステムを作っているか想像できてしまいますよ? そういうアブナいシステムでないとすると、そこまでクラックされることにこだわる理由がわからないのですが??
お礼
回答ありがとうございます。 >「クラックされる」危険性はどれくらいあるのでしょうか Winnyって知ってます? あれと同じ第三者経由P2Pの原理で、匿名メッセンジャ&プレゼンスサービスを作りたいと思っています。 ファイル共有ソフトではありません(笑)。 Winnyがクラックされないようにかなり努力していたようなので、それ相当のものなのだと思います。 >クラックされることで発生するリスク プロトコルや内部でのみ使用するIDなどが解析されますと、匿名性が崩れてしまいます。 >プログラムをいじるより、プログラム外で保護する方が 一応フリーソフトで考えてるので、そういうことはあまり考えていないのです。 >通信のプロトコルということですが、「文字列」であれば、逆アセンブルしなくてもバイナリエディタで見るだけで読めます だから通信は全部暗号化するので、逆アセンブルされないかぎりは解読されることはないのですが・・・。 改変されないというのはどうも無理みたいなので、改変されたら起動しないとか、なにか良い方法はありませんかね・・・。
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
C#のソースファイルは簡単にディスアセンブルできます。ツールもどこかに落ちている、という情報を見たことがあります(曖昧な言い方)。 見られたくない「文字列」は、外部に暗号化してしまっておくという手はあります。ただ、暗号/復号キーをどこにどうやって埋めるかが問題ですが。 昔、DOSの時代に実行ファイルを圧縮するというのがありました。なんだったっけ?ファイル読み込み時に割り込んで圧縮したものかどうかを調べ、圧縮したものなら解凍したイメージを代わりに流す、そんなイメージだったと思います。DOSの時代だからできたとこだと思います。 #WTERMが自己解凍しながら実行していたような? 実行ファイルが実行される仕組みはご存じでしょうか。ウイルスのように、実行手順を途中でハックするか、自己解凍ファイルのように自分自身を解凍するコードを付加すればいいのですが、前者は.NETではほとんど不可能と思われます。.NETは「ウイルスに取り付かれない/取り付かれても実行されない」のがウリですから。後者も、一時ファイルを作らずに、ということになればほとんど不可能でしょう。 結局、どんなことしても、クラックしてやろうという人はクラックしますから、何もしないのが低コストです。
お礼
回答ありがとうございます。 やはり・・・C#じゃこういうプログラムは作れないんでしょうか・・・。 メモリ上に展開したオブジェクトを呼び出せればと思ったんですが・・・。 クラックされるとプログラムがまったく成り立たなくなってしまうから困っているんです・・。 それでは視点を変えてクラックされて改変されても、大丈夫のような機構ってどんなのがあるでしょう。
- toysmith
- ベストアンサー率37% (570/1525)
昔、68KMacintoshにMacNosyというデバッガがあったんですが、惜しいところまで逆コンパイル機能を実現していました。 多分、作者はPascal逆コンパイラを作りたかったんでしょう。 当時のMacはPascal文化でしたから。 で、.net環境における逆コンパイラですが技術的には可能と思われます。 .net実行環境は中間コード形式のインタプリタなので、実行ファイルであっても機械語コードではありません。 よって、 1.自作プログラムをコンパイルして作成した中間コード群 2.外部ファイル(DLLなど)参照 3..netランタイム参照 は明確に分離されているはずです。 完全に元のコードを生成することは難しいと思いますが、元コードと同じ動作をするC#コードに変換することは可能です。 ただし、一般的に商用ソフトウェアはリエンジニアリングが禁止されています。 逆コンパイラから見ればターゲットのソフトウェアが自作なのか?自作でない商用ソフトウェア(リエンジニアリングしてはいけない)なのか?を判断する事ができません。 結果、逆コンパイラは【デバッグツールとしてかなり高価なモノ】または【研究用として】以外は存在しません。 プログラムの圧縮/暗号化はプログラム言語や開発環境だけでは実現できません。 ローダー(プログラムを読み込んで実行させる機構で一般的にOSの一部)がプログラム実行ファイルを認識したときに「圧縮されているから展開してから実行する」とか「暗号化されているから復号してから実行する」という動作を行う必要があります。 OSのローダーに解凍(展開)や復号の機能がない場合、ローダーの機能を補完するようなシステムソフトウェアが必要となります。 たとえば、CrusoeCPUはx86CPUとは違う機械語コードですが、CrusoeCPUを使っているWindowsコンピュータはx86機械語コードをCrusoe機械語コードに変換するシステムソフトウェアを使ってx86用のソフトウェアを動作させています。
お礼
回答ありがとうございます。 えーっと、細かい話、Winnyってソフト知ってます? それが、クラックされにくいように、実行バイナリを圧縮して実行時に展開するとかいうのがどっかに書いてあったんですが、それってどういう意味なんでしょう。 解凍プログラムのようなものが、リソースに入ってるファイルを解凍して、どこか違う場所で実行するとかいうものではないようなんですが・・・。
- asuca
- ベストアンサー率47% (11786/24626)
コンパイルしただけだったら逆コンパイルされる可能性はあります。 しかしリンクして実行形式にすればそういったことはないと思うんですが。
お礼
回答ありがとうございます。 リンクして実行形式ってどういう意味ですか? 通信プログラムのプロトコル仕様とかを覗かれたくないんで、逆コンパイルできないまでも、内部の文字列なども見られたくないのですが。
お礼
なんどもありがとうございます。 これは目的にぴったりのものですね。 しかしアップデートのキットはどうやら6/30日申し込み締め切りのようです。 学校で買ってもらうか・・・それとも自分で買うか・・・。 急ぐものではないので、そのうち何とかしてみようと思います。 ありがとうございました。