web-dev-qa-db-ja.com

OllyDbgでIsDebuggerPresentをバイパスするにはどうすればよいですか?

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

15
Strawberry

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

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が配置されている場所)の新しいコピーが読み込まれ、再度パッチを適用する必要があります。パッチを永続的なものにしたい場合は、起動バイナリを変更し、この関数のcallを変更/削除する必要があります。ただしその前に、バイナリが変更をチェックしないことを確認する必要もあります。

23
kuba

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

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

これにより、PEB.BeingDebuggedflag にパッチが適用され、IsDebuggerPresentが常に0を返すようになります

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

9
mrexodia

アプリケーションで確認したくない場合は、次のようにします。

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