2017-04-09 89 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後跳轉到指令,然後你就只是在一個無限循環,但另一個線程可能會改變你正在測試的變量,讓你跳出循環 - 如果有其他線程。