Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ReadProcessMemory (https://www.delphipraxis.net/13018-readprocessmemory.html)

SleepyMaster 9. Dez 2003 14:47


ReadProcessMemory
 
Was mach ich falsch???

Die erstellte exe (C:\AusRam.exe) ist immer 421.888 Bytes groß doch funzt ned! Warum???


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  data :           array[1..1024] of char;
  Bytesread,a,z :  DWORD;
  XPosition:       int64;
  F:               file;
begin
AssignFile(f, 'C:\AusRam.exe');
rewrite(f,1);
XPosition:=0;
Z:=GetCurrentProcess;
Bytesread:=1;
while Bytesread <> 0 do
  begin
  ReadProcessMemory(z,Pointer($400000+XPosition),@data[1],length(data),Bytesread);
  blockwrite(f,data[1],Bytesread);
  XPosition:=XPosition+Bytesread;
  end;
CloseFile(f);
end;

SleepyMaster 9. Dez 2003 14:58

Re: ReadProcessMemory
 
Die erzeugten Dateien sind immer so groß, wie sie Speicherplatz auf dem Datenträger verbrauche!

Edit: Sorry! Aber nur wenn der Buffer auch 1024Bytes groß ist! Logisch!

Nur warum läuft die erstellte exe nicht???

Robert Marquardt 9. Dez 2003 16:24

Re: ReadProcessMemory
 
Warum sollte es denn laufen?
Was im RAM steht und was im EXE File steht ist nicht gleich.

SleepyMaster 10. Dez 2003 13:31

Re: ReadProcessMemory
 
Wenn man ein Programm startet wird es vollständig in den Arbeitsspeicher geladen, und von dort aus "gestartet" (glaub ich zumindestens mal).
Und immerhin ist der Header der Datei, die ich auf die Festplatte kopiert habe richtig. Auch der restlicher Inhalt stimmt mit dem Originalen FAST überein. Nur zwichendurch hab ich ganze Blöcke in denen nichts drinsteht.

Woran liegt das??? Was mach ich falsch???

Robert Marquardt 10. Dez 2003 14:26

Re: ReadProcessMemory
 
Deine Vorstellung eines Programm-Laders ist zu primitiv.
Ein Programm muss keineswegs vollstaendig geladen sein.
Es kann eine Relozierung von Adressen vorgenommen werden.
Das Datensegment mit den nicht initialisierten globalen Variablen
ist im File ueberhaupt nicht vorhanden. Es wird nur im Speicher angelegt.

SleepyMaster 10. Dez 2003 15:08

Re: ReadProcessMemory
 
Das erste ist mir auch klar!

Zum zweiten: Heißt das, dass die exe erst dann funktionieren würde, wenn wirklich ALLE Variablen initialisiert werden würden??? Und werden die Variabeln nicht in einem anderen Teil des Arbeitsspeichers untergebracht???

Robert Marquardt 10. Dez 2003 16:15

Re: ReadProcessMemory
 
Nicht initialisierte globale Variablen liegen in einem eigenen Segment (traditionell .BSS genannt).
Im EXE ist das Segment leer. Im Speicher wird es angelegt und mit 0 gefuellt. Daher haben alle globalen Variablen in Delphi ihre Vorbelegung.
Initialisierte globale Variablen liegen in einem anderen Segment (.DATA genannt).

SleepyMaster 10. Dez 2003 17:18

Re: ReadProcessMemory
 
OK! Vielen Dank für die Hilfe!!!

Gruß SleepyMaster


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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