2012-04-04 2 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 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

Смежные вопросы