Wie DLL injekten ohne das sie im system oder process ordner liegt?



  • Tag,
    Mal ne frage. Ich habe hier eine DLL die ich in einen fremden Process injekten möchte, aller dings muss ich die DLL dazu in das Verzeichnis packen von wo auch die .exe des fremden Processes gestartet wurde oder sie in das system/32 Verzeichnis packen. Gibt es eine Möglichkeit meine DLL zu injekten ohne sie in die Verzeichnise zu packen, also das ich sie einfach auf dem Desktop liegen hab?

    gruß Tobi.



  • Ich hab ehrlich keine genaue Ahnung, aber wenn es ihm egal ist ob system32 oder der spezielle Ordner, klingt das wie ne Path Variable die irgendwo versteckt ist und die man, sofern man Nutzer des Rechners ist, editieren könnte. Wenn es um ein fremdes System geht klingt's mir eher nach "nicht möglich" denn das ganze sieht doch sehr nach ner Sicherheitsmassnahme aus.



  • Diese Frage hat wohl nur garnix mit C++ zu tun und alles mit WinAPI.



  • Das Setzen eines systemweiten Hooks (SetWindowsHookEx) mit einer Hook-Function in der DLL sorgt dafür, dass diese DLL von jedem User-Prozess im System geladen wird.



  • Hä? Habt ihr meine Frage net verstanden? Sorry, vieleicht ein wenig doof formuliert, werds einfach noch mal versuchen.

    Also mal grafisch:

    (User Proc.)              (User DLL)
    +--------------+          +------------+
    |	          |          |	        |
    | DLL -        |<-------->|  DLL       |
    | Injector     |          |	        |
    | 	         |          +------------+
    +--------------+                ^
                                    |
                                    v
    			            +--------------+
                            |              |
                            | Fremder Proc.|
                            |              |
                            +--------------+
    

    Soweit is ja klar was ich machen will, aber das Problem ist, dass sich die DLL NUR injektzieren lässt, wenn sie im selbem Verzeichnis/Ordner liegt wie die .exe des fremden Prozesses, ODER sie liegt im system32 Verzeichnis.
    Meine Frage war, geht das injektzieren auch ohne das meine DLL im selbe Verzeichnis/Ordner liegt oder im system32 Ordner?

    Gruß Tobi.



  • T0bi schrieb:

    Hä? Habt ihr meine Frage net verstanden?

    Hast du meine Antwort nicht verstanden? 😃

    Auf oben beschriebene Art und Weise wird die DLL von jedem Prozess geladen, egal wo sie liegt.



  • Hm aber benutze ich SetWindowsHookEx net um so eher Keyboard hook ect mit WH_XXX zu setzen?

    PS: Die DLL soll via' Remotethread geladen werden.



  • Pfui pfui... 😃

    Es wird ganz einfach die Windows-Suchreihenfolge verwendet, wenn du keinen absoluten Pfad angibst.

    Sprich (iirc) system32 -> windows -> system -> %SYSTEMROOT% -> Verzeichnis der Exe

    Muss nicht stimmen. Du solltest mal die MSDN bzw. Google bemühen.



  • Sorry aber ich hab jetzt die Ausrede, dass ich die MSDN nicht aufrufen kann er lädt die seite net, kA wieso nicht.

    Ich hab mich entschlossen nen Keyboard hook zu installieren fuer den process, dann brauch ich des net via Remote machen oder?



  • Ok also ich habe mich fuer die Variante mit dem Keyboard hook entschieden ist wohl die einfachste 🙂
    Allerdings nervt mich jetzt eine Sache. Ich wollte die DLL dynamisch laden:

    typedef BOOL (*fpInstallHook)( HWND, DWORD );
    typedef BOOL (*fpUnistallHook)( );
    
        DWORD dwProcessThreadID = 0;
        HMODULE hModule = LoadLibrary( "Direct3DHook.dll" );
    
        fpInstallHook  inHook = (fpInstallHook)GetProcAddress( hModule, "InstallHook" );
        fpUnistallHook unHook = (fpUnistallHook)GetProcAddress( hModule, "UnistallHook" );
    
        HWND hWindow = FindWindow( 0, szWindowName );
        dwProcessThreadID = GetWindowThreadProcessId( hWindow, 0 );
    
        InstallHook( 0, dwProcessThreadID );
      //  inHook( 0, dwProcessThreadID );
        getchar( );
        UnistallHook( );
    //    unHook( );
        FreeLibrary( hModule );
    

    Allerdings, wenn ich sie dynamisch laden will, dann bekomme ich ne schicke Fehlermeldung die mir sagt, das meine Injector.exe eine access violation hat an der stelle 0xC0000005, sie kommt noch nicht einmal so weit den hook zu setzen. wenn ich die sache statisch abwickeln möchte funktioniert das.

    Idden?



  • Das Setzen des Hooks erfolgt von außen. Du brauchst nur die Adresse der Hook-Funktion innerhalb der DLL.

    Kommunizieren musst du mit der DLL z.B. über ein MemoryMappedFile, da die DLL natürlich in jedem Prozess neu geladen wird und sich damit auch keine Variablen etc teilen.

    Deinen Code kannst du dann z.B. in den EntryPoint klatschen.



  • Wieso kann mir ja auch einfach ein paar funktionen fuer die DLL schreiben, dann kann ich den shared bereich der dll nutzen, und die wparam, lparam infos kann ich auch auslesen bzw. sie werden mir an eine nachrich (WM_USER+2) gesendet.
    nur ists merkwürdig das statischen laden der dll geht und das dynamische net.



  • Ja ich kenne dein Problem, das ging mir damals beim ersten Versuch auch so.

    Ohne Kenntnis deines Quellcodes kann man das aber nur schwer beantworten.



  • Hm nuja, ist ja eigentlich auch egal ob ich das im injector dynamisch oder statisch mache. Jetzt bräuchte ich hier mal hilfe 😉

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1553125.html

    Gruß Tobi



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten