Seite 2 von 2

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 00:46
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?

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 09:06
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 :)

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 19:41
von X360 Andy
Statt Prozess ... ein ganzes Systemabbild.
https://my.vmware.com/web/vmware/info/s ... dalone/5_5

Verfasst: 28.08.2014 19:55
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!

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 20:00
von X360 Andy
Oh, ja, doch das ist mein ernst, und danke für den Hinweis.

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 22:54
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.

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 28.08.2014 23:28
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. ;)

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 29.08.2014 17:03
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 :)

Re: Prozessabbild speichern und wiederherstellen

Verfasst: 11.09.2014 20:27
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?