DLL Injection Fehler



  • Ja.
    Im übrigens brauchst du den String garnicht in ein Array kopieren, hol dir den Zeiger einfach mit c_str() und die Länge mit length() (Wieder 1 addieren).



  • Davon abgesehen hat da s0 mit C++ zu tun. WinAPI ist der Forenbereich deiner Wahl.



  • Hallo ich hatte mich auch mal kurz mit sowas beschäftigt ich hatte mir aber dann ein eingies Programm geschrieben wo ich rein Injectet habe. Da es bei mir auch mit Notepad und Windows Taschenrechner nicht ging. (Ich hatte auch nicht so lust zu schauen wie man es nun richtig macht.^^ Mir gings einfach nur darum so im groben das Prinzip verstanden zu haben).

    Ich poste hier einfach mal den Code: (Vielleicht kannst du da ja was mit Anfangen)

    Quelle: ElitePvpers (Gib mal bei google ein dann solltest du den Forum thread finden)

    Injector:

    #include "windows.h"
    #include <iostream>
    
    using namespace std;
    
    char const Path[]="C:\\Message Box.dll";
    
    int main(int argc, char* argv)
    {
    bool virt;
    bool write_ret;
    
        HANDLE hWnd, hProcess, AllocAdresse, hRemoteThread;
        DWORD PID;
    
    // Injecten in notepad oder den windows taschenrechner ging nicht
    
    	hWnd = FindWindow(0,"Irgendein Programm");
    	cout<<"FindWindow: " << hWnd<< endl;
    
        GetWindowThreadProcessId((HWND)hWnd, &PID);
    
    	hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    	cout<<"OpenProcess: " << hProcess << endl;
    
    	AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(Path), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    	cout<<"VirtualAllocEx: " << AllocAdresse <<endl;
    
    	write_ret = WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)Path, sizeof(Path), 0);
    	cout<<"WriteProcessMemory: " << write_ret << endl;
    
    	hRemoteThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), AllocAdresse, 0, 0);
    	cout<<"CreateRemoteThread: " << hRemoteThread << endl;
    
        WaitForSingleObject(hRemoteThread, INFINITE);
    
    	virt =	VirtualFreeEx(hProcess, AllocAdresse, sizeof(Path), MEM_DECOMMIT);
    	cout<<"VirtualFreeE: " << virt << endl;
    
    	CloseHandle(hProcess);
    
    	system("PAUSE");
    }
    

    DLL:

    #include <windows.h>
    
    void InjNachricht()//der erstellte Thread
    {
        MessageBox(0, "Hallo", " Hallo", 0);
    }
    
    int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)//1. Beim öffnen der Dll wird diese funktion ausgeführt
    {
        if(reason==DLL_PROCESS_ATTACH)//2. Falls der Grund des Aufrufes der DllMain-Funktion das Anhängen an ein Prozesses ist..
        {
            CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InjNachricht, 0, 0, 0);//3.erstelle einen SubProzess, der die übergebene Funktion ausführt
        }
        return true;
    }
    


  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ (auch C++0x und C++11) 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.



  • Naja danke fürs verschieben hehe. UNd auch an alle Antworten.
    Und ich hätte da vielleicht eine Idee, wieso es nicht funktioniert:
    Könnte es daran liegen, dass Notepad und der Taschenrechner 64bit Anwendungen sind?Nur ein Vorschlag.



  • 1. Du musste den vollständigen Pfad zu Deiner DLL angeben!
    2. Du kannst von einem 32Bit Programm nicht eine 32Bit DLL in ein 64Bit Programm injecten! Und von einem 32Bit Programm kannst Du auch keine 64Bit DLL in ein 64Bit Programm injecten. Du musst dir ne extra eine 64Bit EXE und eine 64Bit DLL schreiben um dieses Privileg zu geniessen.
    4. Solltest Du Dicch mal mit den Hintergrund-Dingen von DLL injection vertraut machen.
    3. Stellt man nicht so langen Schrott Code ins Forum!



  • Lad dir mal Winject herunter damit kannst du testen ob sich deine DLL in andere Prozesse injecten lässt. Dann weiss du schonmal ob der Fehler an der DLL oder am Injector selbst liegt.



  • dllinj schrieb:

    Lad dir mal Winject herunter damit kannst du testen ob sich deine DLL in andere Prozesse injecten lässt. Dann weiss du schonmal ob der Fehler an der DLL oder am Injector selbst liegt.

    Hab ich doch schon lange...geht damit auch nicht. also irgendwas mit der dll



  • Raten bringt Dir auch nix...



  • Was ist daran so schwierig?

    #include <windows.h>
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
       MessageBoxA(0, "test", "", 0);
       return TRUE;
    }
    

    Compile es und fertig und teste ob du es injecten kannst.
    Ja eigentlich solltest du das nicht in der DllMain machen, aber zum testen wird es funktionieren. (Manche schreiben sogar immer ihren Code da rein, obwohl man es nicht sollte.)



  • Thereaver schrieb:

    Was ist daran so schwierig?

    #include <windows.h>
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
       MessageBoxA(0, "test", "", 0);
       return TRUE;
    }
    

    Compile es und fertig und teste ob du es injecten kannst.
    Ja eigentlich solltest du das nicht in der DllMain machen, aber zum testen wird es funktionieren. (Manche schreiben sogar immer ihren Code da rein, obwohl man es nicht sollte.)

    das habe ich auch mal gemacht...und es funktioniert jetzt auf einmal o.0.
    Jedoch öffnet sich das Fenster zweimal und es funktioniert auch nicht bei notepad.exe (nur bei notepad++) anscheinend wegen 64bit.



  • joa, das mit den bit wurde ja bereits erklärt.
    Das Fenster öffnet sich öfter, da DllMain öfter aufgerufen wird.
    Es gibt ja verschiedene Gründe z. B. DLL_THREAD_ATTACH und jedesmal wird es aufgerufen. Um dies zu unterbinden kann man DisableThreadLibraryCalls aufrufen.
    Aber wie gesagt, du solltest eine Funktion exportieren und diese nochmal mit CreateRemoteThread aufrufen.



  • Achja und noch ein seltsames Problem:
    Ich kann NUR mit meinem Injector injecten, WENN ich die DLL zuerst mit Winject auch schonmal in den laufenden prozess injected hab...
    Also ohne Winject davor -> kein Fenster erscheint
    Mit Winject injected und danach mit meinem -> erscheint ein Fenster mit meinem Injector
    0.0



  • Niemand eine Idee zu dem Problem im vorherigen Post?



  • ich hap ne super tuper idee: lern die basics!



  • tolle hilfe danke -,-
    *ironie off*


Anmelden zum Antworten