もう少し複雑にすることもできますが、最終的には 1 つ (または複数) のブール値になります。コードを実行するか実行しないかのどちらかです。難読化されていない .NET コードは、オープン ソースとほとんど同じであり、途方もなく簡単に解読できます。
難読化が完全な解決策ではない場合でも、非凡なアマチュアがクラックされたバージョンを作成するのを防ぐためだけに、難読化することは理にかなっていると思います。
もちろん、時間を費やしても構わないと思っている本物のクラッカーを止めることはできませんが、バーを少し高くするだけで、多くのクラッカー志望者を排除できます.
難読化は無料で簡単に実装できます。Visual Studio の商用バージョンをお持ちの場合は、DotFuscator を使用できます ("Express" エディションでは使用できません)。私は試したことはありませんが、十分に単純なはずです。
それ以外の場合は、Assemblur を使用できます。( http://www.metapropeller.com/ )。無料版はコマンドラインアプリです(設定ファイルを作成するGUIはありますが、コマンドラインから設定を実行する必要があります)。
全体として、単純なexeファイルを難読化するのに数分しかかからず、無料です
ライセンス チェックをもう少し難しくしたい場合は、さまざまなメソッド内で異なるチェックを行うことができます。また、ライセンス チェック コードが実際に文字列を直接出力しないようにすることもできます。(たとえば、方法 A でライセンス チェックを行いますが、方法 B からエラー警告を出力すると、クラッカーがライセンス エラー メッセージを探したときに、変更されるコードのビットに正しく到達しません。) .
クラッカー志望者の基準を引き上げ、本物のクラッカーにとって物事をより複雑にするだけです。
ケース 1: 難読化されていない .NET アプリケーションで、「ライセンスがありません」というエラー メッセージを出力するライセンス チェック メソッドが 1 つある場合。リフレクターが走れる人なら5分程度で割れる。
ケース 2: 難読化された .NET アプリケーションで、いくつかの異なるライセンス チェックが行われ、明らかな文字列出力がありません。クラッカーには何時間もかかる可能性があり、志望者には難しすぎることがわかります.
ケース 1 からケース 2 へは、1 セント硬貨も費やすことなく、約 1 時間の作業で取得できます。それを超えることはおそらく時間の無駄です (すべてクラックされる可能性があります) が、少なくとも、Reflector でアプリケーションを開く人々を排除して、それが簡単になるかどうかを確認することはできます。男がリフレクターでアプリケーションを開くと、次のようなものが表示されます。
public bool ValidateLicense(string sLicense)
{
string sInvalidLicense = "Your license is not valid";
...
}
次に何が起こると思いますか?
//編集: コメントで、LC は次のように尋ねました。
文字列メッセージを出力せずにユーザーに通知するにはどうすればよいですか? ライセンス チェックを実行して 2 つの異なる方法で出力したとしても、「if(!ValidateLicense(LicenseCode)) {NotifyUserOfInvalidLicense(); throw new LicenseException();}」などのバイナリ決定が行われます。
クラッカーの立場になってみましょう: あなたはライセンス認証コードを探しています。コードを見つけるためだけにコード全体を調べるつもりはありません。代わりに、アプリケーションをライセンスなしで実行します。エラー メッセージが表示されます。
そのエラー メッセージを受け取り、Refactor でアセンブリを開き、そのエラー メッセージの一部を検索します。
その文字列が「ValidateLicence()」内にある場合、すぐに ValidateLicence() 関数が見つかります。そこから、戻り値を見つけてその 1 バイトを変更するだけです。終わり。
文字列が "WhatEver()" 内で見つかった場合でも、"WhatEver()" を呼び出すメソッドを見つける必要があります。同じアセンブリ内にない場合もあります (その場合、Refactor はそれを見つけられません)。これにより、クラッカー志望者の仕事が難しくなります。彼はそのメソッドを調べて、コードがどのように検証されるかを確認する必要があります (検証されません)。彼はずさんで、間違ったメソッドの戻り値を変更することさえあるかもしれません。その場合、バグが発生します (メソッドが難読化されている場合、メソッドが何をするかを理解するのはそれほど簡単ではありません)。
さらに良いことに、文字列をまったく使用しないでください。エラー メッセージを一連の 16 進コードとして保存し、メッセージを表示する必要があるときに動的に文字列に変換できます。エラー文字列がないということは、クラッカーがライセンス検証コードを見つけるために別のものに頼らなければならないことを意味します。また、難読化されたコードを読むのは楽しくありません。
エラーメッセージを含む偽の検証メソッドを作成し、警告を抑制して、クラックが機能したように見せることもできます。
したがって、これらのようないくつかの単純で愚かなトリック + 単純な難読化は非常に簡単に実装でき、クラッカーは 5 分間の「出入り」のクラッキング セッションを数週間の作業に変えることができます。検証コードをクラックしますが、すべてが機能していること、およびおとりや不本意に作成された厄介なバグを修正しただけではないことを確認するためにテストする必要もあります。今、彼はテストなしでは確信が持てません。
最終的に、アセンブリのクラックは数バイトを変更するだけの問題であり、アセンブリのファイル内のバイトが変更されるのを防ぐことはできません。すべてがひび割れする可能性があります。
ただし、どのバイトを変更する必要があるかを見つけるのを非常に難しくすることができます。少なくとも、「探しているバイトはここにあります」という文字列を避けることができます。