RedGate の Reflector を使用すると、アプリケーションの完全なソースを簡単に取得できます。しかし、アルゴリズムが発見される可能性を減らすために、この可能性を減らすための難読化ツールがあります。
私の質問は次のとおりです。
- 難読化ツールはどのくらい効果的ですか?
- アルゴリズムを隠すという点でより安全なのは、.NET ライブラリまたは難読化された .NET プログラムを使用しない C++ です。
- .NET ソース コードをさらに安全にする他の方法はありますか?
RedGate の Reflector を使用すると、アプリケーションの完全なソースを簡単に取得できます。しかし、アルゴリズムが発見される可能性を減らすために、この可能性を減らすための難読化ツールがあります。
私の質問は次のとおりです。
何かを確実に保護したい場合は、C ++を選択してください。.NETWorldには、市場に出回っているほとんどの難読化ツールが生成するものを難読化解除するde4dotという名前の強力な難読化ツールがあります( https://github.com/0xd4d/de4dotを参照)。 、明示的に知らないものをイベントします。
ただし、c ++の世界でも強力なツールがあるため、これは基準を引き上げるだけです(IDA:http ://www.hex-rays.com/products/ida/index.shtml )。
混合コードアセンブリのように、ネイティブコードで非表示にしたい部分を、残りを管理対象にすることができるソリューションは他にもあります。詳細については、こちらを参照してください:混合(ネイティブおよびマネージド)アセンブリ
.NET は自己記述的になるように設計されているため、難読化ツールを使用しても進行が妨げられるだけです。逆コンパイラは可読性を低下させますが、MSIL を理解している人なら誰でもチャンスがあります。プログラムは最終的にメモリ内で段階的に実行されるため、C++ アプリケーションでさえ、ある段階で逆コンパイル可能になります。C++ アプリケーションでは解決に時間がかかりますが、ハッカーがアセンブラーを知っている場合 (アルゴリズムにアクセスするためにアプリケーションを逆コンパイルする場合はおそらくそうするでしょう)、それは時間の問題です。
難読化とは、実際には、それを不可能にするのではなく、合理的な期間内に可能な限り困難にすることです。同じ原則が暗号化にあります。暗号化を解読することは不可能ではありません。解読に時間がかかりすぎて、コンテキストが 70 ~ 80 年で役に立たなくなる可能性があります。
ここで説明したものとは別に、私が考えることができる 2 つの代替手段があります。
ネットワーク接続が利用可能な場合は、最初のオプションが適しています。処理は別のサーバーで行われ、アルゴリズムは公開されません。これが、現在のアクティベーション コードの仕組みです。ある種のシリアル コードが生成され、公開鍵暗号で暗号化されて、データの復号化と検証を行うソースに送信されます。応答も暗号化されて返されます。
また、ハッカーはコンポーネントを簡単にプラグインできないため、アプリケーションと依存関係にデジタル署名することも役立ちます。古いものの 1 つの代わりに DLL を使用しようとした場合 (サービスへの呼び出しを偽装して「成功」を返すため)、コードは DLL を使用する前にデジタル署名をチェックします。
要約すると、難読化はプロセスを遅くしますが、それを防ぐことはできません。私が考えることができる唯一の方法は、そのアルゴリズムを安全な場所でホストし、リクエストを送信することです。はい、ホスティング シナリオ、DoS などの問題がありますが、アルゴリズムは保護されています。
「ソース コードを取得する上で安全なのは、.net ライブラリのない C++ プログラムまたは .net 難読化プログラムです。」.net オフ...
難読化された .net .java は、依然として逆コンパイルが容易です。プロの難読化ツールがあり、コードを再コンパイルできなくし、ハッキング プロセスを少し遅くします。
開くことができるものを閉じることができるかどうか聞いたことがありますか? アセンブリと書かれていても...
通常、初心者のプログラマーはこの種の盗難を恐れています。最初にソフトウェア部分を作成することをお勧めします。これは他の人にとって盗む価値があります (あなたのためではありません)。
難読化ツールはどのくらい効果的ですか?
ConfuserExの名前、定数、および制御フロー保護が非常に効果的で、.NET コードを読みにくくしていると思います。
Name protection
、クラス/メソッド/etc の名前を判読不能な Unicode にレンダリングできます。constants protection
ハッカーがコードの動作を推測するための優れたヒントを提供する、デバッグ ログ文字列のような定数文字列をエンコードします。control flow
コードを多くのスイッチ ケースにスクランブルします。ConfuserEx の C# コードの例については、以下を参照してください。
アルゴリズムを隠すという点でより安全なのは、.NET ライブラリまたは難読化された .NET プログラムを使用しない C++ です。
.NET アセンブリが難読化されていない場合は、ソース コードを配布するようなものです。
難読化された .NET とネイティブの x86/x64 コード (IMO) を比較すると、それらを読み取る難しさはほぼ同じです。ネイティブの x86 コードは、IDA-Pro などのソフトウェアを使用して、非常に読みやすい C コードに分解できます。また、x86 言語を非常に速く読んで理解できる人もいます。
.NET ソース コードをさらに安全にする他の方法はありますか?
C# コードをネイティブ x86/x64 コードにコンパイルするMicrosoft .NET Native (まだ初期段階ですが、制限があります) があります。これは実際には保護ではなく、x86 コードの読み取りが遅くなるだけです。
これをリンクしてみてください。ただし、文字列を難読化するだけです。関数呼び出し、変数、およびその他の要素を難読化するには、その目的のための商用製品やサービスを探します。