Prozessspeicher einfrieren, speichern und wieder fortfahren?



  • Würde gerne mal die "von Hand" Methode ausprobieren, aber wie stelle ich das an?

    Den kompletten Prozess anhalten, den verwendet Speicher und den Context abspeichern?
    Und wie könnte ich ihn dann wieder starten, ich muss ja irgendwie einen neuen Prozess erzeugen?
    Und was passiert dann mit z.B. Handles auf geöffnete Files, sind diese danach noch korrekt?

    MfG
    yogle


  • Mod

    Da hast Du keine Chance. Die Handles stimmen nicht mehr nichts stimmt mehr...
    Wenn der Prozess stirbt werden alle Handles geschlossen, wenn Du einen neuen Prozess erzeugst sind keine Handles vorhanden. An den Speicher in dem die Handles liegen kommst Du nicht ran, geschweige denn an den Security Context.

    Vergiss es einfach, jedenfalls auf diese Methode.



  • Ich hab so etwas mal gemacht:

    1.) Einen Remote-Thread in deinem Prozess starten
    - VirtualAllocEx
    - CreateRemoteThread
    2.) Eine DLL mit dienem Code im Prozess laden
    3.) Alle Threads im Prozess suchen und anhalten:
    - CreateToolhelp32Snapshot
    - Thread32First
    - Thread32Next
    - OpenThread (erst ab Windows 2000 !!!)
    - SuspendThread
    4.) Mit VirtualQuery den Speicher auslesen und abspeichen
    5.) Die Threads wieder fortführen.
    - ResumeThread

    Es könnte auch einfacher gehen mit
    - OpenProcess
    - SuspendThread (mit Prozess Handle)
    - VirtualQueryEx
    - ResumeThread



  • ReadProcessMemory

    fehlt noch in der letzten Aufzählung



  • Martin Richter schrieb:

    Vergiss es einfach, jedenfalls auf diese Methode.

    Dann hast du doch bestimmt eine andere Idee?!

    @AZ
    Das Injizieren eigenen Codes ist genauso wie das Auslesen des Prozessspeichers kein Problem, das Problem sind die Handles auf alle möglichen Objekte,
    bzw. der Restart des Programmes.

    Was mich interessieren würde, was hast du mit dem Ausgelesenen gemacht? Du hast den Prozess aber nicht z.B. nach einem Neustart deinen Rechners
    an dieser Stelle weiterlaufen lassen können, oder?

    Für Linux/*nix gibt/gab es "chkpt". Das ist/war anscheinend eine Library bei der das Programm aktiv die Lib-Funktion aufrufen musste und das Programm
    dann nach einem Absturz o.ä. an dieser Stelle weitergeführt werden konnte. Irgendwie geht es, zumindest unter Linux.

    Und wie macht es Windows wenn es in den Ruhezustand fährt, dann müssen irgendwie auch alle Handles der Programme gespeichert werden?

    Nur her mit den Vorschlägen, bin für alles offen 😃

    MfG
    yogle



  • yogle schrieb:

    Martin Richter schrieb:

    Vergiss es einfach, jedenfalls auf diese Methode.

    Dann hast du doch bestimmt eine andere Idee?!

    Du könntest einen Kernel-Mode Treiber schreiben der das macht.
    Das Problem ist nicht der Speicher, sondern sind die Handles... und was passiert mit geöffneten Dateien? Soll der Inhalt geschrieben werden oder auch "gespeichert" werden?


  • Mod

    Diese Diskussion macht doch keinen Sinn.
    Was ist mit den Mutexen. Was ist mit den offenen Dateien. Die sind danach geschlossen und evtl. in einem anderen Zustand wenn fortgefahren wird.

    Hier gibt es so viele offene Probleme, dass es mir dabei nicht mal Spaß macht darüber zu philosophieren.



  • yogle schrieb:

    Und wie macht es Windows wenn es in den Ruhezustand fährt, dann müssen irgendwie auch alle Handles der Programme gespeichert werden?

    den status eines kompletten windoofs zu speichern ist ja auch viel einfacher. noch einfacher ist es, gleich den ganzen pc abzuspeichern (machen vmware + co. so). für einen einzelnen prozess aber gibt's dynamische datenstrukturen im kernel und in irgendwelchen hilfsprozessen (csrss z.b.). die müsste man alle einsammeln und hinterher wieder restaurieren. ich stell' mir das sehr schwierig (aber nicht unmöglich) vor...



  • Martin Richter schrieb:

    Das einfachste wäre wirklich die entsprechenden Daten eben auszustreamen. Mehr oder weniger das selbe sind ja Precompiled Headerdateien, die den Zustand des Compilers zu einem bestimmten Zeitpunkt wiedergeben.
    Aber Du bist eben selbst dafür verantwortlich.

    Martin Richter schrieb:

    Vergiss es einfach, jedenfalls auf diese Methode.

    Nochmal die selbe Frage: Hast du jetzt einen anderen Vorschlag oder nicht?

    Die gesamten? Handles eines Prozessen kann ich ja z.B. mit dem Sysinternal Process Explorer mir anschauen. Was wäre wenn man die Infos über diese Handles abspeichert und die Objekte *vor* dem fortsetzen wieder restauriert und die Handles im Programm an die neuen anpasst?

    Jochen Kalmbach schrieb:

    ...und was passiert mit geöffneten Dateien? Soll der Inhalt geschrieben werden oder auch "gespeichert" werden?

    Das ist erstmal ja auch egal, es geht nur mal ums Prinzip.

    Hier mal ein kleines Testprogramm von mir wegen der geöffneten Files:

    #include <windows.h>
    
    int main()
    {
        HANDLE      hFile        = NULL;
        DWORD       dwWritten    = 0;
    
        hFile = CreateFile( "C:\\file.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
        if( hFile == NULL )
        {
            MessageBox( NULL, "Fehler CreateFile", "Fehler", MB_OK );
            return 0;
        }
    
        if( !WriteFile( hFile, "Hallo du da!", 12, &dwWritten, NULL ))
        {
            MessageBox( NULL, "Fehler WriteFile", "Fehler", MB_OK );
            CloseHandle( hFile );
            return 0;
        }
    
        MessageBox( NULL, "Stope jetzt", "Stop", MB_OK );
    
        CloseHandle( hFile );
        return 0;
    }
    

    Wenn ich das Programm bei der MessageBox "Stope jetzt" einfach terminiere, habe ich nacher unter c: die Datei mit dem korrekten Inhalt.

    Wenn man nun auserhalb des Programmes CreateFile mit den gleichen Parametern wie oben aufruft, das Handle von WriteFile auf das aktuelle setzt dürfte das Programm doch WriteFile korrekt fortsetzen?

    net schrieb:

    für einen einzelnen prozess aber gibt's dynamische datenstrukturen im kernel und in irgendwelchen hilfsprozessen (csrss z.b.). die müsste man alle einsammeln und hinterher wieder restaurieren

    Kannst du mir sagen was das für "Datenstrukturen" sind?

    Netzwerkverbindungen lassen wir mal ausen vor, die scheinen wirklich schwierig zu sein.

    Gruß
    yogle



  • yogle schrieb:

    Kannst du mir sagen was das für "Datenstrukturen" sind?

    guckst du: http://os.inf.tu-dresden.de/Studium/AusgewaehlteBS/windows/Folien/04_Process/04_Process_4.pdf
    und:
    http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/13-Processes/Processes.pdf
    da steht alles drin über prozesse unter windosen...


Anmelden zum Antworten