Delphi Größe der Speicherstruktur herausfinden

Executor1

Lt. Junior Grade
Registriert
Okt. 2007
Beiträge
362
Seas,

folgende Situation, ich habe eine Adresse im Speicher gegeben. Nun möchte ich wissen wie groß die dort gespeicherte Struktur ist um diese auszulesen!
Weiß jemand wie das geht?

MfG

//edit:
Ich spezifizier das Problem mal!
Ich habe eine konstante Adresse im Speicher.
An dieser Stelle befindet sich ein Datentyp, sei es ein Integer-, ein Real- oder ein Anderer Typ.
Also ist der Typ unbekannt. Nun muss ich diesen einen Wert auslesen und dazu benötige ich die Größe (Size) dieses Wertes.
 
Zuletzt bearbeitet: (Fragestellung möglicherweiße zu allgemein!)
Hallo,

das geht leider ohne die Information, was dort genau ist, leider nicht.

Beschreib doch mal dein Problem genauer, vielleicht kann dir ja trotzdem geholfen werden. :)
 
Das klingt aber nach einem ziemlich kranken Programmiermodell mit Anfälligkeit für Speicherlecks. Für was brauchst du denn das? Soweit ich weiß sind Speicheradressen auch nicht zwingend so "konstant" wie du dir das vorstellst sondern es kann durchaus auf anderen Systemen auch plötzlich etwas anders liegen...
 
Ich bin mir hier bei der Materie auch nicht 100% sicher!
Ich weiß nur, dass ich einige Speicheradressen gegeben habe, die ich verändern muss.
Aber ich möchte nun noch hinzufügen, dass man diese Speicheradressen "zurücksetzt".
Falls es hilft: Der Wert dieser Speicheradressen, ist scheinbar zu jeder Zeit im System gleich und konstant (bzw. nicht konstant aber die Adresse verschiebt sich nicht sonstwohin).

MfG

//edit:
Folgende Adressen:
Code:
$5F0D28F0 := $E9;
$5F0D28F0 + 1 := $2A;
$5F0D28F0 + 2 := $25;
$5F0D28F0 + 3 := $0A;
$5F0D28F0 + 4 := $00;
(Natürlich kann man ":=" hier nicht anwenden, aber das hier wird grundsätzlich getan mit GENAU diesen Adressen).
Es handelt sich um fremden Speicher.
 
Zuletzt bearbeitet:
Ähm wurden diese Speicheradressen durch dein Programm vorher belegt oder versuchts du hier tatsächlich, auf fremden Speicher zuzugreifen?
 
//edit:
Folgende Adressen:
Code:

Code:
$5F0D28F0 := $E9;
$5F0D28F0 + 1 := $2A;
$5F0D28F0 + 2 := $25;
$5F0D28F0 + 3 := $0A;
$5F0D28F0 + 4 := $00;

(Natürlich kann man ":=" hier nicht anwenden, aber das hier wird grundsätzlich getan mit GENAU diesen Adressen).
Es handelt sich um fremden Speicher.
 
Alsoooo:

Aus Delphi impliziere ich mal Windows. Und vermutlich kein steinaltes ohne Protected Mode.

Damit siehst du eh nur virtuelle Adressen aus deinem Prozessraum und kannst garnicht auf "fremden" Speicher zugreifen. Alles was du siehst sind 4GB virtuelle Adressen, von denen nur ein kleiner echter Teil für deinen Prozess auf physikalischen Speicher und/oder Pagefile gemappt ist.

Mit OpenProcess, ReadProcessMemory und WriteProcessMemory kommst du auch an den Speicher anderer Prozesse. Was dort steht, kann man ohne genaue Kenntnis des anderen Prozesses nicht sagen.
Bedenke auch, dass es geschützte Speicherbereiche gibt, in die man nicht schreiben kann (man denke z.B. an das NX-Bit).

Edith:
Hast du diese "festen" Adressen eigentlich mal unter Vista kontrolliert? Vista hat einen veränderten Loader, der alle Executables, die es unterstützen an zufällig veränderte Adressen lädt.
 
Zuletzt bearbeitet:
Also dass ich diesen Adressen neue Werte zuweise funktioniert!
Dies ist ja auch meine Ausgangssituation. Alles was ich jetzt noch hinzufügen soll ist, dass ich sozusagen die Ursprungswerte speicher, damit ich das Tun des Programms zurücksetzen kann.
Dazu brauche ich wie erwähnt "ReadProcessMemory" aber dieses erwartet einen "Size" Parameter.
 
Wenn die Speicheradresse und der darin enthaltene Wert immer gleich ist, dann müsste doch auch der Variablentyp immer gleich bleiben. Somit musst du ihn ja nicht automatisch während des Programmablaufs bestimmen sondern kannst es einmal manuell (notfalls durch ausprobieren) bestimmen. Von einem externen Programm automatisch den Variablentyp an einer bestimmten Speicheradresse zu bestimmen ist nämlich meiner Meinung nach nicht möglich...
 
Ah okay :) Es war mir nicht klar, ob dir das klar ist, das konnte ich auch deinem Post nicht heraus lesen.

Lies doch erstmal stupide ein paar Bytes mehr aus dem Prozess und beobachte die Veränderungen. Versuche die Werte irgendwie zu interpretieren. Wenn du das geschafft hast, kannst du sie auch "richtig" verändern.

Du kannst allerdings dabei in diverse Probleme geraten, da der andere Prozess mit Sicherheit nicht erwartet, dass ihm ins Handwerk gepfuscht wird.
 
Also
ich will NICHT den Typ herausfinden (klar der ist in sehr starkem Verhältnis zur Größe "Size" der Adresse),
In erster Line möchte ich bloß irgendwie diese Daten behalten um sie später wieder einzusetzen.

Das "richtige" Verändern geht schon von Aufgabenstellung aus. Ich habe es auch ausprobiert, es funktioniert zu 100% ohne Fehler.

Ich habe doch eine "Speicherspanne" gegeben oder?
In meinem Beispiel jetzt:
5F0D28F0 bis 5F0D28F0 + 4
Kann ich hier nicht irgendwie die Values speichern?

MfG
 
Naja, wenn du einen WriteProcessMemory Aufruf in deinem Programm hast, musst du noch nur 1:1 abgucken, wie es dort gemacht wird.

Beim Lesen sagst du halt analog, von welcher Adresse du lesen willst (die ist ja bekannt), wieviele Bytes du lesen willst (entweder dir eh schon bekannt, sonst aus dem WriteProcessMemory Aufruf ersichtlich) und du teilst ReadProcessMemory mit, wo ein Puffer in deinem Prozess liegt, der den Speicherinhalt in der Größe der zu lesenden Bytes aufnimmt.

Zeig doch mal bitte etwas Code und mach bitte deutlich, wo die Probleme sind.
 
Zuletzt bearbeitet:
Das hat mich jetzt drauf gebracht!
Verdammt ich habe bei WriteProcessMemory einfach die "4" überlesen und da ich die Parameter dieser Procedure nicht kannte, dachte ich das sie keine Size Angabe bräuchte!...

Hat sich erledigt Leute.
Danke @ all!

MfG
 
Ah gut, ich war nämlich so langsam echt ratlos. :D Aber keine Sorge, ich habe auch öfters mal ne Denkblockade. :)
 
Zurück
Oben