2012-04-04 87 views
1

使用此代碼我猜掃描速度更快,但掃描總是返回相同的地址。內存掃描器總是返回相同的結果

EG:

0
00124567 
00135478 
00145893 
0//start repeat 
00124567 
00135478 
00145893 
0//start repeat 
00124567 
00135478 
00145893 

這是我的程序:

procedure SCANBYTE(value: integer); 
var 
lpflOldProtect: dword; 
s: size_t; 
mbi: MEMORY_BASIC_INFORMATION; 
SI: SYSTEM_INFO; 
lpStartAddress, lpStopAddress: dword; 
addr: dword; 
i: dword; 
begin 
GetSystemInfo(si); 
lpStartAddress := dword(SI.lpMinimumApplicationAddress); 
lpStopAddress := dword(SI.lpMaximumApplicationAddress); 
for addr := lpStartAddress to lpStopAddress do begin 
    S:= VirtualQuery(Pointer(addr), MBI, SizeOf(MEMORY_BASIC_INFORMATION)); 
    if (S=SizeOf(MEMORY_BASIC_INFORMATION)) and (MBI.State = MEM_COMMIT) and (MBI.Type_9 = MEM_PRIVATE) and (MBI.RegionSize>0) and (MBI.Protect = PAGE_READWRITE) then begin 
    for i := dword(MBI.BaseAddress) to (dword(MBI.BaseAddress) + dword(MBI.RegionSize)) - 4096 do begin 
    if value = PBYTE(i)^ then ListBox1.Items.Add(IntToHex(i,8)); 
    end; 
    end; 
end; 
end; 

我想這個問題是在最後FOR循環:

(...) 
for i := dword(MBI.BaseAddress) to (dword(MBI.BaseAddress) + dword(MBI.RegionSize)) - 4096 do begin 
(...) 

但我真的不知道.. 我該如何解決這個問題?

回答

8

您可以從開始地址到結束地址循環運行您的代碼。地址addr每次圍繞循環增加。 VirtualQuery爲您提供關於整個頁面的信息。頁面中的所有地址都具有相同的基地址。 The documentation告訴你,「該值向下舍入到下一頁邊界。」

仔細一看,你會發現mbi.BaseAddress對於外循環的4096次迭代保持不變(假設4096是頁面大小)。因此,你一遍又一遍地重新掃描同一塊內存。 (這也可以解釋爲why your code is slow。)

+0

謝謝,我修好了! – paulohr 2012-04-11 13:13:41