プロセスへのアタッチを無効にする

私は、誰かがプログラム/プロセスに接続しているかどうかを確認して確認する方法を探しています。

プロセスにアタッチを無効にすることで自分のプログラムをリバースエンジニアリングすることを難しくしたいと思います。

これは可能ですか?私のプロセスに何かが付いているかどうかを調べるAPI呼び出しがありますか?そうすればプロセスが終了します。

私の理解から、私はこれを私のコードでチェックすることができますか、そうするべきです。もしこれが真実なら、私は自分自身を殺すことができます。

#if DEBUG
RTBconsole.Text = "Debug version";
#endif

これは私のコードをデバッグするのを止めてしまっただけで、自分のプロセスで起こっている添付ファイルのフォームを停止できるようにしたいのです。

0
私はちょうどカーネルレベルのデバッガを使うことができます。あなたは私が付いていたことを決して知らないでしょう。
追加された 著者 Roger Lipscombe,
アンチデバッグ - デベロッパーズビュー(PDF)に興味があるかもしれません(管理されたコードを処理しないため、この手法は適用されないか、余分な作業が必要になる可能性があります)。
追加された 著者 user786653,

2 答え

いくつかの戦略...

#1:

There are some APIs for detecting the presence of a debugger:

しかし、明らかな制限があります。デバッガが実行を中断した場合、このチェックは無意味です。これは水密ではありません。

#2:

Attach your own debugger to the processes you care about. That way the user cannot attach their own (a process can only be debugged once simultaneously).

もちろん、ユーザーはデバッガプロセスを強制終了することができます。

または、防止または検出できないカーネルデバッガを使用します。

Which leads to the conclusion: at some level, as long as the user has full access to the system, they can do whatever they want, so be sure to weigh your anti-debugging efforts against the realization that it will take less time for a novice hacker to work around it.

4
追加された

管理デバッガを検出するには、 Systemを呼び出します。 Diagnostics.Debugger.IsAttached をクリックします。

ネイティブのデバッガを検出するには、必要な機能を IsDebuggerPresent 。 P /これを次のように呼び出します。

[DllImport("kernel32")]
static extern bool IsDebuggerPresent();

@tenfourによると、これらのアプローチのどちらも、毅然とした攻撃者に対して特に効果的ではありませんが、それでは何もありません。

3
追加された