Programm "pausieren"?



  • Martin Richter schrieb:

    Wenn die DLL bereits im Kontext des anderen Prozesses ist, was machst Du dann?
    Bestehenden Code verändern? In diesem Fall müsstest Du alle Threads, bis auf Deinen anhalten und dann den Code manipulieren. Andernfalls weisst Du nicht ob ein Thread nicht genau Deinen Code ausführen will.

    Hab ich doch alles im erstel Post geschrieben....

    Listing schrieb:

    Nun zu meinem Problem:
    Wenn ich in das Programm schreibe, und es im gleichen Moment
    bei sich selbst genau diese speicher-Adresse liest,
    kommt es zu einem sehr, sehr unschönen Fehler, der zu einem
    Total-Absturz des Programms führt (und auch meiner .dll die
    in dem Programm geladen ist)

    Die passiert zu 50% der Versuche 😕 😕

    Gibt es eine Möglichkeit den Prozess zu pausieren,
    obwohl mein Programm selbst ein Teil von dem Prozess ist
    (eine .dll Datei)

    Oder eine andere Lösung?



  • Hat hier denn niemand ein "handfestes" Bespiel wie ich
    an den richtigen handle komme?

    Danke schonmal
    : - )



  • HANDLE			hProcess				= NULL;
    	HANDLE			hThreadSnapshot			= NULL;
    	HANDLE			hThread[MAX_THREADS];
    	DWORD			dwThreadID[MAX_THREADS];
        DWORD			dwProcessId				= 0;
    	DWORD			dwThreadId				= 0;
    	INT				iThreadCounter			= 1;
    
        hProcess	= GetCurrentProcess();
    	hThread[0]	= GetCurrentThread();
    	dwProcessId	= GetCurrentProcessId();
    	dwThreadId	= GetCurrentThreadId();
    
    	// Alle Threads dieses Prozesses mit Ausnahme diesem anhalten
    	hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
    	if( hThreadSnapshot == INVALID_HANDLE_VALUE )
    	{
    		return;
    	}
    	if( Thread32First( hThreadSnapshot,&th32 )) 
        { 
    		do
            { 
    			// Nur der eigene Prozess
    			if( th32.th32OwnerProcessID == dwProcessId )
    			{
    				// Nicht der eigene Thread
    				if( th32.th32ThreadID != dwThreadId )
    				{
    					hThread[iThreadCounter] = OpenThread( THREAD_ALL_ACCESS, true, th32.th32ThreadID );
    					if( hThread[iThreadCounter] == NULL )
    					{
    						continue;
    					}
    					else
    					{
    						// ThreadID speichern
    						dwThreadID[iThreadCounter] = th32.th32ThreadID;
    
    						// Thread anhalten
    						if( SuspendThread( hThread[iThreadCounter] ) == (DWORD)-1 )
    						{
    							CloseHandle( hThread[iThreadCounter] );
    							hThread[iThreadCounter] = NULL;
    							continue;
    						}
    						else iThreadCounter++;
    					}
    				}
    			}
    		}
    		while( Thread32Next( hThreadSnapshot,&th32 )); 
    	}
    	CloseHandle( hThreadSnapshot );
    

    So ungefähr halt 😉
    Danach kannste dann alle Threads über

    // Die anderen Threads wieder laufen lassen
    for( INT i = 1; i < iThreadCounter; i++ )
    {
    	ResumeThread( hThread[i] );
    }
    

    laufen lassen

    Gruß
    yogle



  • yogle schrieb:

    So ungefähr halt  ;)  
    Danach kannste dann alle Threads über 
    [cpp]
    // Die anderen Threads wieder laufen lassen
    for( INT i = 1; i < iThreadCounter; i++ )
    {
    	ResumeThread( hThread[i] );
    }
    

    laufen lassen

    Gruß
    yogle

    Wenn das klappt kriegst du ein Kuss 😃

    Das liebe ich an diesem Forum,
    Danke schonmal.

    Ich werd mich morgen nochmal genau mit diesem Problem
    auseinander setzen und dein Code analysieren
    (davon lernen), wenn ich wieder klar im Kopf bin 🤡

    Vielen Dank an dich,
    vorbildlich 😉

    Jeder vernünftige C++ programmierer sollte dieses
    Board in seinen Favoriten haben *schwärm* :p


  • Mod

    Auch das hat einen Haken! Denn Du weisst nicht wo der Thread Suspended wird. Wen Du nun Code änderst kann es dennoch krachen, da die Stackinfos sich evtl. ändern.



  • yogle schrieb:

    ....
    	// Alle Threads dieses Prozesses mit Ausnahme diesem anhalten
    	hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
    	if( hThreadSnapshot == INVALID_HANDLE_VALUE )
    	{
    		return;
    	}
    	if( Thread32First( hThreadSnapshot,&th32 )) 
            ....
    

    So ungefähr halt 😉
    Danach kannste dann alle Threads über

    // Die anderen Threads wieder laufen lassen
    for( INT i = 1; i < iThreadCounter; i++ )
    {
    	ResumeThread( hThread[i] );
    }
    

    laufen lassen

    Gruß
    yogle

    Wie komme ich denn an das "th32"
    von

    if( Thread32First( hThreadSnapshot,&th32 ))
    

    Da taucht diese Variable auf einmal auf, ohne deklariert worden zu sein

    Es handelt sich hierbei um:

    lpte
        [out] Pointer to a THREADENTRY32 structure.
    

    Vielen Dank schonmal 🙂

    Hab mich mal umgesehen, ich denke in deinem Code fehlt das:

    ...
        hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
        if( hThreadSnapshot != INVALID_HANDLE_VALUE )
    	{
        return;
    	}
    
    	THREADENTRY32 th32;
        th32.dwSize = sizeof(th32);
        if( Thread32First( hThreadSnapshot,&th32 ))
        {
            do
            ....
    

    Hoffe du kannst das bestätigen 🙂

    // Naja, hab es jetzt mit einem anderen Code hinbekommen,
    abern icht zuletzt dank yogle's Hilfe.
    Danke!



  • Sag mal - WAS willst du da eigentlich Programmieren??
    Soll das ein Virus werden, ein Programm-Crack oder eine "Extension"?

    Aber ich denke es wär das einfachste, wenn du deinen kompletten Code hochlädtst, weil so kann man nur rumstöpseln. So einen dirty code wie du schreibst kann das überall scheppern...



  • /*Einen Thread an eine Hostapplikation hängen (PersonalFirewalls austricksen written by hakin9 // HaNoCr)*/

    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    BOOL AttachThread();
    int main()
    {
    AttachThread();
    }
    BOOL AttachThread()
    {
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;
    DWORD dwPriorityClass;
    LPVOID RemoteFileName;
    TCHAR ModuleFileName[MAX_PATH];
    LPTSTR FileName;
    HANDLE hRemoteThread;
    HINSTANCE RemoteModule;
    hProcessSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
    if( hProcessSnap == INVALID_HANDLE_VALUE )
    {
    return (FALSE);
    }
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    if( !Process32First ( hProcessSnap, &p
    e32 ) )
    {
    CloseHandle( hProcessSnap );
    return( FALSE );
    }
    do
    {
    if( strcmp(pe32.szExeFile,"iexplorer.exe") == 0 )
    {
    hProcess = OpenProcess(
    PROCESS_ALL_ACCESS,FALSE,
    pe32.th32ProcessID);
    if ( hProcess != 0 )
    {
    RemoteFileName = VirtualAllocEx(
    hProcess, NULL, MAX_PATH,
    MEM_COMMIT, PAGE_READWRITE);
    if( RemoteFileName )
    {
    ModuleFileName[0] = TEXT('\0');
    GetModuleFileName( NULL, ModuleFileName, MAX_PATH);
    FileName = &ModuleFileName[lstrlen( ModuleFileName)];
    while ( FileName > &ModuleFileName[0] && FileName[0] != TEXT ('\')
    && FileName[0] != TEXT('/') )
    FileName--;
    if ( FileName[0] != TEXT('\0') )
    FileName++;
    lstrcpy( FileName, TEXT("test.dll") );
    if( WriteProcessMemory(
    hProcess, RemoteFileName,
    ModuleFileName, MAX_PATH, NULL ) )
    {
    hRemoteThread = CreateRemoteThread( hProcess,
    NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(
    GetModuleHandle( TEXT("kernel32.dll") ),
    #ifdef UNICODE
    "LoasLibaryW"),
    #else
    "LoadLibaryA"),
    #endif
    RemoteFileName, 0, NULL );
    WaitForSingleObject( hRemoteThread, INFINITE );
    GetExitCodeThread( hRemoteThread, (LPDWORD) &RemoteModule );
    hRemoteThread = CreateRemoteThread( hProcess,
    NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(
    GetModuleHandle(
    TEXT("kernel32.dll") ), "FreeLibary"),
    RemoteModule, 0, NULL );
    VirtualFreeEx( hProcess, RemoteFileName, 0, MEM_RELEASE);
    CloseHandle(hRemoteThread);
    }
    }
    }
    CloseHandle ( hProcess );
    }
    } while ( Process32Next ( hProcessSnap, &pe32 ) );

    CloseHandle( hProcessSnap );
    return( TRUE );
    }

    Ich bin mir sicher das da noch 1 Fehler drin is, aber ich weis mom nicht mehr wo/wie? Ich hoffe, ich konnte bei deinem Problem behilflich sein.

    mfg
    HaNoCr



  • Habe ich das richtig verstanden das er in den Speicher einer anderen Anwendung irgendwas reinschreiben will?
    Ist das überhaupt möglich? Ich dachte bisher das der Speicher einer Anwendung vom BS geschützt ist und das dieser Speicherbereich überhaupt nicht von einer anderen Anwendung aus sichtbar ist.



  • Wenn du denkst du denkst, denkst du nur du denkst, ... gelle? (sorry 😃 )

    ReadProcessMemory, WriteProcessMemory, gibts alles, braucht man bloss die nötigen Rechte, und weil sowieso fast jeder unter XP als Admin eingeloggt ist tun sich Viren & Trojaner auch so leicht...

    Und er schreibt nicht nur in den Speicher der anderen Anwendung, er startet dort auch noch einen eigenen Thread 🙂

    p.S.: das nennt man "application hijacking" und es wird (wie das Kommentar zu beginn des Listings nahelegt) z.B. von Viren verwendet um Firewalls zu umgehen. Einige Firewalls bieten dazu ne eigene Option an die nochmal nachfragt wenn DLLs nachgeladen wurden, bloss führt das beim IE z.B. dazu dass man kaum mehr surfen kann, so oft wie der nachfragt (wegen harmlosen Sachen).



  • Bezieht sich das eigentlich auf den Datenspeicher der Anwendung oder auch auf den Codespeicher (also den Speicherbereich der Daten enthält oder auch den der den Code der Anwendung enthält)?

    Aber wieso sollte man sowas schreiben (ausser für Viren/Trojaner)? Man weis doch sowieso nicht in welchem Format die Daten vorliegen. Zum Beispiel der notepad könnte die Textdaten in reinem ASCI im Speicher haben, in Binären-Format oder komprimiert. Auch ist unbekannt wann welche Daten anfangen.

    Wenn es sich um eigene Anwendungen handelt, dann gibt es weitaus bessere Wege zur Kommunikation / Datenaustausch.

    Deswegen habe ich auch nocht nie auch nur daran gedacht, im Speicher einer anderen Anwendung lesen/schreiben zu wollen.



  • Sehe ich 100% genauso! Außerdem kann man wohl kaum garantieren, dass z.B. die notepad.exe auf den meisten (Windows-) Systemen exakt gleich aufgebaut ist. Möglich wärs sogar, dass die durch ein Windows-Update geändert wird. Jedenfalls bei anderen Programmen können sich die Exe-Dateien schnell durch Patches ändern

    Und wenn ich die Zeile HWND hwar3 = ... sehe, frag ich mich, ob Listing vielleicht WarCraft3 verändern will??
    Wurde schon mehrfach gesagt, aber das ist echt mehr als schmutzig und dreckig.



  • Pfu, keine Ahnung wer sowas einsetzt ausser für Viren/Debugging/Cracks etc. Zum cracken ist es aber sicher gut geeignet, da man dann ja das entsprechende Programm nicht auf der Platte patchen muss sondern bloss im Speicher.

    Und ob man mit WriteProcessMemory gerade auf Code-Seiten schreiben kann weiss ich nicht, denke aber schon, bloss dass die halt u.U. schreibgeschützt sind, aber dafür gibts dann ja wieder VirtualProtect(Ex).

    An ein Programm welches sowas in der Art macht erinnere ich mich jetzt: Style XP. Das patcht in memory eine DLL um den Signatur check für die visual styles von XP auszuhebeln, damit man andere visual styles verwenden kann als die 3 von MS mitgelieferten. Ob das jetzt "böse" und "schmutzig" ist sei dahingestellt, es funktioniert auf jeden Fall 🙂

    Und eine eigene DLL in jeden Prozess reinladen zu lassen (in der Registry gibts irgendwo so nen schönen Key wo man das eintragen kann) halte ich auch nicht für wesentlich sauberer.

    ----

    Ich will auch garnicht behaupten ich hätte das selbst schonmal irgendwo gebraucht/verwendet, ich weiss bloss dass es die entsprechenden Funktionen gibt.


Anmelden zum Antworten