Runtime-Prozessspeicher-Patch zum Wiederherstellen des Status

8

Ich suche nach einer Methode, um den Prozessspeicher zu speichern und später unter bestimmten Bedingungen wiederherzustellen.

...

Eigentlich habe ich Fragen dazu gelesen ... Es scheint eine große Herausforderung zu sein!

Also, lasst uns analysieren: Die Anwendung ist eine verteilte, aber viele Prozesse sind zustandslos (fordern ihren Status auf einem zentralisierten Server an). Processes nutzt Netzwerkverbindungen und Shared Memory für die Kommunikation mit anderen Prozessen.

Der zentrale Server soll seinen Zustand speichern, indem er seinen Prozessspeicher ablegt, der später unter bestimmten Bedingungen wiederhergestellt werden soll. (1)

Ich kenne ReadProcessMemory und WriteProcessMemory Funktionen, die es dem Prozess erlauben, sich selbst zu lesen und bereits zugewiesenen Speicher zu überschreiben, oder? Also, was ich brauche, ist Adresse, wo ich anfangen zu lesen / schreiben, und die Anzahl der Bytes zum Lesen / Schreiben. Also ... welche Adressen ? Viel Code, den ich gelesen habe, benutzt die Adresse, die von VirtualAlloc zurückgegeben wird, aber ich weiß nicht, ob das für mich nützlich sein könnte.

Ich nehme an, dass sich die ausführbaren Prozesssegmente nicht ändern, also brauchen sie nicht rot / geschrieben. Zur Wiederherstellungszeit könnte ich auch davon ausgehen, dass alle Prozessthreads in der gleichen Ausführungsposition sind, wenn der Speicher vom Hauptthread gelesen wurde.

Es bleibt der Stapelspeicher und der Heap-Speicher, was die Speichersegmente sind, an denen ich interessiert bin.

Ist es möglich?

(1) Es ist vollkommen legal zu fragen, warum ich das versuche. Der Grund ist ... wie immer kompliziert. Nehmen wir jedoch an, dass die Anwendung einen sehr komplizierten Zustand hat, der einen zu komplexen Algorithmus zur Zustandsspeicherung erfordert. Die andere Alternative (die Gegenstand der Analyse ist) ist die Implementierung eines Logger / Replay-Mechanismus, der in der Lage ist, jedes Ereignis zu reproduzieren, das zum modifizierten Zustand beigetragen hat.

Es kam mir in den Sinn, malloc &Ampere; co. haken . So kann ich den vom Prozess zugewiesenen Speicher verfolgen. Aber tatsächlich bemerkte ich die _CrtMemState Struktur, aber ich nicht bekannt, ob es für mich nützlich sein könnte.

    
Luca 22.07.2010, 21:18
quelle

2 Antworten

8

ReadProcessMemory dient zum Lesen des Speichers von anderem -Prozess. Innerhalb eines Prozesses ist es unnötig - Sie können einfach einen Zeiger dereferenzieren, um Speicher innerhalb desselben Prozesses zu lesen.

Um die Speicherblöcke in einem Prozess zu finden, können Sie VirtualQuery verwenden. Jeder Block wird mit einem Status, Typ, Größe usw. versehen. Hier ist ein Code, den ich vor Jahren geschrieben habe, um die Blockliste für einen bestimmten Prozess zu durchlaufen (mit VirtualQueryEx ). Sie verwenden VirtualQuery ziemlich genau so, außer dass Sie keinen Prozess angeben müssen, da dieser Prozess immer ausgeführt wird.

%Vor%     
Jerry Coffin 22.07.2010, 21:34
quelle
1

Der Prozessspeicher repräsentiert nicht den gesamten Prozesszustand. Das Betriebssystem wird Objekte im Namen Ihres Prozesses (z. B. Dateihandles, Synchronisierungsobjekte usw.) an Orten wie nicht ausgelagerten Pool halten, die außerhalb des Bereichs Ihres Prozesses liegen.

Ich denke, Sie sollten besser refactoring, bis Sie den relevanten Zustand mit einem überschaubaren Aufwand serialisieren und deserialisieren können.

    
Adrian McCarthy 22.07.2010 22:14
quelle

Tags und Links