Direkt auf Speicher eines anderen Prozesses zugreifen?
-
Hallo Leute!
Ich habe ein Programm geschrieben, das über ReadProcessMemory und WriteProcessMemory den Speicher eines anderen Prozesses ausliest bzw darin schreibt. Soweit so gut, funktioniert alles. Allerdings würde ich gerne den Zeiger, den ich den Funktionen übergebe, innerhalb meines Programms dereferenzieren können. Das geht ja grundsätzlich nicht, weil mir der Speicherbereich ja nicht gehört. Kann man da irgendwas mit WinAPI machen?
Grüße,
Der Kellerautomat
-
Da hast du wohl keine andere Möglichkeit als Dll Injection.
-
Ich glaube nicht, dass das ist, was ich möchte.
Hier etwas mehr Kontext:
Ich habe eine kleine mini-API geschrieben, die es mir vereinfacht, auf Werte hinter multi-level-Pointern zuzugreifen. Gestern habe ich nämlich erfolgreich meinen ersten Spiele-Trainer geschrieben, der bei AoE 2 die Resourcen-Werte bearbeiten kann. Für einen Neueinsteiger in der Materie ein großer Erfolg.Nun gibt es in meiner API eine Klasse process_ptr, die einen Zeiger auf einen Speicherbereich im anderen Prozess darstellt. Beim operator * wird ein Proxy-Objekt zurückgegeben, dass ReadProcessMemory im operator T() und WriteProcessMemory im operator = ausführt. Allerdings kann ich damit nicht den operator -> überladen, womit ich keine structs haben kann. Nur dazu brauche ich das im Prinzip.
Grüße,
Der Kellerautomat
-
Warum willst du den Zeiger dereferenzieren? Das hört sich jetzt eigentlich nur nach Bequemlichkeit an. Du kannst die Daten ja auch in deinen Prozess rüberkopieren.
Ansonsten könntest du Speicherbereiche aus dem anderen Prozess in deinen Adressraum einblenden. Allerdings dürften sie in deinem Adressraum dann eine andere Adresse haben, was dir widerum nichts bringt.
-
Mechanics schrieb:
Warum willst du den Zeiger dereferenzieren? Das hört sich jetzt eigentlich nur nach Bequemlichkeit an.
Exakt.
Mechanics schrieb:
Du kannst die Daten ja auch in deinen Prozess rüberkopieren.
Dann müsste ich andauernd checken, ob sie aktuell sind.
Mechanics schrieb:
Ansonsten könntest du Speicherbereiche aus dem anderen Prozess in deinen Adressraum einblenden.
Genau sowas meinte ich.
Mechanics schrieb:
Allerdings dürften sie in deinem Adressraum dann eine andere Adresse haben
Solange ich einen Zeiger darauf bekomme, ist mir das egal.
Mechanics schrieb:
, was dir widerum nichts bringt.
Weil?
-
Du könntest den Zeiger nicht direkt derefenzieren, weil du einen anderen Zeiger hättest, also müsstest du wieder umrechnen und es wär vorbei mit der Bequemlichkeit
Ich bin mir nicht sicher, ob man bereits verwendeten Speicher von einem anderen Prozess in den eigenen Prozess einblenden kann. Das ist jetzt mehr Theorie. Ich glaube, direkt wird sowas sehr wahrscheinlich nicht unterstützt. Ich könnte mir vorstellen, dass man das für Memory Mapped Files Mechanismus hinfaken könnte. Dann müsstest du wahrscheinlich auch Code in den fremnden Prozess injzieren, der entsprechenden Code aufruft. Ist wohl nicht ganz nicht trivial. Und obs geht, weiß ich nicht, ist rein spekulativ.
-
Es ist eigentlich relativ egal, ob man was herumrechnen muss, oder nicht, solange ich einen Zeiger in den eigenen Adressraum habe. Es geht um Bequemlichkeit in der API, nicht in der Implementierung.