昨天研究了一下isdebuggerpresent這個函式的實現**,發現真的很簡單,只有區區4行:
mov eax, dword ptr fs:[018h]
mov eax, dword ptr [eax + 030h]
movzx eax, dword ptr [eax + 02h]
ret
參考了一些大牛的文章,原來第一行是獲取teb的位址,第二行是獲取peb位址,第三行是獲得beingdebugged標記的值,beingdebugged值為1則程序被除錯,值為0則程序沒有被偵錯程式附加,於是我寫了以下的**,可以實現和isdebuggerpresent相同的檢測功能:
while (1)
printf("%08x\n", dwfs);
system("pause");
}
使用__readfsdword函式前請#include 獲取其他程序的fs暫存器
由於fs暫存器裡面有很多資訊可用,so 在不注入的情況下採用暴力搜尋。我不知道有沒有更高階的辦法。nt teb 0x000 nttib nt tib 0x000 exceptionlist ptr32 0x004 stackbase ptr32 0x008 stacklimit ptr32 0x00...
c語言效能優化 使用暫存器變數
c語言效能優化 使用暫存器變數 當對乙個變數頻繁被讀寫時,需要反覆訪問記憶體,從而花費大量的訪問時間。為此,c語言提供了一種變數,即暫存器變數。這種變數存放在cpu的暫存器中,使用時,不需要訪問記憶體,而直接從暫存器中讀寫,從而提高效率。暫存器變數的說明符是register。對於迴圈次數較多的迴圈控...
STM32入門系列 使用C語言封裝暫存器
前面介紹了儲存器對映 暫存器和暫存器對映,這些都是為了介紹使用 c語言封裝暫存器做鋪墊。這裡我們通過乙個例項來對 c 語言封裝暫存器進行介紹。具體例項 控制 gpioc 埠的第 0 管腳輸出乙個低電平。首先我們需要知道gpioc 埠外設是掛接在哪個匯流排上的,然後根據匯流排基位址和本身的偏移位址得到...