5

私は現在、ライセンス情報とデータの署名および公開鍵を含む単純な XML ファイルを使用しています。これまでのところ、この方法はうまく機能しています。ただし、かなり大きなセキュリティ上の欠陥が 1 つあります...

ASP.NET MVC アプリケーションが起動すると、ライセンスが検証され、それに応じて "ValidLicense" ブール プロパティが設定されます。リクエストごとにこのプロパティがチェックされ、ライセンスが無効な場合はエラー メッセージが表示されます。

ご想像のとおり、ライセンスの有効性に関係なく、有能なユーザーが私のアセンブリを単純に変更して "ValidLicense" を true に設定することを止める方法はまったくありません。ほとんどすべてのアプリケーションでこれを実行できることはわかっていますが、.NET アセンブリを使用すると非常に簡単に実行できるようです。

これが起こらないようにする方法、または少なくともライセンス確認手順を解読するのを少し難しくする方法はありますか?

可能であれば、アセンブリの暗号化や難読化システムには近づきません。ただし、コストと余分な頭痛を正当化するのに十分であると思われる場合は、先に進んで提案してください.

4

4 に答える 4

1

もう少し複雑にすることもできますが、最終的には 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 分間の「出入り」のクラッキング セッションを数週間の作業に変えることができます。検証コードをクラックしますが、すべてが機能していること、およびおとりや不本意に作成された厄介なバグを修正しただけではないことを確認するためにテストする必要もあります。今、彼はテストなしでは確信が持てません。

最終的に、アセンブリのクラックは数バイトを変更するだけの問題であり、アセンブリのファイル内のバイトが変更されるのを防ぐことはできません。すべてがひび割れする可能性があります。

ただし、どのバイトを変更する必要があるかを見つけるのを非常に難しくすることができます。少なくとも、「探しているバイトはここにあります」という文字列を避けることができます。

于 2009-02-10T04:45:32.890 に答える
0

小さな .NET 製品をハッキングしようとしたときに遭遇したアプローチは、ライセンス チェックにアンマネージ .DLL を使用することでした。それだけでなく、.DLL には、ソフトウェアで実際に使用された多くのコードも含まれていました。したがって、製品をクラックするには、アンマネージ .DLL をクラックする (または完全なラッパーを作成する) 必要がありました。言うまでもなく、これは私のようなクラッカー志望者を止めました。:)

于 2009-02-10T08:28:41.340 に答える