DllInjection => Prozess hängt



  • Hi,

    ich hab wieder mal ein Problem 😉

    Wenn ich mit folgendem Code eine DLL in einen Laufenden Prozess injecte hängt
    sich dieser immer auf 😕

    Leider hab ich keine Ahnung an was das liegen könnte und darum
    poste ich ihn mal hier,vielleicht hat ja jemand einen Tipp?!

    Schon mal vielen Dank,
    Xalon

    int InjectDll(HANDLE hProcess,char* dll_to_inject)
    {
     LPVOID VirtualMem;
     LPTHREAD_START_ROUTINE ThreadAddr = 0;
     HMODULE KernelModul;
     DWORD rw = 0; 
    
     VirtualMem = VirtualAllocEx(hProcess,NULL,strlen(dll_to_inject),MEM_COMMIT,PAGE_READWRITE);
     if(!VirtualMem)      
      return -1;
    
     KernelModul = GetModuleHandle("Kernel32");
     if(!KernelModul)      
      return -1;
    
     ThreadAddr = (LPTHREAD_START_ROUTINE) GetProcAddress(KernelModul,"LoadLibraryA");
     if(!ThreadAddr)      
       return -1;
    
     if(!WriteProcessMemory(hProcess,VirtualMem,(LPVOID)dll_to_inject,strlen(dll_to_inject),&rw))
       return -1;
    
     if(!CreateRemoteThread(hProcess,NULL,0,ThreadAddr,VirtualMem,0,NULL))
       return -1;
    
     CloseHandle(hProcess);
     return 0;
    }
    


  • - gibst du den vollen DLL-Pfad an? Das Programm, in das du sie injizierst, hat u.U. andere Umgebungsvariablen und höchstwahrscheinlich ein anderes aktuelles Verzeichnis
    - warum gibst du den mit VirtualAlloc angeforderten Speicher nicht mehr frei?
    - wenn du die Anzahl der geschriebenen Bytes bei WriteProcessMemory (letzter Parameter) nicht benötigst, kannst du auch NULL übergeben
    - auch das von CreateRemoteThread zurückgegebene Handle will geschlossen werden



  • Danke für die Antwort 🙂
    Ja der Name ist Absolut und die DLL wird auch richtig geladen.

    Hier der neue Code

    thread = CreateRemoteThread(hProcess,NULL,0,ThreadAddr,VirtualMem,0,NULL);
    
     if(!thread)
       return -1;
    
     // WaitForSingleObject(thread,INFINITE);  <== kommt irgendwie nie zum ende o_O
    
     VirtualFreeEx(hProcess,VirtualMem,0,MEM_RELEASE);
     CloseHandle(thread); 
     CloseHandle(hProcess);
    
     return 0;
    }
    

    Wenn ich das WaitForSingleObject rauslass kommt gleich "bla.exe hat ein Problem festgestellt und muss beendet werden , wollen sie einen Problembericht an MS senden..."
    Lass ich es drinnen dann hängt das ganze irgendwie wieder 😮

    Schon mal vielen Dank für alle Antworten 🙂
    Xalon


  • Mod

    Dein String ist nicht '\0' terminiert. Du musst mindestens strlen()+1 reservieren und kopieren!



  • Vielen Dank aber auch das hilft leider nichts 😞
    Außerdem wird die DLL an sich ja geladen ?!

    Xalon



  • Prüfe mal was die "dll_to_inject" im "DllEntryPoint" so alles macht. Nicht alles ist dort erlaubt.



  • Also meine TestDLL gibt nur ne MessageBox aus,da sollte eigentlich alles passen 🙂

    Xalon

    P.S:Vielen Dank für all die Antworten 🙂



  • Kommentiere die Ausgabe der MessageBox mal aus und prüfe, ob der Remoteprozess dann immer noch hängenbleibt.



  • Nein er läuft weiter wie ne eins wenn er nix machen muss 🙂
    Aber was sagt mir das?

    Vielen Dank,
    Xalon



  • Entweder ist Aufruf von MessageBox fehlerhaft (z.B. falsche, ungültige Stringadressen).
    Probier mal den einfachsten aller Aufrufe :

    MessageBox (0,"text","caption",0);
    

    Oder der Remoteprozess darf nicht z.B. durch eine MessageBox unterbrochen werden.
    Probier mal ob jeder Remoteprozess hängenbleibt.

    ...oder der Remoteprozess hat "USER32" nicht geladen.
    Dann gibt es eben keine MessageBox im Remoteprozess. 🙂



  • Leider alles schon geschehen 😕
    Ich benutz so einen einfachen Aufruf und die MessageBox poppt auch auf nur der
    RemoteProcess (und zwar alle die ich versucht hab) hängt sich auf

    Danke,
    Xalon



  • Dass jeder "injected" Prozess hängenbleibt, kann ich mir schwer vorstellen.
    Hat der Remoteprozess eine "selfmade" DLL (meist erkennbar am Modulnamen) geladen, die "seltsam" reagiert wenn ein Thread gestartet wird ?



  • um welchen ziel prozess handelt es sich eigentlich?
    Ich hatte mal versucht prozesse über detour/inline hooking zu verstecken.
    im taskmanager von w2k hat das wunderbar geklappt. allerdings is mir der process explorer von sysinternals immer wieder abgeschmiert...mit ähnlichen problemen wie bei dir. damals lage es aber (vermutlich) daran, dass dort die funktion, die gehookt wurde zu oft vom zielprzess ausgerufen wurde. also gab es memory exceptions während ich meinen inline jmp reingeschrieben hab. (hab daran aber nichtmehr weitergemacht. thread suspend wäre sicherlich ne lösung gewesen...)

    was passiert in deiner DllMain() sonst noch alles?
    Mal das ganze im olly angeschaut und durchdebuggt?

    greets
    RadiatioN Off



  • Also hier is meine ganze Test-DLL

    #define MAKE_DLL
    #define _WIN32_WINNT 0x500
    
    #include <windows.h>
    
    using namespace std;
    
    extern "C" int WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) 
    {
    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH:  
     MessageBox(NULL,"Gut","Injected",MB_OK);
    break;
    case DLL_PROCESS_DETACH: 
    break;
    }
    
     return TRUE;
    }
    

    Ich hab bis jetzt als Ziel den IE, ICQ und FF probiert.

    Hmm mim Debugger hab ich mir schon überlegt allerdings bin ich da nicht so bewandert...
    Das ganze hat übrigens zum Zweck das ich mein API-Hooking Tutorial ( http://wiki.hackerboard.de/index.php/Windows_API ) erweitern will 🙂
    Hast du vielleicht den Code noch mit dem du damals injecten wolltest?

    @merker : Also das die 3 Testopfer SelfMade DLLs geladen haben denk ich nicht.
    Und doch alle 3 kacken ab,nur mein Code (hab zum Test mal eine andere DLL mit Code injected)läuft weiter wie ne 1 -.-

    Xalon

    P.S:Wow schon 2 Seiten hätte nicht gedacht das ich so viel Hilfe bekomme,vielen Dank =))



  • Soo also ich weiß jetzt an was es liegt,glaub ich 😃

    WaitForSingleObject(thread,INFINITE); //  <== kommt irgendwie nie zum ende o_O
    
     VirtualFreeEx(hProcess,VirtualMem,0,MEM_RELEASE);
     CloseHandle(thread); 
     CloseHandle(hProcess);
    
     return 0;
    }
    

    Wenn ich mit diesem Code injecte dann hängt der Prozess genau solange wie die DLLMain arbeitet.
    Wenn ich die MessageBox ausgebe dann hängt er bis ich OK Drücke.
    Wenn ich allerdings umfangreicheren Code einschleuse dann hängt er sich auf
    da dieser eine While(1) MainSchleife hat 😕

    Aber eigentlich sollte ein Thread und ne DLL doch einen laufenden Prozess nicht unterbrechen?!

    Schon mal vielen Dank für Tipps 🙂
    Xalon



  • Wenn eine DLL geladen wird, dann wird in dem Prozess eine *globaler* Critical Section betreten. Es können dann keine andere DLLs mehr geladen werden, bis die DLL aus ihrem Entry wieder zurück ist. Somit kann sich schon der ganze Prozess "aufhängen".



  • Und wie funktionier DLL injection dann?
    Weil Threads kann ich in der main auch nicht callen.

    Schon mal Danke,
    Xalon



  • Mit zwei Threads :
    Einer lädt die DLL, der andere ruft die "ThreadFunc" auf. 🙂



  • Es funktioniert 🙂

    Hätte nicht gedacht das ichs noch hinbring,das Posten meines Problems im Forum
    war mehr so ein letzter Hilferuf,ohne wirklich zu denken das es noch klappt.

    Nochmal vielen Dank an alle die mir geholfen haben 🙂

    Xalon


Anmelden zum Antworten