2017-04-09 92 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 
} 

所以,此代码检查BeingDebuggedByte到PEB块的价值。

所以,如果这一项设置,他会再次跳到CheckDebugger,如果不是他要继续。

所以,我读反检测(1),而这个文件的艺术说:

“如果调试存在,直到发生堆栈溢出一,当一个溢出发生堆栈金丝雀它会再次检查将触发异常并且流程将被关闭,这是退出程序的最短途径。“

在堆栈中如何发生溢出?也许是因为我们每次都将eax推入堆栈?

+1

是的,正是由于该 –

+0

好,thanxs @SamiKuhmonen!我迷路了.. ahahah – Kiks777

+0

我投票关闭这一问题作为题外话,因为原来的海报中的问题回答了自己的问题。 –

回答

0

什么是精神错乱的定义是什么?一遍又一遍地做同样的事情,期待着不同的结果。

如果TEST EAX, EAX测试不等于第一次,也不会等于每一次,因为你不做改变要测试的值测试。

在另一方面,循环的每次迭代增加了一个32位的数字到堆栈,当你push eax这是为什么呢溢出。

您可以在push eax后跳转到指令,然后你就只是在一个无限循环,但另一个线程可能会改变你正在测试的变量,让你跳出循环 - 如果有其他线程。