Pointer auf Speicherzellen erstellen
-
Hallo liebe C++-Community.
Das letzte Mal meldete ich mich mit der Frage, wie man den Speicherbereich eines fremden Prozesses auslesen/verändern kann und bekam recht zeitig gute Antworten und konnte darauf hin ein solches Programm realisieren.
Diente dieses Programm rein zu didaktischen Zwecken, habe ich das Projekt vor kurzem wieder aufgenommen und bin bei der Implementierung auf ein kleines Problem gestoßen, auf welches ich theoretisch wie praktisch keine Lösung gefunden habe.Und zwar geht es darum, den Inhalt einer Speicherzelle eines fremden Prozesses anzuzeigen, auf das eine andere Speicherzelle zeigt.
Im Grunde ein Pointer auf einen tatsächlichen Wert.In C++ würde man nun hergehen und einen Pointer auf die Variable setzen, welche den Wert enthält - dies ist jedoch nicht möglich, wenn die Adresse des Pointer auf einen anderen Speicherbreich außerhalb des eigenen zeigt.
Nun gibt es bekannte Programme wie z.B. CheatEngine, in welchem man komfortabel einen Pointer einfügen und in der Liste dann den Wert in "Echtzeit" angezeigt bekommt - ändert sich der Wert der Variable, ändert sich auch automatisch der des Pointers, welches in der Liste zu sehen ist.
Um ein ähnliches Verhalten nun mit meinem Programm zu realisieren, müsste ich ständig den Wert der Speicherzelle auslesen (ReadProcessMemory), auf das der Pointer zeigt, um etwaige Veränderungen festzustellen.
Da dies in einer Kombination aus Endlosschleife und Thread sehr Aufwendig für ein solches Problem erscheint, habe ich auch erst garnicht die Initiative ergriffen und ein solches Vorgehen ausprobiert.Um das Problem noch näher zu erörtern, hier ein kleines Beispiel:
- Mein Programm liest eine (1)Speicherzelle (4Byte) ein - der Wert ist ein Pointer und zeigt auf eine andere (2)Speicherzelle
- Um in einer Liste (GUI) oder generell im Code immer den aktuellen Wert der Speicherzelle(2) zu haben, lese ich nun mit ReadProcessMemory den Inhalt
- Sobald sich nun der Wert von Speicherzelle(2) verändert hat, möchte ich diese Veränderung angewandt haben, sprich der Wert, auf den Speicherzelle(1) zeigt, muss intern (anzeigen in der Liste oder Rückgabe für eine Variable) aktualisiert werden
Hierzu möchte ich natürlich nur auf Speicherzelle(1) (also auf den Pointer) zugreifen, um eventuell den Wert von Speicherzelle(2) zu ändern oder abzulesen.
Dies is insofern wichtig, da ich mit meinem Programm andere Prozesse "auslesen" möchte, dessen Variablen-Wert ich erst durch mehrfache "Verpointerung" bekomme.
Aus diesem Grund ist es sehr wahrscheinlich, dass sich die Werte der (Zwischen)Pointer ändern - greife ich hier nicht auf den ersten Pointer zu und bekomme ich nicht die Änderung der Werte der anderen Pointer mit, lande ich nicht mehr bei der Speicherzelle, die ich ja anfangs gefunden hatte.Also brauche ich eine Methode, wie ich mit (hoffentlich) wenig Auslastung einen C++-Pointer auf Speicherzellen anderer Speicherbereiche setzen oder auf Wert-Änderungen der Speicherzellen reagieren kann.
Falls an der hier aufgeführten Problematik noch Fragen offen sind oder praktische Beispiele genannt werden sollen, bin ich gerne bereit, solche bereit zu stellen.
MfG,
fakerlol
-
Warum ist das zu aufwendig?
Warum sollte das schlecht sein?
Was heißt bei dir "wenig Auslastung"? Wenig Auslastung der CPU oder des Programmierers (aka Faulheit)?
Woher weißt du, dass es eine schlechte Performance bringt, wenn du es nicht einmal ausprobiert hast?
-
Das mit dem Auslesen ist so schon okay. Nur solltest du nicht jedesmal ReadProcessMemory() aufrufen... das dauert nämlich definitiv zu lange.
Falls alle Programme von dir sind:
Boost::InterprocessFalls nicht:
Setze für jedes Programm, dessen Speicher du auslesen/manipulieren möchtest, die Prozessflags auf DEBUG. Damit erhältst du vollen Zugriff, sprich du kannst einfach einen Zeiger auf die Speicheradresse anlegen und einfach dereferenzieren.Ich hoffe ich habe deinen Post richtig verstanden... :xmas1:
-
Blubb schrieb:
Warum ist das zu aufwendig?
Warum sollte das schlecht sein?
Was heißt bei dir "wenig Auslastung"? Wenig Auslastung der CPU oder des Programmierers (aka Faulheit)?
Woher weißt du, dass es eine schlechte Performance bringt, wenn du es nicht einmal ausprobiert hast?Sowas musste ja kommen...
"wenig Auslastung" heißt natürlich wenig Auslastung der CPU und ich weiß das es eine schlechte Performance bringt weil ich es ja ausprobiert habe...@Kóyaánasqatsi
Das klingt interessant, mit den Prozessflags; muss ich die beim Festlegen des Handles setzen oder später mit einer seperaten Methode?
Ich kann mir leider nicht vorstellen wo ich da ansetzen muss, habe ich doch schon öfter von den Prozessflags gelesen...