Prozessabbild speichern und wiederherstellen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von STARGÅTE »

Dein Poke ersetzt den String ja nur im Buffer.
Du musst es dann noch im "echten" Speicher ersetzen mit: WriteProcessMemory_()

Allerdings gibts dann bei mir beim dritten schreiben ein Fehler, vermutlich weil ich durch das Schreiben, Laufvariablen verändere. (Ich triff mir sozusagen selbst auf die Füße)

Aber der Debugger zeuigt zumindest das er zwar "MeinTestTempText" gefunden hat, aber im Speicher aufeinmal schon "M31nT3stT3mpT3xt" steht.

Code: Alles auswählen

EnableExplicit

Procedure ManiMem(StartMemAddr, EndMemAddr, StrToFind$, StrToReplace$)
  Protected StrToFindLen = Len(StrToFind$)
  Protected hProcess
  Protected result
  Protected mbi.MEMORY_BASIC_INFORMATION
  Protected sBuffer
  Protected res
  Protected written
  Protected x
  Protected tmp$
  
  hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, GetCurrentProcessId_());
  Repeat
    result=VirtualQueryEx_(hProcess, StartMemAddr, @mbi.MEMORY_BASIC_INFORMATION, SizeOf(MEMORY_BASIC_INFORMATION))
    If mbi\State = #MEM_COMMIT And mbi\Protect <> #PAGE_READONLY And mbi\Protect <> #PAGE_EXECUTE_READ And mbi\Protect <> #PAGE_GUARD And mbi\Protect <> #PAGE_NOACCESS
      sBuffer = AllocateMemory(mbi\RegionSize)
      res = ReadProcessMemory_(hProcess, StartMemAddr, sBuffer, mbi\RegionSize, @written)
      If written > 0
        For x = 0 To written
          tmp$ = PeekS(sBuffer+x, StrToFindLen) 
          If FindString(tmp$, StrToFind$, 1)
            Debug "FOUND MATCH - " + Hex(mbi\BaseAddress+x) + "=" + tmp$
            Debug PokeS(sBuffer+x, StrToReplace$, StrToFindLen) ; <<<<<<<<<<<<<<<<<<<<< ? :D
            Debug WriteProcessMemory_(hProcess, StartMemAddr+x, sBuffer+x, StringByteLength(StrToReplace$), #Null)
          EndIf
        Next
       
      EndIf 
      FreeMemory(sBuffer)
    EndIf
    StartMemAddr = mbi\BaseAddress + mbi\RegionSize
  Until StartMemAddr >= EndMemAddr Or result = 0
EndProcedure

If OpenWindow(0, 0, 0, 300, 100, "ManiMem", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(1, 10, 10, 480, 20, "MeinTestTempText", 0)
  
  ManiMem(0, $7FFFFFFF, "MeinTestTempText", "M31nT3stT3mpT3xt")
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
FOUND MATCH - 1EE1310=MeinTestTempText
16
1
FOUND MATCH - 1EE1330=M31nT3stT3mpT3xt
16
1
FOUND MATCH - 1F247C5=M31nT3stT3mpT3xt
16
1
Das sich der Fenstertext nicht ändert, liegt vllt an eigenen Buffern von Windows, die nicht im Prozess selbst liegen?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

PMV hat geschrieben:Ihr wollt doch "nur" den jetzt Zustand in eine Datei speichern.
Das ist nichts weiter als das klassische Speichern wie z.B. bei
spielen. :wink: Um den aktuellen Stand eines Spiels zu speichern
müssen lediglich alle relevanten Variablen in die Datei geschrieben
werden und dann wieder ausgelesen werden. :wink:
Nein, möchte ich nicht. Das war nur ein Anwendungsfall. Ich möchte schon den gesamten Speicher des Prozesses speichern, damit ich nicht einzelne Variablen oder Strukturen speichern muss. Das habe ich aber oben auch schon so geschrieben glaube ich.
STARGÅTE hat geschrieben:Dein Poke ersetzt den String ja nur im Buffer.
Du musst es dann noch im "echten" Speicher ersetzen mit: WriteProcessMemory_()
Oh stimmt ja. Danke für den Hinweis. Das fehlte noch.
STARGÅTE hat geschrieben:Das sich der Fenstertext nicht ändert, liegt vllt an eigenen Buffern von Windows, die nicht im Prozess selbst liegen?
Hmm merkwürdig. Ich probiere es weiter...

Danke für deine Hilfe :)
Bild
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von X360 Andy »

Statt Prozess ... ein ganzes Systemabbild.
https://my.vmware.com/web/vmware/info/s ... dalone/5_5
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

@X360 Andy
Ernsthaft? Was nützt ihm ein fertiges Produkt? GronkhLP möchte sicherlich selber so was machen. Und außerdem sind wir hier einem Programmierforum und nicht im Offtopic Forum!
Zuletzt geändert von CodeCommander am 18.01.2015 14:34, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von X360 Andy »

Oh, ja, doch das ist mein ernst, und danke für den Hinweis.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von Sicro »

Ich habe mal kurz recherchiert und folgendes für Linux gefunden:
How to checkpoint and restore a Linux process

Unter Windows könnte man vielleicht den gesicherten Process-Speicher (Process Dump) wieder in den Arbeitsspeicher laden und ein Programm/Treiber dazwischen schalten, der die alten Adressen auf die neuen Adressen weiterleitet. So was Ähnliches wie Sandboxie, nur für den RAM.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Prozessabbild speichern und wiederherstellen

Beitrag von NicTheQuick »

Bei dem Beispiel von Stargate am Anfang sollte doch eigentlich gar kein Problem entstehen können. Normalerweise hat ein anständiges Betriebssystem eine virtuelle Speicherverwaltung. Aktuelle Hardware unterstützt das sogar hardwareseitig. Das heißt irgendwelche Pointer innerhalb eines Prozesses sind nie absolut, sondern immer in irgendeiner Weise relativ. Siehe Virtuelle Speicherverwaltung.
Weiterhin gibt zumindest Linux mir die Möglichkeit nach dem Absturz eines Programmes das komplette Speicherabbild des selbigen als Datei zu speichern um zum Beispiel im Launchpad das ganze hochzuladen, damit es irgendwer debuggen kann. Das sollte in Windows doch auch möglich sein, oder?
Trotzdem kann es natürlich weitere Probleme geben. Zum Beispiel kann der Speicher in der Grafikkarte geändert worden sein, seitdem der Prozess (bspw. ein Spiel) abgestürzt ist. Speicher, der Prozessübergreifend benutzt wurde (möglicherweise DirectX, aber auch auch stinknormale GUI-Sachen), kann sich auch geändert haben. Alle diese Speicher sind vermutlich nicht mehr in diesem Prozessabbild zu finden. Und was ist, wenn gerade eine Datei geschrieben wurde als der Prozess abstürzte? Ich denke nicht, dass man diesen Schreibvorgang einfach so wieder aufnehmen kann ohne zunächst mal dem globalen Dateisystem zu sagen, dass es die Datei auf den selben Zustand bringen soll wie er vor dem Absturz war.
Ich glaube da gibt es einfach zu viele Variablen, die berücksichtigt werden müssten. Gerade die Verbindungen zu globalen Systemen oder zu Teilen des Kernels, könnten vermutlich nicht wieder durch ein erneutes Starten eines Prozessabbildes wiederhergestellt werden.

Just my 2 cents. Aber ihr seht ja wie oft ich hier die Möglichkeitsform nutze. ;)
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

STARGÅTE hat geschrieben:Das sich der Fenstertext nicht ändert, liegt vllt an eigenen Buffern von Windows, die nicht im Prozess selbst liegen?
Nach mehreren Versuchen musste ich leider aufgeben und sehe keine andere Vorgehensweise. Anscheinend hast du mit deiner Vermutung recht. Windows legt irgendwie und irgendwo einen eigenen Speicher an während das Gadget mit CreateWindow erstellt wird. Schade. :cry:
Es hat aber trotzdem Spaß gemacht, mit Memory-Funktionen zu spielen, auch wenn ich das Ziel meines Vorhabens nicht erreicht habe. :D
X360 Andy hat geschrieben:Statt Prozess ... ein ganzes Systemabbild.
https://my.vmware.com/web/vmware/info/s ... dalone/5_5
Das ist leider nicht das was ich suche. Trotzdem danke :)
Bild
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Prozessabbild speichern und wiederherstellen

Beitrag von The_Dark_Zim-.- »

Hm hat man nicht sowieso alle Positionen, Zustände und so weiter in irgendwelchen Listen/Maps auf die man ständig zugreift?! Also für mich klingt das vorhaben deutlich komplizierter, als einfach die Listen in einer Schleife durch zu gehen und die Werte irgendwo zu speichern.
Ich denke mal der Grundgedanke war, das man sich einfach den Speicherinhalt packt und ihn dann später wieder lädt, aber wie bekommt man danach die Verbindung zu den Variablen wieder hin? Das muss doch dann auch alles wieder per Hand zugewiesen werden oder nicht?
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten