IsDebuggerPresentを回避する方法がよくわかりません。デバッグに使用するレジスタを見つけて0に設定し、IsDebuggerPresentをだますことになっていると思いますが、その方法がわかりません。私はグーグルの周りを検索してみました、そしていくつかの解決策さえ試しましたが、それは私にとって実際にはうまくいきませんでした。誰かがこれがどのように機能するべきか、そして私がこれをどのように回避できるかを私に説明してもらえますか?
3 に答える
それを行うには多くの方法があります。あなたが言ったように、プログラムのスレッドブロックにパッチを当てることは可能です。これは、この関数にパッチを適用して常に0を返すようにすることで、IsDebuggerPresentを回避する方法のチュートリアルです。
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が配置されている場所)の新しいコピーが読み込まれるため、パッチを再度適用する必要があります。パッチを永続的にしたい場合は、起動バイナリを変更し、この関数の呼び出しを変更/削除する必要があります。ただし、その前に、バイナリが変更をチェックしないことも確認する必要があります。
プロセスに次のコードを挿入します。
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
コマンドを実行できます。
アプリケーションをチェックしたくない場合は、次のようにしてください。
- を押す
Alt + e
か、ウィンドウを開きExecutable modules
ます。 - 選択
C:\WINDOWS\system32\kernel32.dll
してを押しますctrl + N
- 選択
IsDebuggerPresent
してEnterキーを押します。 - 押す
f2
- プログラムを実行し、このオペコードでプログラムが中断するのを待ちます。
f8
コードに戻るまでいくつか押します。- などのようなものを探して、などの
TEST EAX,EAX
ようなものの後に、の出力がに保存されることje
jnz
に注意してください。IsDebuggerPresent
EAX
- このオペコードでジャンプが発生した
nop
場合はに変更し、発生しない場合はに変更しjmp
ます。 - プログラムを保存します。変更されたコードをollyDBGに保存する方法がわからない場合は、検索してください。