DLL-Injection ohne Fehler ... und ohne Erfolg!



  • Hi,
    ich bin grade dabei eine Funktion zur Automatischen DLL-Injection zu schreiben,hab
    jetzt schon ein paar Tutorials/Sources gelesen,
    der folgende Code baut also auf diesen Quellen auf.

    Aber erst mal will ich euch das Problem erklären:

    Alles schein prima zu klappen,er compiliert und führt das Programm aus,nur es
    tut sich nichts,die DLL wird nicht geladen...
    An der DLL und an get_handle liegts nicht ,hab ich beides gecheckt.
    Außerdem scheinen alle genutzten Funktionen richtig ausgeführt zu werden (wird im Code gecheckt).
    Ich finde einfach keinen Fehler 😞

    Hoffe ihr könnt mir helfen.
    Schon mal vielen Dank

    Hier der Code:

    #define _WIN32_WINNT 0x500
    #include <windows.h>
    #include <tlhelp32.h>
    #include <iostream>
    using namespace std;
    
    HANDLE get_handle(char* ); 
    int InjectDll(HANDLE ,char* );
    
    int main(void)
    {
      if(InjectDll(get_handle("notepad.exe"),"test.dll") == -1)
       cout << "return = -1" << endl;
      cout << "return = 0" << endl; 
      system("PAUSE"); 
      return 1;  
    }
    
    /********************************************************************/
    
    HANDLE get_handle(char* exe_name)         
    {
      HANDLE hProcessSnap;
      HANDLE hProcess;
      PROCESSENTRY32 pe32;
      DWORD dwPriorityClass;
    
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
      pe32.dwSize = sizeof( PROCESSENTRY32 );
    
      do
      {
        if (strcmp(pe32.szExeFile,exe_name) == 0 )
        {
         hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
         CloseHandle( hProcessSnap );
         return hProcess;
        }
      } while( Process32Next( hProcessSnap, &pe32 ) );
    
    }
    
    /********************************************************************/
    
    int InjectDll(HANDLE hProcess,char* dll_to_inject)
    {
            LPVOID VirtualMem;
            LPTHREAD_START_ROUTINE ThreadAddr;
            HMODULE KernelModul;
            DWORD rw = 0; 
    
            VirtualMem = VirtualAllocEx(hProcess,NULL,sizeof(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,
                               sizeof(dll_to_inject),
                               &rw))
                return -1;
    
            if(!CreateRemoteThread(hProcess,
                                  NULL,
                                  0,
                                  ThreadAddr,
                                  VirtualMem,
                                  0,
                                  NULL))
                return -1;
    return 0;
    }
    


  • *push*
    Kann mir keiner Helfen?



  • LoadLibraryA schlaegt wahrscheinlich fehl. Du ueberpruefst ja auch nicht den rueckgabewert des von dir erstellten threads sonst haettest du das gesehen!
    Und warum schlaegt LoadLibrary fehl?
    ... weil du mit sizeof nicht die groese des speicherbereiches herausbekommen auf den ein pointer zeigt! Konkret is das hier falsch:

    VirtualMem = VirtualAllocEx(hProcess,NULL,sizeof(dll_to_inject),MEM_COMMIT,PAGE_READWRITE);
    ...
    if(!WriteProcessMemory(hProcess, VirtualMem, (LPVOID)dll_to_inject, sizeof(dll_to_inject), &rw))
    

    sizeof gibt hier 4 zurueck (weil ein zeiger auf 4bytes gross ist)! und weil in deinen 4 bytes natuerlich nicht der ganze pfad zur dll steht wird LoadLibrary bestimmt "file not found" zurueckgeben.

    also ersetz die beiden "sizeof's" jeweils durch strlen(...)+1

    obs dann geht weis ich auch nicht aber die chancen stehen schonmal besser 🙂


Anmelden zum Antworten