17

IsDebuggerPresentを回避する方法がよくわかりません。デバッグに使用するレジスタを見つけて0に設定し、IsDebuggerPresentをだますことになっていると思いますが、その方法がわかりません。私はグーグルの周りを検索してみました、そしていくつかの解決策さえ試しましたが、それは私にとって実際にはうまくいきませんでした。誰かがこれがどのように機能するべきか、そして私がこれをどのように回避できるかを私に説明してもらえますか?

4

3 に答える 3

27

それを行うには多くの方法があります。あなたが言ったように、プログラムのスレッドブロックにパッチを当てることは可能です。これは、この関数にパッチを適用して常に0を返すようにすることで、IsDebuggerPresentを回避する方法のチュートリアルです。

1)IsDebuggerPresentを見つけます

OllyDbg 1

私の状況では、それは7664EFF7にあり、3つの命令と1つのRETのみで構成されています。スレッドブロック(アドレスはFS:18にあります)を読み取り、「デバッグ中です」というバイトを見つけて返します。戻り値はEAXに格納されます(ほとんどのWINAPI関数と同様)。最終的にEAX=0になるように関数を変更すると、IsDebuggerPresentを正常にバイパスできます。

2)パッチを適用します

これを行う最も簡単な方法は、関数にMOV EAX, 0命令を実行させてからRETN:を実行させることです。

OllyDbg 2

サイズを変更しないように、残りの関数にもNOPを入力したことに注意してください。おそらく必要ではありません。実行してから実行することもでき MOV EAX, 0ますRETN

また、変更はプログラムの1回の実行に対してのみ有効であることを知っておく必要があります。再起動すると、元の関数を含むkernel32.dll(IsDebuggerPresentが配置されている場所)の新しいコピーが読み込まれるため、パッチを再度適用する必要があります。パッチを永続的にしたい場合は、起動バイナリを変更し、この関数の呼び出しを変更/削除する必要があります。ただし、その前に、バイナリが変更をチェックしないことも確認する必要があります。

于 2012-04-26T10:58:44.827 に答える
11

プロセスに次のコードを挿入します。

mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0

PEB.BeingDebugged これによりフラグにパッチが適用され、IsDebuggerPresent常に戻り値が返されるようになります0

x64dbgを使用する場合は、dbhコマンドを実行できます。

于 2012-11-07T16:33:41.370 に答える
10

アプリケーションをチェックしたくない場合は、次のようにしてください。

  • を押すAlt + eか、ウィンドウを開きExecutable modulesます。
  • 選択C:\WINDOWS\system32\kernel32.dllしてを押しますctrl + N
  • 選択IsDebuggerPresentしてEnterキーを押します。
  • 押すf2
  • プログラムを実行し、このオペコードでプログラムが中断するのを待ちます。
  • f8コードに戻るまでいくつか押します。
  • などのようなものを探して、などのTEST EAX,EAXようなものの後に、の出力がに保存されることje jnzに注意してください。IsDebuggerPresentEAX
  • このオペコードでジャンプが発生したnop場合はに変更し、発生しない場合はに変更しjmpます。
  • プログラムを保存します。変更されたコードをollyDBGに保存する方法がわからない場合は、検索してください。
于 2016-03-05T19:12:33.840 に答える