Hi,
ich wollte mit folgender Routine den Speicher in einem Process nach einem String durchsuchen. Jedoch zeigen die Fehlermeldungen von GetLastError (dir Memo1.lines.add Zeilen) immer eine Fehlermeldung beim Zugriff auf den Speicher des Process an.
z.B.:
Addr:PageSize:ErrorMessage
05C38000:00009000:Only part of a ReadProcessMemory or WriteProcessMemory request was completed
05C43000:00012000:Access is denied (und diese Zeile wird fast bei jeder Page ausgegeben)
Mit
VirtualProtectEX komme ich leider auch nicht weiter, da die Fehlermeldungen beim ReadProcessMemory immer noch die selben sind.
Auch gibt es ein Problem bei
SetLength(ByteContent, SysInfo.RegionSize);
benutze um die ByteArray Größe zu bestimmen. Ich hatte mal am Anfang an Stelle des ByteConten einen WideString, was aber auch nicht geklappt hat.
Wo könnte denn an dieser Procedure das Hauptproblem mit dem Acces is denied behoben werden???
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| procedure SearchInMemory(PID: Cardinal; sSearchString: WideString); var hProcess : Cardinal; MemBasicInfo : TMemoryBasicInformation; SysInfo : TSystemInfo; lpMinAddr: Pointer; ret : DWORD; sBuffer : WideString; lpReadBytes : DWORD; lPos : Integer; CalcAddress : DWORD; ByteContent : array of Byte; lpOldProtect: Cardinal; begin hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
GetSystemInfo(SysInfo); lpMinAddr := SysInfo.lpMinimumApplicationAddress; while Cardinal(lpMinAddr) < Cardinal(SysInfo.lpMaximumApplicationAddress) do begin ret := VirtualQueryEx(hProcess, lpMinAddr, MemBasicInfo, SizeOf(MemBasicInfo)); SetLength(ByteContent, SysInfo.RegionSize);
if ret = SizeOf(MemBasicInfo) then if (MemBasicInfo.State = MEM_COMMIT) THEN begin ReadProcessMemory(hProcess, lpMinAddr, @ByteContent[0],High(ByteContent), lpReadBytes); form1.Memo1.Lines.Add(IntToHex(cardinal(lpMinAddr),8) +':'+IntToHex(cardinal(MemBasicInfo.RegionSize),8) +':'+SysErrorMessage(GetLastError)); lPos := Pos(sSearchString, sBuffer); if lPos > 0 then begin CalcAddress := Cardinal(lpMinAddr) + lPos; Form1.Memo1.Lines.Add(inttohex(CalcAddress,8)); end; end; lpMinAddr := Ptr(Cardinal(MemBasicInfo.BaseAddress)+MemBasicInfo.RegionSize); end;
Form1.Memo1.Lines.Add('fin'); CloseHandle(hProcess); end; |