27

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

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

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

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

4

7 に答える 7

37

アセンブリを絶対に暗号化する必要がある場合は、プログラム コードをクラス ライブラリ アセンブリに配置して暗号化するのがおそらく最善の方法です。次に、アセンブリをメモリに復号化して実行する小さなスタブ実行可能ファイルを記述します。

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

  1. スタブに暗号化キーを含める必要があります。1337 ハッカーがリフレクトされたアセンブリを有意義に使用できる場合、暗号化キーを簡単に盗んで自分で解読することができます。(これは基本的にアナログホールです)
  2. 誰もあなたの 1337 コードを気にしません。申し訳ありませんが、それは厳しい愛です。誰かのコードが作者ほど面白いと思う人は他にいません。
于 2010-02-26T00:05:44.780 に答える
27

何千人もの人々と共有する「秘密」は秘密ではありません。覚えておいてください、あなたの攻撃者は、鍵が正しいので簡単に破ることができる「暗号化」スキームを 1 回だけ破ればよいのです。

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

于 2010-02-26T05:19:56.007 に答える
20

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

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

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

現実的には、ほとんどの開発者は著作権侵害よりも知名度からはるかに大きな課題に直面しています。あなたの製品について情報を広めることを妨げる行為は、海賊版よりもあなたを傷つけます。これには、人々にお金を払ってもらうことも含まれます。ほとんどの場合、子供がロックを解除する必要さえない無料バージョンのアプリを用意することをお勧めします。アプリをクラッキングすることは、時間や機能が制限された試用ではなく、時間の無駄になるだけです。彼らとできるだけ多くの人にそれを広めてもらいましょう。

最終的には有料の顧客が必要になることがわかりました。重要なのは、無料の製品から得たすべての注目を、より収益性の高い別のものをアップセルまたは宣伝するために使用することです. ここでのオプションの 1 つは、主にビジネス ユーザーを対象とした追加機能を備えたプレミアム バージョンを用意することです。ネットワーク全体への導入や管理を容易にすることなどです。企業は懐が深く、ライセンス料を支払う可能性が高くなります。無料版は、製品を宣伝し、ビジネス顧客に正当性を与えるのに役立ちます.

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

于 2010-02-26T00:01:30.373 に答える
6

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

于 2010-04-19T23:49:37.937 に答える
6

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

Unfortunately, regardless of how you obscure launching, it's a matter of half a dozen commands in a debugger to dump a currently-running assembly to a file of the user's choice. So, even if you can launch your application as Brian suggested, it's not hard to get that application's components into Reflector once it's running (I can post a sample from WinDbg if someone would find it interesting).

Obfuscation tools are created from huge amounts of technical experience, and are often designed to make it difficult for debuggers to reliably attach to a process, or to extract information from it. As Brian said: I'm not sure why you're determined to preserve the IL and, if you want any meaningful protection from script kiddies, that's something you may have to change your mind on.

于 2010-02-25T23:47:03.947 に答える
3

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

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

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

于 2010-02-25T23:21:27.227 に答える
2

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

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

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

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

編集: depp の深い詳細についての私の理解は、本当に多くの詳細には十分ではないのではないかと心配しています (私は PE ヘッダーが何であるかを大まかに知っていますが、実際には詳細ではありません)、これらのリンクが役立つことがわかりました:

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

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

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

于 2010-02-26T07:07:07.117 に答える