Specherbruchteile verwalten
Übersicht

![]() |
Der EisvogelBetreff: Specherbruchteile verwalten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Ich habe grade ein Problem mit der Verwaltung von Speicherbruchteilen. Ich hole mir mit ReadProcessMemory bestimmte Teile aus dem Speicher einer anderen Anwendung. Das entspricht im Moment ungefähr 400 MB. Wenn ich den Speicher allerdings komplett auslesen würde, dann wären das mehr als 2 GB. Das ist mir zu viel, denn es soll auch noch auf anderen Computer gut funktionieren. Jetzt will ich mit Speicheradressen ganz normal darauf zugreifen. Wenn ich den ganzen Speicher kopieren würde, wäre das ja kein Problem dann kann ich einfach auf meinen Pointer zugreifen. So habe ich aber viele einzelen Pointer die alle auf einen Teil Speichers zeigen. Wie kann ich das jetzt geschickt anstellen, dass immer der richtige Pointer angesprochen wird? Oder gibt es eine andere Möglichkeit mit der man schnell auf den Speicher eines fremden Prozesses zugreifen kann? Früher habe ich immer jede einzelne Adresse einzeln mit ReadProcessMemory ausgelesen, aber das ist zu langsam wenn mann mehrere Variablen haben muss. Wenn ich immer diese Speicherblöcke auslese, dann geht das sehr viel schneller. Versteht jemand mein Problem? Wenn ja, ich bin dankbar über jede Hilfe. EDIT: Weis jemand wie das in der Cheat Engine gemacht wird? Die hat bei mir mit >100 Variablen 0% CPU Auslastung und braucht so gut wie keine Speicher? Wie greift die so schnell auf den Speicher des Programms zu? MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Speicherbereiche kopieren willst, brauchst du dazu nur einen Pointer. Du kannst einen Pointer behandeln wie ein Array, falls das das Problem sein sollte:
BlitzMax: [AUSKLAPPEN] Local p1:Byte Ptr=MemAlloc(6) Der Pointer bietet in BlitzMax die Basisadresse und von dort aus kannst du hinaufgehen. Ich begreife nur nicht, was du damit meinst, dass aus 400 MB auf einmal 2 GB werden. Ich glaube, dass Cheatengines registrieren, wo sich Werte dauernd ändern, daraus folgern, dass das Variablen sind und eine Liste von Speicherplätzen von Variablen erstellen, die einen Pointer dorthin beinhalten. Das sind bei 100 Variablen 400 Byte (auf 32 Bit Systemen). mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, in dem Programm werden verschiede Speicherbereiche genutzt. Also mehrere Blöcke in verschiedenen Abständen. Wenn ich jetzt alles auf einmal rauskopiere und sind das 2GB. Wenn ich jetzt aber nur die Blöcke, die wirklich genutzt werden raus kopiere, dann sind es nur 400 MB, was ja auch schon viel ist.
Jetzt habe ihc für jeden Block einen Pointer, der an einer bestimmten Adresse in dem Programm anfängt. Wenn ich jetzt auf diesen Speicher zugreifen will, wie muss ich das machen, dass immer auf den richtigen Pointer zugegriffen wird? Wenn ich alles rauskopiere bekomme ich sowas (Pseudo) BlitzMax: [AUSKLAPPEN] pointer:Byte Ptr = [1,2,3,4,5,6,7,8,9] Ich hole aber die einzelen Blöcke: BlitzMax: [AUSKLAPPEN] pointer1:Byte Ptr = [2,3,4] Jetzt will ich den Wert von 5 haben. Wie mache ich das jetzt am besten? |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich dich richtig verstanden habe, solltest du deine Pointer in einem Array (sind in BlitzMax dynamisch) speichern.
BlitzMax: [AUSKLAPPEN] pointer:Byte Ptr[3] Dann kannst du mit einer For-Schleife das ganze Array durchgehen und schauen wo die 5 liegt. Das mit dem wesentlichen Bereich habe ich nicht ganz verstanden. Welches Programm braucht 2 GB Arbeitsspeicher (ich hab 2 GB in meinem Notebook verbaut :S ) mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, mein Beispiel war nicht so dolle. Die 5 ist nicht der Wert, sondern die Adresse. Da steht dann das, was ich wissen will. Also kann ich nicht danach suchen, es sei denn ich speicher immer noch die Adresse ab, allerdings fällt mir da auch grad kkein schneller Ansatz ein. Außerdem habe ich dann ne Menge Speicher verbraten Und bei 1000 abfragen würde das dann auch wieder zu lange dauern das ist das Problem.
Das Programm selbst braucht nicht 2 GB. Es würde nur soviel brauchen wenn es alles benutzen würde. Aber es belegt halt verschiedene Blöcke im Speicher die ungefähr 400 MB belegen. Und nur diese brauche ich letzendlich. Ich weis auch nicht warum das Programm das so macht, aber das ist halt so. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn das Programm einige Blöcke im Speicher belegt, solltest du auf den Anfang jedes Speicherblocks einen Zeiger richten. Angenommen das Programm belegt 100 Blöcke zu je 4 MB, dann richtest du auf den Anfang jedes Blocks einen Zeiger (insgesamt sind das dann 400 Byte Speicher auf einem 32 Bit System). mit dem Zeiger kannst du dann den ganzen Block durchgehen, wie ein Array.
Willst du nun in solchen Blöcken bestimmte Werte suchen? mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
hamZtaAdministrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Eisvogel hat Folgendes geschrieben: Das Programm selbst braucht nicht 2 GB. Es würde nur soviel brauchen wenn es alles benutzen würde. Aber es belegt halt verschiedene Blöcke im Speicher die ungefähr 400 MB belegen. Und nur diese brauche ich letzendlich. Ich weis auch nicht warum das Programm das so macht, aber das ist halt so.
Das kommt vom Betriebssystem. Jedes Programm bekommt 2 GB Adressraum, in dem liegen die Binaries, der Stack und eben der dynamisch allokierte Speicher (Heap). |
||
Blog. |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Thunder: Das habe ich nicht ganz verstanden. Wie soll ich für verschiedene Blöcke einen Pointer einrichten? Wichtig ist, dass ich dann mit absoluten Werten darauf zugreifen will. Wenn ich jetzt 2 Blöcke zusammenfassen würde und diese einen Abstand von 1000 Byte aufweisen, dann sind die Werte des 2. Blocks auch um 1000 Byte verschoben.Oder habe ich dich falsch verstanden? | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da hast du recht, aber ich meinte, dass du auf jedes Fragment einen Pointer richtest. | ||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und wie entscheide ich dann auf welchen Pointer ich zugreifen muss? | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde wie gesagt die Pointer in einer linkedlist speichern, aber ich weiß jetzt nicht genau, was du mit den Pointern anfangen willst, also kann ich dir nicht wirklich helfen. | ||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
ChaosCoder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du wirst wohl nicht darum herumkommen, noch mal ein paar Informationen zu deinen Pointerblöcken zu speichern.
Sind denn die Adressen in den Blöcken immer fortlaufend? Wenn ja reichen ja Informationen wie Anfangsadresse und Reichweite. Wenn du dann die Adresse x suchst, durchsuchst du das Informationsarray und schaust, ob das x irgendwo in der Reichweite eines Blocks liegt. Ich empfehle eine Binärsuche. Wenn sie nicht immer fortlaufend sind, wird das ganze schon ein wenig schwieriger. Da wäre ich für meinen Teil jetzt überfragt, wie man soetwas effizient angehen könnte. |
||
Projekte: Geolaria | aNemy
Webseite: chaosspace.de |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du bist dir schon gewusst, dass die per ReadProcessMemory gelesenen blöcke sich nicht mehr ändern, weil sie aus dem Programm herrauskopiert werden, und es somit nichts bringt, die ganzen blöcke vorzuhalten? | ||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja deswegen lese ich diese sehr oft aus. Aber das Problem ist, dass wenn ich alle meine einzelene Variablen auslesen würde, dann wäre das zu langsam. Da geht es schneller, wenn ich mehr rauskopieren und dann mir selbst das passende zusammen suche. Wie nicht warum das so ist, aber irgendwie ist dieser Befehl nicht ganz so schnell. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber so ganz verstanden hab ich dein Problem noch nicht. Hol dir doch den Block, speicher die Werte in normale Variablen, und gibt den Block wieder frei, oder halte ihn fürs nächste auslesen? | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group