CreateRemoteThread funktioniert nicht richtig



  • Ich wollte mein Programm mit Hilfe von CreateRemoteThread in ein anderes Programm laden, das komische ist nur, dass alles im Loader richtig funktioniert und die DLL ebenfalls, doch wenn dich den Loader starte, dann wird die DLL nicht aufgerufen (DllMain wird nie betreten 😮 ). Habe es erst 2mal hinbekommen, dass es ganz kurz das Programm startet, aber es wurde sofort wieder beendet.

    Der Loader sieht so aus (Die DllMain hatte mal zum test nur eine MessageBox+ return TRUE drin, doch nichtmal das ging 😮 ):

    Die log-datei hab ich nur mal zu testzwecken reingetan.

    Die Prozess-ID hab ich mir aus dem Task Manager geholt und gehört im mom dem VC++

    Habe auch keine Programme drauf die solche "bösen" Programme blockieren und nen Testprogramm ausm Inet funktioniert auch (das lädt, aber keine dll sondern ne funktion in den anderen prozess).

    int WINAPI WinMain (IN HINSTANCE hinst, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
    {
    	char lib[] = "hookd32.dll";
    	HANDLE process = NULL;
    	HANDLE thread = NULL;
    	PSTR LibFileRemote = NULL;
    	ofstream log ("log.txt");
    
    	log << "process = ::OpenProcess (PROCESS_ALL_ACCESS, FALSE, 2076);" << endl;
    	process = ::OpenProcess (PROCESS_ALL_ACCESS, FALSE, 2076);
    	if (process == NULL)
    	{
    		log << "Open Process fehlgeschlagen" << endl;
    		MessageBox (0, "Open Process fehlgeschlagen", "info", MB_OK);
    		return 0;
    	}
    
    	log << "LibFileRemote = (PSTR)::VirtualAllocEx (process,"
    		<< "NULL, 13, MEM_COMMIT,PAGE_READWRITE);" << endl;
    	LibFileRemote = (PSTR)::VirtualAllocEx (process, NULL, 13, MEM_COMMIT,
    											PAGE_READWRITE);
    	if (LibFileRemote == NULL)
    	{	
    		log << "Virtual Alloc Ex fehlgeschlagen" << endl;
    		MessageBox (0, "Virtual Alloc Ex fehlgeschlagen", "info", MB_OK);
    		return 0;
    	}
    
    	log << "WriteProcessMemory (process, (PVOID)LibFileRemote,lib, 13, NULL)" << endl;
    	if (!::WriteProcessMemory (process, (PVOID)LibFileRemote,lib,
    							   13, NULL))
    	{
    		log << "Write Process Memory fehlgeschlagen" << endl;
    		MessageBox (0, "Write Process Memory fehlgeschlagen", "info", MB_OK);
    		return 0;
    	}
    	char buffer[128];
    	::ReadProcessMemory (process, (LPCVOID)LibFileRemote, buffer, 128, NULL);
    	log << endl << endl << buffer << endl << endl;
    
    	log << "PTHREAD_START_ROUTINE pLoadLibraryA =" 
    		<< "(PTHREAD_START_ROUTINE)::GetProcAddress ("
    		<< "::GetModuleHandle (\"kernel32\"), \"LoadLibraryA\");" << endl;
    	PTHREAD_START_ROUTINE pLoadLibraryA = 
    		(PTHREAD_START_ROUTINE)::GetProcAddress (
    									::GetModuleHandle ("kernel32"), "LoadLibraryA");
    
    	if (pLoadLibraryA == NULL)
    	{
    		log << "Load Library A konnte nicht geladen werden" << endl;
    		MessageBox (0, "Load Library A konnte nicht geladen werden", "info", MB_OK);
    		return 0;
    	}
    
    	log << "thread = ::CreateRemoteThread (process, NULL, 0, pLoadLibraryA, (PVOID)LibFileRemote, 0, NULL);" << endl;
    	thread = ::CreateRemoteThread (process, NULL, 0, pLoadLibraryA, (PVOID)LibFileRemote,
    						  0, NULL);
    
    	if (thread == NULL)
    	{
    		log << "Create Remote Thread fehlgeschlagen" << endl; 
    		MessageBox (0, "Create Remote Thread fehlgeschlagen", "info", MB_OK);
    		return 0;
    	}
    
    	HMODULE libr = LoadLibrary ("sensui32.dll");
    
    	log << "::CloseHandle (thread);" << endl;
    	::CloseHandle (thread);
    	log << "::CloseHandle (process);" << endl;
    	::CloseHandle (process);
    
    return 0;
    


  • Öhm,der Prozess hat bei jedem Start ne andere ID 😉 .
    Hast du das ganze mal im Debugger nachvollzogen?
    Und vor allem was für ein Betriebssystem hast du eigentlich?
    Unter 98/ME besitzt CreateREmoteThread keine Implementierung und gibt immer NULL zurück.
    Abgesehen davon funktioniert das bei denen auch nicht weil der Adressraum anders aufgebaut ist.
    Ein wesentlicher Bestandteil dieser Technik ist die Tatsache das die System Dll´s immer an die gleiche Adresse geladen werden.Ansonsten könnte man CreateRemoteThread nicht die Adresse von LoadLibrary übergeben...

    MfG Spacelord



  • Ich benutze Windows2000 SP4 und ich sagte doch oben, dass ich die PID einfach ausm Taskmanager ausgelesen habe, die ändert sich ja während der Prozess läuft nicht und ich hab natürlich immer eine gültige verwendet (auch verschiedene Versucht).

    Nein den Debugger habe ich noch nicht eingesetzt.



  • Ich denke das Problem liegt bei der Zeichenkette die du als Dll Namen "übergibst" der Code sieht soweit ok aus aber die länge des Strings solltest du besser mit strlen ermitteln.
    Und probier mal die Endung .dll wegzulassen.

    MfG Spacelord



  • hookd32.dll - wenn du den Namen ohne Pfad angibst setz das vorraus, dass die Dll sich in dem Dll-Such-Pfad der remote Anwendung befindet. Sprich standardmaßig in C:\WINNT;C:\WINNT\system,C:\WINNT\system32 bzw. C:\WINDOWS;C:\WINDOWS\system,C:\WINDOWS\system32 oder der im momentanen Pfad der Anwendung.

    bevor du CloseHandle( thread ) aufrufst für mal das noch aus:

    DWORD nExitCode
    GetExitCodeThread( thread, &ExitCode );
    

    dann kannst schauen ob LoadLibraryA NULL zurück gibt



  • Danke das mit dem Pfad ist es, jetzt klappt es 🙂

    Ich könnt euch knutschen 😃



  • Aussenstehender schrieb:

    Danke das mit dem Pfad ist es, jetzt klappt es 🙂

    Ich könnt euch knutschen 😃

    @Aussenstehender: post mal deinen code, würd mich interessieren wie du das nun gelöst hast...mit loader usw...

    cu


Anmelden zum Antworten