Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozessspeicher lesen / schreiben Ergebnis falsch (https://www.delphipraxis.net/147788-prozessspeicher-lesen-schreiben-ergebnis-falsch.html)

Gehstock 16. Feb 2010 13:34


Prozessspeicher lesen / schreiben Ergebnis falsch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  dwBytes, Buf: DWord;
  dwEngineBase, dwClientBase: DWord;
  dwProcID: Integer;
  hProcess: THandle;
begin
  dwEngineBase := 0;
  dwClientBase := 0;
  hProcess := 0;
  dwProcID := GetProcessID('calc.exe');
  if dwProcID <> 0 then
  begin
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, true, dwProcID);
    if (hProcess = INVALID_HANDLE_VALUE) then
    begin
      Showmessage('Ungültiges Handle :' + Inttostr(hProcess));
      exit;
    end;
    // dwClientBase := GetModuleBaseAddress(dwProcID, 'calc.exe');
    // Showmessage(InttoHex(dwProcID,8));
//    dwBytes := 4;
//  end
//  else
//  begin
//    Showmessage('Finde Prozess nicht');
//  end;
if ReadProcessMemory(dwProcID, Pointer($002C3C84), @Buf, 4, dwBytes) then
    caption := (inttostr(Buf) + '+' + (inttostr(dwBytes)));
end;
end;
liefert 1242625
was mache ich falsch weil lesen sollte ich ja eigentlich 85

habs vor lauter Verzweiflung auch in C++ versucht (obwohl ich das nicht kann) was aber genauso aussieht?

himitsu 16. Feb 2010 13:42

Re: Prozessspeicher lesen Ergebnis falsch
 
Ließt ReadProcessMemory überhaupt was ... was sagt dessen Result und was sagt dwBytes?

Sicher daß die Adresse $002C3C84 stimmte?

...

Gehstock 16. Feb 2010 13:45

Re: Prozessspeicher lesen Ergebnis falsch
 
dwBytes sagt 0, die Adresse ist zumindest die aus CE vieleicht interpretiere ich diese auch falsch?

nein Er liest nichts ich bin da schon seit Tagen dran aber immer das selbe

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  dwBytes, Buf: DWord;
  dwEngineBase, dwClientBase: DWord;
  dwProcID: Integer;
  hProcess: THandle;
begin
  dwEngineBase := 0;
  dwClientBase := 0;
  hProcess := 0;
  dwProcID := GetProcessID('calc.exe');
  if dwProcID <> 0 then
  begin
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, true, dwProcID);
    if (hProcess = INVALID_HANDLE_VALUE) then
    begin
      Showmessage('Ungültiges Handle :' + Inttostr(hProcess));
      exit;
    end;
if not ReadProcessMemory(dwProcID, Pointer($002C3C84), @Buf, 4, dwBytes) then
  ShowMessage(SysErrorMessage(GetLastError))
  else
    caption := (inttostr(Buf) + '+' + (inttostr(dwBytes)));
end;
end;
Meldung Kann Speicher nicht lesen

himitsu 16. Feb 2010 14:01

Re: Prozessspeicher lesen Ergebnis falsch
 
Siehst du, und schon haben wir die Erklärung für deine Frage. :zwinker:
Zitat:

Zitat von Gehstock
was mache ich falsch

Heißt also, daß entweder dwProcID oder Pointer($002C3C84) nicht stimmt
oder daß dein Programm nicht genügend Rechte hat, um Lesen zu dürfen.

Aber mal sehn, ob man eine bessere Fehlermeldung rausbekommt, als dein nichtssagendes "Kann Speicher nicht lesen":
Delphi-Quellcode:
if not ReadProcessMemory(dwProcID, Pointer($002C3C84), @Buf, 4, dwBytes) then
  ShowMessage(SysErrorMessage(GetLastError));

Gehstock 16. Feb 2010 14:07

Re: Prozessspeicher lesen Ergebnis falsch
 
Ergebnis
Das Handle ist ungültig Wert ist 224

sollte er da nicht schon hier anschlagen
Delphi-Quellcode:
      hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID);
    if (hProcess = INVALID_HANDLE_VALUE) then
    begin
      Showmessage('Finde Handle nicht');
      exit;
    end;
Delphi-Quellcode:
Showmessage(InttoHex(dwProcID,8));
liefert auf jeden fall den korrekten Wert

Zitat:

SysErrorMesssage
mach da mal n s weg der nächste wundert sich :-D

himitsu 16. Feb 2010 14:19

Re: Prozessspeicher lesen Ergebnis falsch
 
Handle ist aber nicht gleich Handle.

http://msdn.microsoft.com/en-us/library/ms680553.aspx
A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.


Mit meinem Kellerschlüssel komm ich doch auch nicht in den Tresor der Staatsbank ... obwohl ich ja EINEN Schlüssel hab.

Gehstock 16. Feb 2010 14:23

Re: Prozessspeicher lesen Ergebnis falsch
 
mach ich das nicht hier
Delphi-Quellcode:
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID);
sorry steh grad auf dem Schlauch

Astat 16. Feb 2010 14:26

Re: Prozessspeicher lesen Ergebnis falsch
 
Hallo Gehstock für notwendiges DebugPrivilege guckst du da..

http://www.delphipraxis.net/internal...t.php?t=173205

Thread#8

lg. Astat

rollstuhlfahrer 16. Feb 2010 15:09

Re: Prozessspeicher lesen Ergebnis falsch
 
muss bei ReadProcessMemory() nicht das Handle rein, dass du von OpenProcess bekommen hast?

Bernhard

Gehstock 16. Feb 2010 15:47

Re: Prozessspeicher lesen Ergebnis falsch
 
Man bin ich Doof ja das wars Danke :bouncing4:

Gehstock 16. Feb 2010 18:10

Re: Prozessspeicher lesen Ergebnis falsch
 
nun Hab ich ein Ähnliches Problem beim Schreiben

fehler sind unter
Windows7 Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen
WinXP Falscher Parameter

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  dwBytes, Buf: DWord;
  dwEngineBase, dwClientBase: DWord;
  dwProcID: Integer;
  hProcess: THandle;
begin
  dwEngineBase := 0;
  dwClientBase := 0;
  hProcess := 0;
  dwProcID := GetProcessID('calc.exe');
  if dwProcID <> 0 then
  begin
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, dwProcID);
    if (hProcess = INVALID_HANDLE_VALUE) then
    begin
      Showmessage('Ungültiges Handle :' + Inttostr(hProcess));
      exit;
    end;
//if not ReadProcessMemory(hProcess, Pointer($2c3ca4), @Buf, 4, dwBytes) then
//  ShowMessage(SysErrorMessage(GetLastError)+ ' : '+Inttostr(hProcess))
//  else
//    caption := (inttostr(Buf));
//end;
if not WriteProcessMemory(hProcess,Pointer($002C3C84),Pointer($55), 1,dwBytes) then
  ShowMessage(SysErrorMessage(GetLastError))
  else
    caption := (inttostr(dwBytes));
end;
end;
hab mir schon einige Delphi und C++ Sourcecodes angeschaut wegen dieser DebugPrivileges welche dort aber nie verwendet werden

mleyen 16. Feb 2010 20:34

Re: Prozessspeicher lesen / schreiben Ergebnis falsch
 
Die Hilfe zu den Parametern von Delphi-Referenz durchsuchenWriteProcessMemory hätte geholfen. :wink:
SizeOf(Pointer($55)) ist bei mir ungleich 1.
Btw: Delphi-Referenz durchsuchenCloseHandle fehlt.

himitsu 16. Feb 2010 20:40

Re: Prozessspeicher lesen / schreiben Ergebnis falsch
 
Pointer($55) kann nicht stimmen, da einem Programm im Usermode kein Zugriff auf die 64 KB gewährt sind.

Falls du die $55 als Byte schreiben willst, dann muß dieses in eine Variable oder in einen anderen Puffer und dann gibst du den Zeiger auf diesen Puffer dort an.

Zitat:

Zitat von mleyen
SizeOf(Pointer($55)) ist bei mir ungleich 1.

Egal, ein Pointer wäre 4 Byte und demnach könnte man davon auch 1 Byte schreiben,
aber hier zeigt der Pointer auf einen ungültigen Speicherbereichen
oder er will hier den Pointer, anstatt den Wert speichern.

mleyen 16. Feb 2010 20:44

Re: Prozessspeicher lesen Ergebnis falsch
 
Das dies möglich ist weiß ich, nur folgendes hat mich zu der Antwort verleitet:
Zitat:

Zitat von Gehstock
Windows7 Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen


himitsu 16. Feb 2010 20:51

Re: Prozessspeicher lesen Ergebnis falsch
 
Das ist 'ne Standardmeldung, welche eintritt, wenn Bytes nicht gelesen/geschrieben werden können ... was hier beim letzen und auch rein zufällig beim einzigen Byte passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz