所以我有些日子想知道这段代码是如何导致溢出的:
__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),而且这份文件说:
“如果调试器存在,它将再次检查,直到堆栈发生溢出,当发生溢出时,堆栈canaries将触发异常并且进程将被关闭,这是退出程序的最短方式。”< / em>的
如何在堆栈中发生溢出?也许是因为我们每次都将eax推入堆栈?
答案 0 :(得分:0)
精神错乱的定义是什么?一遍又一遍地做同样的事情并期待不同的结果。
如果TEST EAX, EAX
测试不是第一次测试,那么每次都会测试它不相等,因为你什么也没做,无法改变你正在测试的值。
另一方面,当你push eax
时,循环的每次迭代都会向堆栈添加一个32位数字,这就是它溢出的原因。
您可以跳转到push eax
之后的指令然后您将处于无限循环中,但另一个线程可能会更改您正在测试的变量并让您退出循环 - 如果还有其他线程。