2012-12-14 63 views
2

我正在關注如何在C中製作內存掃描器的簡單教程。由於某種原因,我的主循環從未發生過。C內存掃描器[無限循環]

下面是代碼

MEMBLOCK* create_scan(unsigned int pid){ 

    MEMBLOCK *mb_list = NULL; 
    MEMORY_BASIC_INFORMATION meminfo; 
    unsigned char *addr = 0; 

    HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); 

    if(hProc){ 
     while(1){ 
      // print the address for debug purpose 
      printf("%d \r\n", addr); 

      // loop should break out when the address overflows (return 0) 
      if(VirtualQueryEx (hProc, addr, &meminfo, sizeof(meminfo)) == 0){ 
       break; 
      } 

#define WRITABLE (PAGE_READWRITE | PAGE_WRITECOPY |PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) 
      if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & WRITABLE)){ 
       MEMBLOCK *mb = create_memblock (hProc, &meminfo); 
       if(mb){ 
        mb->next = mb_list; 
        mb_list = mb; 
       } 
      } 

      addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize; 
     } 
    } 
    return mb_list; 
} 

出於某種原因,輸出(printf的)這是

123863040 
125943808 
... until ... 
2147418112 
... all on the sudden ... 
-1207959552 
... 
-243924992 
0 
65536 
loop start again 

任何想法,我有點迷路了!

回答

1

VirtualQueryEx()的返回值是它用數據填充的結構的大小。除非有錯誤,否則它不會返回零。

負值只是大於2GB的地址,在printf()中被解釋爲負數。一旦超過4GB,它將回到0.由於0是你的初始值,並且它第一次工作,它會重新開始。

你需要一個不同的標準來退出你的循環。

您可能還想用%p代替%d來打印當前地址。

+0

如果地址太高,會產生錯誤否? 非常感謝我解釋我的結果,至少我明白了奇怪的結果......我總是想知道人們是如何知道所有這些東西的。 –

+0

謝謝,我使用SYSTEMINFO lpMaximumApplicationAddress打破了我的循環。欣賞它。 –