Mam funkcję Olesia:
function FindBytesInMemory(APID : WORD; RangeFrom, RangeTo: Cardinal; ArrayOfBytes: array of Byte): Cardinal;
const
BufferSize = 65535;
var
FOund : boolean;
SizeOfArr : Byte;
X, Y, Addr : Cardinal;
HProcess, BytesRead, BytesToRead : DWORD;
Buffer : array[0..BufferSize - 1] of Byte;
begin
Result := 0;
SizeOfArr := Length(ArrayOfBytes);
HProcess := OpenProcess(PROCESS_VM_READ, False, APID);
if (HProcess > 0) and (RangeFrom < RangeTo) then
begin
Addr := RangeFrom;
while Addr < RangeTo do
begin
BytesToRead := BufferSize;
if (RangeTo - Addr) < BytesToRead then
begin
BytesToRead := RangeTo - Addr;
end;
ReadProcessMemory(HProcess, Pointer(Addr), @Buffer[0], BytesToRead, BytesRead);
if BytesRead > 0 then
begin
for X := 0 to BytesRead - 1 do
begin
Found := True;
for Y := Low(ArrayOfBytes) to High(ArrayOfBytes) do
if Buffer[X + Y] <> ArrayOfBytes[Y] then
begin
Found := False;
Break;
end;
if Found then
begin
Result := Addr + X + Y - SizeOfArr;
Break;
end;
end;
end;
Addr := Addr + BytesToRead;
end;
end;
CloseHandle(HProcess);
end;
Pamięć przeszukiwana jest od końca zakresu do jego początku, dlaczego? Z tego co widzę, powinno być od początku do końca.
Ustawiam zakres od $0000000 do $FFFFFFFF i szukam w pamięci ciągu bajtów "7B226163". Według Cheat Engine istnieją dwa takie ciągi. Mnie interesuje ten pierwszy począwszy od $0000000. Mimo to zczytuje mi ten drugi (czyli pierwszy od końca). Dlaczego?