アプリケーションを解読しにくくしたい場合、従うべき良い規則は何ですか?
10 に答える
アプリケーション全体がクライアント側である限り、クラックから保護することは完全に不可能です。アプリケーションをクラッキングから保護する唯一の方法は、サーバーに接続して機能させることです (オンライン ゲームなど)。
それでも、サーバーをシミュレートし、ダミーの確認をプログラムに送信して、実際の正当なサーバーと通信していると見なすクラックを見てきました (この場合、「コールホーム」検証戦略について話しているのではなく、ゲーム)。
また、意志あるところに道があることを忘れないでください。誰かがあなたの製品をひどく欲しがっているなら、彼らはそれを手に入れるでしょう. そして最終的には、正直な顧客を混乱させる可能性があり、クラッカーにとっては脅威と見なされる保護を実装することになります。
また、このトピックに関する非常に詳細な議論については、このスレッドを参照してください。
多くの回答は、質問がそれを不可能にする方法ではなく、それを難しくする方法であるという点を見逃しているようです.
難読化は、そのプロセスの最初の重要なステップです。コードが難読化されていない場合、それ以上のことは簡単に解決できません。
その後は、回避しようとしているものに少し依存します。ライセンスなしでインストール?タイムトライアル爆破?追加料金を支払うことなく、ソフトウェアの使用を増やしますか (より多くの CPU を使用するなど)?
今日の仮想マシンの世界では、長期的なクラッキング防止戦略には、家に帰る必要があります。環境を元のままにするのは簡単すぎます。そうは言っても、使用するために元の状態に戻さなければならない場合、一部の種類のソフトウェアは役に立たなくなります。それがあなたのタイプのソフトウェアである場合、時限トライアルを追跡するためにレジストリに物を置くためのかなりあいまいな場所があります. そして、一般に、偽造が困難なライセンス キー スキーム。
ただし、気をつけなければならないことが 1 つあります。派手になりすぎないでください。多くの場合、ライセンス スキームは最小限の QA しか得られず、正当な顧客が締め出されるという深刻な問題に直面します。とにかくお金を払っていない人がコピーすることを恐れて、実際にお金を払っている顧客を追い払ってはいけません。
ここにいくつかのヒントがありますが、完璧ではありませんが、おそらく役立つ可能性があります。
- ソフトウェアを頻繁に更新する
- ソフトウェアがどこかのサーバーに接続している場合は、時々プロトコルを変更してください。いくつかのプロトコルを使用して、アルゴリズムに応じてそれらを切り替えることもできます
- ソフトウェアを実行するたびにダウンロードするサーバーにソフトウェアの一部を保存します
- プログラムを開始するときに、ロードしたdllのcrcチェックを実行します。つまり、承認されたdllのcrcのリストを用意します。
- メインアプリケーションを見落とすサービスがあり、crcチェックを時々実行し、他の依存するdll/アセンブリを監視します。
残念ながら、ソフトウェアのコピー保護に費やす金額が多ければ多いほど、機能に費やす必要のあるものは少なくなります。
もう1つのアプローチは、ソフトウェアを安価に販売することですが、頻繁に安価なアップグレード/更新を行うことです。そうすれば、クラックすることは有益ではありません。
コードを難読化するためのサードパーティツールがあります。VisualStudioには1つ付属しています。
しかし、最初に、なぜわざわざするのかを真剣に考える必要があります。あなたのアプリが十分に良くて人気があり、クラックされることを望むのであれば、あなたのすべての努力にもかかわらず、それはそうなるでしょう。
.NETコードの特徴は、 .NETReflectorなどのツールを使用してリバースエンジニアリングを行うのが比較的簡単なことです。コードの難読化は役に立ちますが、それでも解決することは可能です。
本当に無理です。パッチを頻繁にリリースしてから、暗号化のソルトを変更してください。ただし、ソフトウェアがクラックされた場合、誇りに思ってください。それは本当に良いに違いありません:-)
顧客が非常に少ない場合を除いて、これはほとんどミッションインポッシブルのようなものです。
考えてみてください-クラックされていないバージョンのWindowsを見たことがありますか?
あなたがそれを保護する方法を発明した場合、誰かがそれを解読する方法を発明することができます。人々がそれを「違法な」方法で使用するとき、彼らがそれに気付くように十分な努力を払ってください。それを超えるほとんどのことは時間の無駄になるリスクがあります;o)