Prozess anhalten (suspend/resume a process) wie SysInternals PsSuspend



  • Ich suche mich seit einigen Wochen tot, denn ich finde keine vernünftigen Ansätze, wie man ein Tool wie PsSuspend programmiert. Tatsache ist, dass es Tools gibt, die einen beliebigen Windows-Prozess anhalten und wieder fortsetzen können. Anscheinend ist die dahinter steckende Technik aber so geheim, dass niemand seinen Source Code veröffentlicht... neben PsSuspend gibt's da z.B. auch noch die Freeware ProcX oder den SysInternals Process Explorer (oder für Linux PSI).

    Was ich bislang in Erfahrung bringen konnte: Die Win32 API bietet keine Möglichkeit, einen gesamten Prozess anzuhalten bzw. fortzusetzen. Man könnte aber einen Prozess anhand seiner ID "öffnen" und über ToolHelp32 (tlhelp32.h) alle darin laufenden Threads ermitteln. Ein Thread lässt sich über die Win32 API anhalten (suspend) und fortsetzen (resume). So etwas versucht z.B. das Tool pausep. Das ist aber äußerst unsicher, weil das Ermitteln aller im Prozess laufenden Threads nur eine Momentaufnahme darstellt. Während man einen Thread anhält, könnte ein anderer dadurch beeinträchtigt werden oder es könnten in der Zwischenzeit auch neue Threads erstellt werden... Alles in allem keine saubere Lösung.

    Ich hab also weiter gesucht: Keine Programmier- oder Skriptsprache bietet die Möglichkeit, komplette Prozesse anzuhalten, außer eine: Perl. Im CPAN findet man das Modul Win32::Process, das eine Suspend() und Resume() Methode für ein Prozessobjekt zur Verfügung stellt. Leider werde ich aber aus der libwin32 von Perl nicht weiter schlau, so dass mir dort auch keine Geheimnisse offenbart werden. Vielleicht ist das aber ein Schritt in die richtige Richtung...

    Nun zu meiner Frage: Kann mir jemand weiter helfen? Ich suche wirklich schon derbe lange und es ist frustrierend, dass Freeware-Tools das mal eben so nebenbei können, aber man selbst keinen Weg sieht das technische Prinzip dahinter zu verstehen.

    Ich habe ebenso versucht an diverse Quellcodes heran zu kommen, alles bislang ohne Erfolg. Ich habe mich weiterhin bei einigen Open Source Firewalls durchgegoogelt, aber das ging eher am Thema vorbei...

    Und falls noch jemand fragt wozu ich das brauche: Ich möchte diese Funktion gern in ein kleines Tool von mir integrieren und dabei nicht auf externe Programme angewiesen sein müssen... eine mitgeliferte .exe Datei ist unnötiger Ballast, wenn's auch ohne geht. Außerdem wäre das nicht mit den Lizenzbedingungen der verfügbaren Programme vereinbar, wenn ich mein Tool auch mal weiter geben möchte.



  • Enum Threads / SuspendThread



  • Lange kannst du nicht gesucht haben... ➡ Win32 process suspend/resume tool

    greetz, Swordfish



  • Swordfish schrieb:

    Lange kannst du nicht gesucht haben... ➡ Win32 process suspend/resume tool

    greetz, Swordfish

    @Swordfish: Aber Du hast sein Post nicht genau gelesen, denn er verwies darin genau auf diese Seite und diese Tool.



  • Wusste doch dass ich da mal was bei den ntdll Exports gesehen hatte. Versuch mal das hier:

    #include <windows.h>
    
    //
    // The native functions exported from ntdll.
    //
    
    typedef LONG ( NTAPI *_NtSuspendProcess )( IN HANDLE ProcessHandle );
    typedef LONG ( NTAPI *_NtResumeProcess )( IN HANDLE ProcessHandle );
    
    int main( int argc, char* argv[] )
    {
        HANDLE ProcessHandle = 0;
        _NtSuspendProcess NtSuspendProcess = 0;
        _NtResumeProcess NtResumeProcess = 0;
    
        //
        // Make sure we have enough arguments.
        //
    
        if( 3 > argc )
        {
            printf( "ice [freeze|thaw] pid\n" );
            return 0;
    
        }
    
        //
        // Obtain our function imports.
        //
    
        NtSuspendProcess = (_NtSuspendProcess) GetProcAddress( GetModuleHandle( "ntdll" ), "NtSuspendProcess" );
    
        NtResumeProcess = (_NtResumeProcess) GetProcAddress( GetModuleHandle( "ntdll" ), "NtResumeProcess" );
    
        //
        // Attempt to open the target process.
        //
    
        ProcessHandle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, atoi( argv[2] ));
    
        //
        // Freeze or thaw the process. Note that these alter the process'
        // suspend count, so freezing the process twice will require thawing
        // the process twice to restore.
        //
    
        if( ! ProcessHandle )
        {
            printf( "Unable to open process id %d\n", atoi( argv[2] ));
        }
        else
        {
            if( ! strcmpi( argv[1], "freeze" ))
            {
                if( NtSuspendProcess )
                {
                    NtSuspendProcess( ProcessHandle );
                }
            }
            else if( ! strcmpi( argv[1], "thaw" ))
            {
                if( NtResumeProcess )
                {
                    NtResumeProcess( ProcessHandle );
                }
            }
            else
            {
                printf( "ice [freeze|thaw] pid\n" );
            }
        }
    
        if( ProcessHandle )
        {
            CloseHandle( ProcessHandle );
        }
        return 0;
    }
    

    Was genau die Funktion macht und ob das jetzt viel besser ist wie alle Threads anhalten, kann ich dir allerdings nicht sagen.

    // edit: ah aber ich sehe gerade, z.B. PsSuspend macht es genau so, von dem her wird es schon gut sein 🙂



  • simon.gysi schrieb:

    @Swordfish: Aber Du hast sein Post nicht genau gelesen, denn er verwies darin genau auf diese Seite und diese Tool.

    f*ck! (wo ist der Smiley mit dem Kopf gegen die Wand, wenn man ihn braucht?)

    @droptix: Sorry.

    greetz, Swordfish



  • Swordfish schrieb:

    (wo ist der Smiley mit dem Kopf gegen die Wand, wenn man ihn braucht?)

    Aber, aber Swordfish ... die Wand ist eines Programmierers unwürdig 👎 , wenn schon, dann mit dem Kopf auf die Tastatur 😃

    Martin



  • Die Attribute zählen: Hart und plan. 😉



  • Interessant... von der ntdll und ihrer NtSuspendProcess-Funktion hab ich bislang noch nichts gehört. Ich suche wirklich schon seit einigen Wochen und die letzten zwei ganz besonders intensiv.

    Klingt schonmal wie ausprobieren müssen 🙂 Da es eine von Windows bereit gestellte Funktion ist, gehe ich davon aus dass sie eleganter arbeitet als ein selbstgebasteltes EnumThread/SuspendThreads Tool. Danke soweit. Ich melde mich mit Neuigkeiten!


Log in to reply