2017-04-09 17 views
-1

だから私はこのコードは、オーバーフローを引き起こす方法を、いくつかの日から思っていた:これはなぜオーバーフローが発生するのですか?

__asm 
{ 
CheckDebugger: 
    PUSH EAX     // Save the EAX value to stack 
    MOV EAX, [FS:0x30]   // Get PEB structure address 
    MOV EAX, [EAX+0x02]   // Get being debugged byte 
    TEST EAX, EAX    // Check if being debuged byte is set 
    JNE CheckDebugger   // If debugger present check again 
    POP EAX      // Put back the EAX value 
} 

ので、このコードは、PEBブロックにBeingDebuggedByteの値をチェックしています。

これが設定されていれば、彼はCheckDebuggerに再びジャンプし、そうでない場合は続行します。

だから、私は、(1)抗検出のアートを読んでいる、と本書は言う:

「オーバーフローがスタックカナリアを発生したときにオーバーフローが、スタック内で発生するまで、それが再びチェックするデバッガ存在する場合例外をトリガし、プロセスが終了する、これはプログラムを終了するための最短の方法です。

スタックでオーバーフローが発生する可能性はありますか?たぶん、スタックにeaxを毎回押し込んでいるからでしょうか?

+1

はい、まさにそのためです –

+0

Ok、thanxs @SamKuhmonen!私は失われた.. ahahah – Kiks777

+0

元のポスターが質問の中で自分の質問に答えたので、私はこの質問をオフトピックとして閉じるよう投票しています。 –

答えて

0

狂気の定義は何ですか?同じことを何度も繰り返し、別の結果を期待している。

最初のテストと同じでない場合は、テストする値を変更するために何もしないため、毎回同じテストではありません。

一方、ループが繰り返されるたびに、オーバーフローする理由はpush eaxのときに32ビットの数値がスタックに追加されます。

push eaxの後の命令にジャンプして、無限ループに入るだけですが、別のスレッドがテスト中の変数を変更して、ループの外に出かける可能性があります。

関連する問題