Specherbruchteile verwalten

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Specherbruchteile verwalten

BeitragSo, Jun 13, 2010 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 13, 2010 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
Local p1:Byte Ptr=MemAlloc(6)
p1[0]=Asc("H")
p1[1]=Asc("a")
p1[2]=Asc("l")
p1[3]=Asc("l")
p1[4]=Asc("o")
p1[5]=0
Local p2:Byte Ptr=MemAlloc(6)
Local p3:Byte Ptr=p1,i%
For i=0 To 5
p2[i]=p3[i]
Next
For i=0 To 5
WriteStdout Chr(p3[i])
Next
WriteStdout "~n"
End


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

BeitragSo, Jun 13, 2010 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
pointer:Byte Ptr = [1,2,3,4,5,6,7,8,9]


Ich hole aber die einzelen Blöcke:
BlitzMax:
pointer1:Byte Ptr = [2,3,4]
pointer2:Byte Ptr = [5,6]
pointer3:Byte Ptr = [8,9]


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

BeitragMo, Jun 14, 2010 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich dich richtig verstanden habe, solltest du deine Pointer in einem Array (sind in BlitzMax dynamisch) speichern.

BlitzMax:
pointer:Byte Ptr[3]
pointer[0] = [2,3,4]
pointer[1] = [5,6]
pointer[2] = [8,9]


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

BeitragMo, Jun 14, 2010 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 15, 2010 8:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hamZta

Administrator

BeitragDi, Jun 15, 2010 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 15, 2010 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Jun 15, 2010 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 15, 2010 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 16, 2010 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 16, 2010 8:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 16, 2010 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 16, 2010 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 16, 2010 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group