gpt4 book ai didi

delphi - 内存扫描仪始终返回相同结果

转载 作者:行者123 更新时间:2023-12-03 19:00:42 24 4
gpt4 key购买 nike

使用此代码,我想扫描会更快,但是扫描总是返回相同的地址。

例如。:

00123456
00124567
00135478
00145893
00123456 //start repeat
00124567
00135478
00145893
00123456 //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都会增加1。 VirtualQuery提供有关整个页面的信息。页面中的所有地址都具有相同的基本地址。 The documentation告诉您,“此值向下舍入到下一页边界。”

仔细观察一下,您应该看到mbi.BaseAddress在外循环的4096次迭代中保持不变(假设页面大小为4096)。因此,您要一遍又一遍地重新扫描同一块内存。 (这也可能解释why your code is slow。)

关于delphi - 内存扫描仪始终返回相同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com