IsDebuggerPresentを回避する方法がよくわかりません。私はデバッグに使用されるレジスタを見つけて、それを0に設定してIsDebuggerPresentをだまそうとしていると思いますが、それを行う方法がわかりません。私はグーグルの周りを検索してみて、いくつかの解決策を試してみましたが、それは本当に私にとってはうまくいきませんでした。誰かがこれがどのように機能し、これをどのようにバイパスできるかを私に説明してくれませんか?
それを行うには多くの方法があります。あなたが言ったように、プログラムのスレッドブロックをパッチすることは可能です。これはチュートリアルで、IsDebuggerPresentを回避するには、この関数にパッチを適用して常に0を返すようにします。
1)IsDebuggerPresentを見つけます
私の状況では、それは7664EFF7にあり、3つの命令と1つのRETのみで構成されています。スレッドブロックを読み取り(アドレスはFS:18にあります)、 "デバッグ中です"というバイトを探して返します。戻り値はEAXに格納されます(ほとんどのWINAPI関数と同様)。最後にEAX = 0になるように関数を変更すると、IsDebuggerPresentを正常にバイパスできます。
2)パッチを適用する
これを行う最も簡単な方法は、関数に単にMOV EAX, 0
命令を実行させ、次にRETN
を実行させることです。
関数のサイズが変更されないように、残りの関数もNOPで埋めたことに注意してください。おそらく必要ではないでしょう。MOV EAX, 0
を実行してから、RETN
を実行することもできます。
また、変更はプログラムの1回の実行に対してのみ有効であることも知っておく必要があります。再起動すると、元の関数でkernel32.dll(IsDebuggerPresentが配置されている場所)の新しいコピーが読み込まれ、再度パッチを適用する必要があります。パッチを永続的なものにしたい場合は、起動バイナリを変更し、この関数のcallを変更/削除する必要があります。ただしその前に、バイナリが変更をチェックしないことを確認する必要もあります。
このコードをプロセスに挿入します。
mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0
これにより、PEB.BeingDebugged
flag にパッチが適用され、IsDebuggerPresent
が常に0
を返すようになります
X64dbgを使用する場合、dbh
コマンドを実行できます。
アプリケーションで確認したくない場合は、次のようにします。
Alt + e
を押すか、Executable modules
ウィンドウを開きます。C:\WINDOWS\system32\kernel32.dll
を選択し、ctrl + N
を押しますIsDebuggerPresent
を選択し、Enterキーを押します。f2
を押しますf8
を押します。TEST EAX,EAX
のようなものを探し、je
jnz
などのようなものの後に、IsDebuggerPresent
の出力がEAX
に保存されることに注意してください。nop
に変更し、発生しない場合はjmp
に変更してください。