2

プログラムをデバッグさせたくありません。デバッガーが接続されているかどうかを繰り返しチェックする 2 番目のスレッドがあります。

while(1){
    BOOL isDebugged = IsDebuggerPresent();
    if(isDebugged){
          //exit from my app
    }
    //and then check CheckRemoteDebuggerPresent()
}

この方法が安全かどうか知りたいですか? この保護があっても、誰かが私のアプリをデバッグできますか? より良い方法はありますか?

編集 :
実際、私はハードウェア セキュリティ トークンを持っています。アプリをコピーから保護したい。しかし、トークンを使用した単純な true/false チェックは、アプリのデバッグによって壊れると聞きました。

4

5 に答える 5

13

導入した保護を回避する方法は常にあります。唯一できることは、攻撃者がイライラしすぎて、時間をかけてソフトウェアのリバース エンジニアリングを試みる価値がないと宣言するのを難しくすることだけです。その 1 人の余分な人が試さないようにするために、どれだけの時間/お金の価値があるかだけの問題です。

IsDebuggerPresent安全を確認するだけの場合に答えるには?OllyDbgでコードを逆コンパイルして関数へのインポートを見つけ、代わりにfalseを返すようにexeにパッチを当てることで、リバースエンジニアリングしなければならなかったソフトウェアの正確なセキュリティ対策をバイパスしましIsDebuggerPresentた。保護を回避するのに約15分かかりました。リバース エンジニアリングに「経験のある」人なら、おそらく 5 でそれを行うことができたでしょう。

あなたができる唯一のことは、プログラムがリバースエンジニアリングされないようにするために「バーを上げる」ことです。ここにいくつかの提案があります:

  • コードを難読化する
  • 一般的なデバッグ ソフトウェア (Visual Studio、OllyDbg、IDA など) が現在実行されているかどうかを検出します。
  • コードを調べて、ソースを持っていない人がデバッグするのを難しくするために、専門のコンサルタントにお金を払ってください。

これらのソリューションの一部 (デバッガーが実行されているかどうかの検出など) は、他のソフトウェアのデバッガーを使用しているが、自分のソフトウェアでは使用しようとしない正当なユーザーを怒らせる可能性があるため、コストを比較検討する必要があります。

于 2013-08-17T06:56:44.623 に答える
4

関数が完全であるとします。それは常に正確な答えを提供し、攻撃者がそれを変えることはできません. そうだとしましょう。

じゃあ。明らかに、攻撃者はプロセスのデバッグ権限を持っています。つまり、プロセスのメモリを編集できます。そのため、通常はその命令を呼び出す命令を変更して、代わりに常に false を返すダミー関数を呼び出すだけです。

あなたのプロセスにデバッガーをアタッチできる場合、それは私があなたのプロセスのメモリに対する読み取りと書き込みのアクセス許可を持っていることを意味し、それを使って好きなことを何でもできることを意味します。それについてあなたができることは何もありません。

デバッガーがプロセスにアタッチされるのを避けたい場合は、管理下のコンピューターで実行する必要があります。ユーザーは、アクセス許可が制限されたアカウントでログインできます。OS は、ユーザーがプロセスのメモリをいじることを許可するかどうかを決定します。ユーザーがその権利を持っていると OS が判断した場合、ユーザーはその権利を持ち、それを使用することができます。

于 2013-08-17T09:07:07.460 に答える
3

個人的には、コピー防止の目的で一般的なデバッグ防止機能を使用しないことをお勧めします。

一方では、実際のコピー保護に関してはほとんど得られません (アンチデバッグのトリックを含むコピー保護スキームに大金を費やす企業は、リリースから数時間以内にトレント サイトでクラックされたソフトウェアを定期的に見つけます)。

その一方で、製品の有用性を制限することになります。最高のソフトウェア製品のほとんどは拡張可能です。つまり、ユーザーはプラグインを作成したり、他のソフトウェアとチェーンして、元の作成者のビジョンの外で興味深い方法で使用したりします。これらのユーザーは、これを行うときに自分の作業をデバッグできることが重要です。これは通常、コードをデバッグしようとしていない場合でも、プロセスにデバッガーを接続する必要があることを意味します。

コピー防止を追求する価値がないと言っているわけではありませんが、ユーザーがデバッガーを接続することを妨げない方法は他にもたくさんあります。デバッグを防止したい正当な理由は他にもあります。たとえば、オンライン ゲームでチート対策を保護するなどです。ほとんどの場合、難読化と自己監視コードが最善の策であり、それを破ることができる人なら誰でも、ほとんどのアンチデバッグ トリックも非常に簡単に破ることができるでしょう。

そうは言っても、あなたの質問に答えるために-いいえ、 IsDebuggerPresent は安全ではありません。目的はデバッグを妨げることではなく、デバッグを支援することであるため、意図されたものではありません。つまり、リリース モードのソフトウェアは、デバッガが存在する場合はデバッグ文字列を出力しますが、存在しない場合は実行時間を無駄にしないようにします。

于 2013-08-17T09:20:32.383 に答える