web-dev-qa-db-ja.com

コードが盗まれるのを防ぐにはどうすればよいですか?

.NET exeを起動するとどうなりますか? C#がILコードにコンパイルされていることは知っていますが、生成されたexeファイルは、ランタイムを開始してILコードを渡すランチャーにすぎないと思います。しかし、どのように?そして、それはどのくらい複雑なプロセスですか?

ILコードはexeファイルに埋め込まれています。通常のexeファイルはそうではありませんが、ディスクに書き込むことなくメモリから実行できると思います(はい、非常に複雑です)。

私の最終的な目的は、ILコードを抽出し、独自の暗号化ランチャーを作成して、スクリプトキディがReflectorでコードを開き、すべてのクラスを簡単に盗むのを防ぐことです。リバースエンジニアリングを完全に防ぐことはできません。彼らがメモリを検査し、純粋なILをランタイムに渡す瞬間を捉えることができれば、それが.netexeであるかどうかは関係ありませんね。難読化ツールがいくつかあることは知っていますが、ILコード自体を台無しにしたくありません。

編集:だから私が欲しかったものを試す価値はないようです。彼らはとにかくそれをクラックするでしょう...それで私は難読化ツールを探します。そして、はい、私の友人も、すべての記号の名前を無意味な名前に変更するだけで十分だと言いました。そして、リバースエンジニアリングは結局それほど簡単ではありません。

27
Calmarius

アセンブリの暗号化を絶対に主張する場合、おそらくそれを行う最良の方法は、プログラムコードをクラスライブラリアセンブリに入れて暗号化することです。次に、アセンブリをメモリに復号化して実行する小さなスタブ実行可能ファイルを作成します。

これは、次の2つの理由から非常に悪い考えです。

  1. スタブに暗号化キーを含める必要があります。 1337ハッカーが反映されたアセンブリを有意義に使用できる場合、ハッカーは暗号化キーを簡単に盗んで自分で復号化できます。 (これは基本的に アナログホール
  2. 誰もあなたの1337コードを気にしません。申し訳ありませんが、それは厳しい愛です。誰かのコードが作者ほど面白いと思う人は他にいません。
36
Kennet Belenky

あなたが何千人もの人々と共有する「秘密」は秘密ではありません。攻撃者は、「暗号化」スキームが1回だけ存在するため、簡単に破ることができます。

コードの価値が非常に高く、秘密にしておく必要がある場合は、秘密にしてください。コードは自分のサーバーにのみ残してください。ソフトウェアをWebサービスとして作成します。次に、サーバーを保護します。

26
Eric Lippert

生成されたexeファイルは、ランタイムを開始してILコードを渡すランチャーにすぎません。

ではない正確に。プログラムを設定する方法はいくつかありますが、通常、ILコードは、ランタイムとのプロセスで実行されるネイティブマシンコードにコンパイルされます。

子供たちに関しては、あなたが子供たちや彼らが再配布したものを使用する人に売ることができると思うなら、あなたは自分自身を惑わしています。彼らがあなたのアプリのロックを解除できない場合、彼らは先に進み、彼らができるか、またはなしでできるものを見つけます。それらは潜在的な売上高で正確に0ドルを表します。あなたの投資の見返りがないので、彼らを阻止しようとしてあまりにも多くの努力を費やすことはほとんど意味がありません。基本的な難読化ツールで十分かもしれませんが、それ以上のことはしないでください。

現実的には、ほとんどの開発者は、著作権侵害よりも曖昧さからはるかに大きな課題に直面しています。あなたがあなたの製品についての言葉を広めることを妨げるあなたがすることは、海賊よりもあなたを傷つけます。これには、人々にそれを得るためにお金を払わせることが含まれます。ほとんどの場合、より良いアプローチは、子供たちがロックを解除する必要さえない無料バージョンのアプリを用意することです。アプリをクラックすることは、時間や機能が制限された試用期間だけでなく、時間の無駄になるほど十分に機能しているものです。彼らとできるだけ多くの他の人々にそれを広範囲に広げさせてください。

今、私はあなたが最終的にいくつかの有料の顧客を必要とすることを知っています。重要なのは、無料の製品から得たすべての注意を使用して、より収益性の高い何かをアップセルまたは宣伝することです。ここでの1つのオプションは、主にビジネスオーディエンスを対象とした追加機能を備えたプレミアムバージョンも用意することです。ネットワーク全体への展開とその方法での管理を容易にするなどのことです。企業はより深いポケットを持っており、ライセンス料を支払う可能性が高くなります。あなたの無料版はあなたの製品を宣伝し、あなたのビジネス顧客にそれを正当性を与えるのに役立ちます。

もちろん、他のモデルもありますが、何をするにしても、あいまいさがより大きな課題であり、ソフトウェアの海賊版が売上につながることは決してないことを覚えておく価値があります。最終的に(そしてもちろんこれはあなたの実行に依存します)、あなたはそれらと戦おうとするよりもそれらのポイントを利用するビジネスモデルでより多くのお金を稼ぐことができるでしょう。

20
Joel Coehoorn

「彼らは彼らが従うことができるすべてをコピーしたが、彼らは私の心をコピーすることができなかったので、私は彼らに汗をかき、1年半遅れて盗んだままにした。」 -R。キップリング

6
r. kipling

「... scriptkiddiesがReflectorでコードを開くのを防ぎ、すべてのクラスを簡単に盗むのを防ぎます。」

残念ながら、起動をどのようにわかりにくくするかに関係なく、現在実行中のアセンブリをユーザーが選択したファイルにダンプするのは、デバッガーでの半ダースのコマンドの問題です。したがって、Brianが提案したようにアプリケーションを起動できたとしても、実行後にそのアプリケーションのコンポーネントをReflectorに取り込むことは難しくありません(誰かが面白いと思ったら、WinDbgからサンプルを投稿できます)。

難読化ツールは、膨大な量の技術的経験から作成されており、デバッガーがプロセスに確実に接続したり、プロセスから情報を抽出したりすることを困難にするように設計されていることがよくあります。ブライアンが言ったように:なぜあなたがILを維持しようと決心しているのかわかりません。スクリプトキディからの意味のある保護が必要な場合は、それを考え直す必要があるかもしれません。

6
Dan Puzey

個人的には、難読化が進むべき道だと思います。これは単純で、特にすべてのコードがexe内にある場合に効果的です(「ILを台無しにする」ことに関する懸念が何であるかはわかりません)。

ただし、それがうまくいかないと思われる場合は、exeを暗号化して、ランチャー内のリソースとして埋め込むことができます。それを処理する最も簡単な方法は、exeリソースを復号化し、ファイルに書き込んで実行することです。 exeの実行が完了したら、ファイルを削除します。また、Emit関数を使用して実行できる場合もあります。これがどのように機能するかはわかりませんが、開始するための記事があります- Reflection Emitを使用して.NETアセンブリをキャッシュする

もちろん、復号化キーはおそらくexeにも埋め込まれている必要があるので、本当に決定した誰かがとにかくアセンブリを復号化できるようになります。これが、難読化がおそらく最良のアプローチである理由です。

3
Brian

この質問 から私の答えをコピーします(これは正確には重複していませんが、同じ答えで答えることができるため、CWです):

Windows EXEには、複数の「パーツ」が含まれています。 簡略化、. netコード(= MSIL)はEXEの一部にすぎず、EXE内にはある種の機能を果たす「実際の」ネイティブWindowsパーツもあります。次にMSILを実行する.netFrameworkのランチャー。

MonoはMSILを取得して実行し、ネイティブのWindowsLauncherのものを無視します。

繰り返しますが、これは簡略化された概要です。

編集:デップの詳細を理解するだけでは、詳細を十分に理解できないのではないかと心配しています(PEヘッダーとは大まかにわかっていますが、詳細はわかりません)が、これらのリンクが役に立ちました:

NETアセンブリ構造–パートII

。NET Foundations-.NETアセンブリ構造

付録:本当に深く知りたい場合は、 Advanced .net Debugging でコピーを入手してください。最初の章では、Windowsの前後に.netアセンブリがどのように読み込まれるかを正確に説明していますXP(XP以降、Windowsローダーは.netを認識しており、.netアプリケーションの起動方法を根本的に変更します)

2
Michael Stum