内存扫描器总是返回相同的结果
问题描述:
使用此代码我猜扫描速度更快,但扫描总是返回相同的地址。内存扫描器总是返回相同的结果
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
(...)
但我真的不知道.. 我该如何解决这个问题?
答
您可以从开始地址到结束地址循环运行您的代码。地址addr
每次围绕循环增加。 VirtualQuery
为您提供关于整个页面的信息。页面中的所有地址都具有相同的基地址。 The documentation告诉你,“该值向下舍入到下一页边界。”
仔细一看,你会发现mbi.BaseAddress
对于外循环的4096次迭代保持不变(假设4096是页面大小)。因此,你一遍又一遍地重新扫描同一块内存。 (这也可以解释为why your code is slow。)
谢谢,我修好了! – paulohr 2012-04-11 13:13:41