![]() |
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; |
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??? |
Re: ReadProcessMemory
Warum sollte es denn laufen?
Was im RAM steht und was im EXE File steht ist nicht gleich. |
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??? |
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. |
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??? |
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). |
Re: ReadProcessMemory
OK! Vielen Dank für die Hilfe!!!
Gruß SleepyMaster |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz