DLL injecten geht bei mir, bei nem Kumpel aber ned... [erledigt]



  • 🙂

    Nana... es muss doch an etwas grundlegendem scheitern, sonst würde es auf XP Prof. doch auch nicht tun.

    Nun, hier ein kürzerer injection-Code, mit dem es auf XP Professional funktioniert, auf XP Home wieder nicht...:

    bool insertDll(DWORD procID, std::string dll)
    {
        //Find the address of the LoadLibrary api, luckily for us, it is loaded in the same address for every process
        HMODULE hLocKernel32 = GetModuleHandle("Kernel32");
        FARPROC hLocLoadLibrary = GetProcAddress(hLocKernel32, "LoadLibraryA");
    
        //Adjust token privileges to open system processes
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
            LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, 0, &tkp, sizeof(tkp), NULL, NULL);
        }
    
        //Open the process with all access
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
    
        //Allocate memory to hold the path to the Dll File in the process's memory
        dll += '\0';
        LPVOID hRemoteMem = VirtualAllocEx(hProc, NULL, dll.size(), MEM_COMMIT, PAGE_READWRITE);
    
        //Write the path to the Dll File in the location just created
        DWORD numBytesWritten;
        WriteProcessMemory(hProc, hRemoteMem, dll.c_str(), dll.size(), &numBytesWritten);
    
        //Create a remote thread that starts begins at the LoadLibrary function and is passed are memory pointer
        HANDLE hRemoteThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)hLocLoadLibrary, hRemoteMem, 0, NULL);
    
        //Wait for the thread to finish
        bool res = false;
        if (hRemoteThread)
            res = (bool)WaitForSingleObject(hRemoteThread, 10000) != WAIT_TIMEOUT;
    
        //Free the memory created on the other process
        VirtualFreeEx(hProc, hRemoteMem, dll.size(), MEM_RELEASE);
    
        //Release the handle to the other process
        CloseHandle(hProc);
    
        return res;
    }
    

    😕



  • Ich würde es mal mit Fehlerbehandlung versuchen.



  • liegt an dem OpenProcessToken bzw OpenProcess kram. wieso checkst du die rückgabewerte nicht? der rest ist ok



  • Warum vergesse ich immer, Returnwerte abzufragen...
    Aber: Es tritt kein Fehler auf!
    (Habe Parameter 3 von VirtualFreeEx() noch auf 0 gesetzt, das war der einzige Fehler)

    Gerade habe ich ein XP Home System gefunden, auf dem das Ganze funktioniert aber...

    XP Professional System:
    DLL Injizieren funktioniert

    XP Home System 1:
    DLL Injizieren funktioniert

    XP Home System 2:
    DLL Injizieren funktioniert nicht
    (detoured.dll geht aber zB, nur meine nicht!)

    XP Home System 3:
    DLL Injizieren funktioniert nicht
    (detoured.dll geht aber zB, nur meine nicht!)

    Bei Home System 2 & 3 werden zwar msvcp71.dll und MSVCR71.DLL in den Prozess geladen, meine DLL aber nicht... Was ist da los?

    😕

    Danke!
    MfG



  • vielleicht irgendwelche antivirensoftware?



  • Ne leider, daran liegts auch nicht...

    Wie anfangs schon erwähnt, funktioniert nur meine DLL nicht, aber zB. detoured.dll von Microsoft schon!
    (Also dort, wo sich meine DLL injizieren lässt, geht natürlich auch detoured.dll, aber dort wo sich meine DLL nicht injizieren lässt, geht es jedoch mit detoured.dll)

    MfG



  • Na dann prüfe, wie schon mehrfach gesagt, JEDEN Rückgabewert JEDER Funktion. Irgendwo wird das schieflaufen, wie sollen wir dir das hier sagen, wenn wir dein Problem nicht reproduzieren können, selbst wenn wir uns dazu motivieren könnten, es zu tun.



  • ceplusplus@loggedoff schrieb:

    Aber: Es tritt kein Fehler auf!

    Hab jede Funktion in insertDll() geprüft, jede gibt einen Wert ungleich 0 zurück. Auf jedem System. Aber trotzdem wird auf manchen Systemen nicht injiziert... Bei "XP Media Center Edition" gehts auch nicht...
    Überall als Admin probiert, kein AntiVirus, ...

    MfG



  • Das ist unmöglich. Dann machst du in deiner DLL irgendwas zweifelhaftes in DllMain oder so.



  • Inf.Student schrieb:

    Das ist unmöglich.

    Ja, das denke ich auch ständig 😞

    #include <windows.h>
    
    bool WINAPI DllMain(HMODULE hDll, DWORD dwReason, PVOID pvReserved)
    {
    	if(dwReason == DLL_PROCESS_ATTACH)
    		;
    	else if(dwReason == DLL_PROCESS_DETACH)
    		;
    
        return true;
    }
    

    Es ist aber so... Aber es muss doch mit meiner DLL zu tun haben, immerhin funktioniert es mit anderen ja überall, doch mit meiner Selbsterstellten nicht überall...



  • Um welches Programm geht es? Bist du dir sicher, daß das Programm keine Maßnahmen enthält?



  • Zuerst mit nem alten Spiel, dann mit procexp.exe (Process Explorer) versucht. Haben beide sicher keine Maßnahmen, außerdem bleibt es beim selben: Bei meinen zwei PC's gehts (XP Home & XP Prof.), auf paar anderen Systemen nicht... Mit ner Microsoft DLL gehts überall...

    MfG



  • Hilfe 😕 😞



  • Bei dem Code von http://datakeeper.lima-city.de/html/winject.txt hatte es bei dir nicht geklappt mit result==6, richtig? In dem Code steht in "InjectOrEject"

    ht = CreateRemoteThread( hProcess, 0, 0, (DWORD (__stdcall *)( void *)) p, c, 0, &rc );
    if ( ht == NULL ) 
    	nResult=6;
    

    . Hast du in deinem Codestückchen mal probiert, ob CreateRemoteThread schiefgeht? Wenn's NULL zurückgibt, dann zeig mal den GetLastError.


  • Mod

    Mit GetExitCodeThread müsstest Du den Returncode von Deinem Remotethread bekommen. Das müsste ja der DLL-HINSTANCE Wert sein. Zumindest wüsstest Du dann ob der LoadLibrary überhaupt funktioniert.



  • Danke, aber auch bei diesem Code...

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-214120-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html#1517111

    ...funktioniert es nicht. Dabei geben aber alle Funktionen auf jedem System !0 zurück, trotzdem wird auf einigen Systemen nicht injiziert.

    MfG


  • Mod

    1. Alle DLLs wirklich auf der Maschine?
    2. Was ist der Returnwert Deines Threads? Nach dem injezieren?
    3. Terminiert der Thread normal?

    Mögichkeit:
    1. Deine DLL funktioniert nicht...
    2. Deine DLL braucht DLLs die auf dem Zielsystem nicht geladen werden können
    3. Dein DLL beendet DllMain nicht korrekt und wird wieder entladen.



  • Hey!

    Hab das Problem immer noch. Jetzt wirds aber dringend, dass es auf allen XP Systemen funktioniert...
    Grade wieder mit nem Kumpel getestet.

    Hab mir jetzt einen Universal-DLL-Injector zugelegt. Er gibt bei mir keinen Fehler aus, und die DLL wird tatsächlich im Prozess ausgeführt.
    Beim Kumpel gibt der Injector auch keinen Fehler aus, aber die DLL wird nicht im Prozess ausgeführt!

    Somit ist es klar, es liegt nich an meinem Injektor, sondern an meiner DLL!
    Denn der UniversalInjektor wurde zu genüge getestet...

    Frage:
    Was muss ich beim schreiben einer DLL beachten, welche in einem Prozess ausgeführt werden soll? Brauche ich da extern "C", __declspec(dllimport) Anweisungen?

    An irgendwas muss es ja liegen...

    👎 😕



  • das hab ich dir vor 3 monaten schonmal gesagt, es liegt an dem virenscanner von deinem kumpel. woher sollen wir wissen was sein rootkit da alles im system macht.



  • Der hat nur Avast oben, und das hat er zuvor komplett deaktiviert...
    Er hat mal mit Process Explorer nachgesehen, wie vermutet ist die .dll einfach nicht im Prozess... Bei mir gehts doch aber verdammt, und auf meinem anderen PC auch... 😞

    Eine andere DLL lässt sich ja sogar laden, zB. eine von Microsoft...
    Deshalb bin ich mir so sicher, dass es an meinem DLL Code liegt (Eh schon gepostet)...


Anmelden zum Antworten