Dll Injection - Passiert was?



  • Und was steht ab Vista in MODULEENTRY32::modBaseAddr ?



  • durch ASLR sind die DLL-Adressen nur von Start zu Start verschieden - während der Laufzeit sind sie in allen Prozessen gleich.



  • Wie bekommt man denn nun die Adresse einer Funktion in einem anderen Prozess ab Vista? Dabei soll der eigene Prozess aber nicht zwingend das Modul geladen haben müssen. Das ist nämlich bei "Cypher"s Code der Fall, da sonst gleich bei der ersten Zeile ein Crash auftritt:

    PIMAGE_DOS_HEADER pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(module);

    (Weil die Adresse "module" im eigenen Prozess nicht existiert, weil das Modul hier nicht geladen ist, sondern nur im Fremdprozess)



  • LoadLibrary()+GetProcAddress()



  • Was? Nein, du verstehst wohl nicht.

    Nochmal: Wie bekommt man denn nun die Adresse einer Funktion in einem anderen Prozess ab Vista?

    (Damit diese für CreateRemoteThread verwendet werden kann)



  • !!!: LoadLibrary()+GetProcAddress()



  • Soweit ich weiss, funktionier CreateRemoteThread wegen den Sessions unter Win Vista/7 auch nicht mehr richtig. Außerdem meckert mein Virenschutz immer bei Programmen, die CreateRemoteThread aufrufen.

    Könnte man nicht (theoretisch) folgendes machen: Man schreibt seine Code in das fremde programm, und anstatt CreateRemoteThread aufzurufen schreibt man irgendwo in dem fremden Prozess einen Jump-Befehl zu dem Angelegten Speicherbereich. Dieser müsste dann auch von dem Anderen Programm ausgeführt werden, also müsste man auch noch wissen, wo der Befehl liegt, den dieser Prozess als nächstes ausführen wird. Ob das allerdings machbar ist oder wie man das macht, entzieht sich meiner Kenntnis.

    MfG, Jochen



  • DLL/Code injections funktionieren unter Vista wie gehabt (mal abgesehen von Problemen/Warnungen der AV's). Man braucht halt nur Administrator Rechte dafür.



  • HMODULE schrieb:

    !!!: LoadLibrary()+GetProcAddress()

    Und wie soll das gehen?



  • Achso, naja wenn die Adressen sich nur beim Start von Windows ändern, und dann für jeden Prozess gleich sind, liegt das Problem des TE aber wo anders.



  • @Danyka
    Befindet sich deine lil.dll auch im selben Verzeichnis wie die Notepad Executable oder im Systemordner?
    Ansonsten musst du den absoluten Pfad angeben.



  • 🙄 🙄 🙄
    Ich wusste, ich übersehe irgendwas...

    danke für das Augen öffnen; es war tatsächlich so eine banale Lösung 😑



  • Meine Lösung?
    Dann hast du aber doch bestimmt eine Windows-Meldung bekommen, dass die DLL nicht gefunden wurde?!



  • Ja, deine Lösung und nein es gab keine Fehlermeldung, deswegen wusste ich auch absolut nicht weiter... Mein Build hatte 0 Fehler/Warnungen (VS 2010) und beim ausführen gab es auch keine Fehler.



  • Könnte man nicht (theoretisch) folgendes machen: Man schreibt seine Code in das fremde programm, und anstatt CreateRemoteThread aufzurufen schreibt man irgendwo in dem fremden Prozess einen Jump-Befehl zu dem Angelegten Speicherbereich.

    Ja, das würde Theorethisch gehen. Man könnte einfach eine Funktion mit den Befehlen schreiben und dann direkt unter diese eine neue leere Funktion deklarieren und von dessen beiden Adressen die Größe rauskriegen.. damit hätte man alles was man braucht, bis auf den aufruf. Um diesen mit bestimmtheit festelgen zu können, müsste man sich jedoch auf einen bestimmten Prozess spezalisieren, was nicht immer möglich ist.

    @Danyka: ich nehme an, dass du schon dieses tutorial kennst?! : http://www.autoitbot.de/coding-bereich-autoit-bot-community/tutorials/bots-memory-co/2173-code-dll-injection-tutorial/

    1. Dein problem liegt wohl höchst wahrscheinlich an "CreateRemoteThread" Was gibt denn die "GetLastError()" Funktion zurück?

    führe mal in etwa an einigen Stellen folgendes aus um den Fortschritt deiner funktion zu überprüfen :

    printf("PathSize: %d", PathSize);
        cout << endl;
        printf("PID: 0x%x", PID);
        cout << endl;
        printf("hProcess: 0x%x", hProcess);
        cout << endl;
        printf("AllocAdresse: 0x%x", AllocAdresse);
        cout << endl;
        printf("hRemoteThread: 0x%x", hRemoteThread);
        cout << endl;
        printf("hDll: 0x%x", hDll);
        cout << endl << endl;
        printf("Last Error: 0x%x", GetLastError());
        cout << endl;
        system("pause");
    

    2. Du solltest beachten, dass "String" eine klasse ist und deswegen dllPath.c_str nicht die gleiche Speichergröße hat wie dllPath.

    nimm also am besten sizeof(dllPath.c_str) statt sizeof(dllPath), wenn du schon mit String statt c-strings arbeiten musst 😛

    MFG,
    Deathly Assassin

    Edit: Achja.. Wenn du sowieso deinen überwigend Code im C-Stil hälst, wundert es mich umso mehr, warum du statt eines normalen C-Strings die String Klasse benutzt 😉



  • Lies doch! Das Problem wurde schon gelöst!


Anmelden zum Antworten