2016-03-25 13 views
0

Ich habe in den letzten Tagen versucht, einen DLL-Injektor zu erstellen.
Die einfachste Methode, die ich für DLL-Injektion gefunden wird CreateRemoteThreadWie injiziere ich eine DLL in einen anderen Prozess?

Dies ist, was ich bisher geschrieben habe, ist dieser Code nicht funktioniert und warum nicht herausfinden kann.

Ich bin ziemlich sicher, dass mein Problem in den Variablentypen ist, die ich verwende, um die WinAPI-Funktionen aufzurufen, aber ich kann nicht finden, wo.

bool Injector::Inject(HANDLE hProcess) 
{ 
    //hProcess is a process with writing and reading access 
    HANDLE hThread; 
    void* pLibRemote = 0; 
    string dllPath = "Some dll path"; 
    HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32")); 


    pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE); 

    WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL); 

    hThread = CreateRemoteThread(hProcess, NULL, 0,  
        (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"), 
        pLibRemote, 0, NULL); 


    . 
    . 
    . 

    CloseHandle(hThread); 

    } 
. 
. 
. 

Antwort

2

Mindestens zwei Probleme:

pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE); 

1) sizeof(dllPath.c_str()): Sie tun sizeof auf einen Zeiger (c_str() returns a pointer), also wahrscheinlich 4 erhalten Sie oder 8 als Ergebnis. Verwenden Sie dllPath.size() + sizeof(char) (oder wchar_t anstelle von char, wenn Sie std::wstring verwenden).

2) Verwenden Sie MEM_RESERVE | MEM_COMMIT statt nur MEM_COMMIT: Sie und begehen den reservierten Speicher zur gleichen Zeit reservieren möchten.

Stellen Sie außerdem sicher, dass beide Programme dieselbe ISA verwenden (x86/x86; x64/x64, aber keine nicht übereinstimmende ISA).

+0

Das hat funktioniert! vielen Dank! Kannst du mir bitte erklären, warum hast du 'dllPath.size() + sizeof (char)' anstatt nur 'dllPath.size()' benutzt (ist das wegen des Null-Terminators?) – HackinGuy

+0

@HackinGuy Genau, [string: : size()] (http://en.cppreference.com/w/cpp/string/basic_string/size) gibt die Anzahl der Zeichen zurück, mit Ausnahme des abschließenden NULL. Wenn wir darüber nachdenken, sollte die String-Größe ** in Bytes ** wie folgt berechnet werden: '(string.size() * sizeof (TCHAR)) + sizeof (TCHAR)', das funktioniert also, wenn Sie std verwenden :: string mit char und std :: wstring mit wchar_t und _UNICODE ist definiert. – Neitsa

+0

@Neitsa können Sie 'sizeof (TCHAR)' nicht verwenden, es sei denn, Sie verwenden auch 'std :: basic_string ' um zu passen. 'std :: string' verwendet' char', 'std :: wstring' verwendet' wchar_t'. Verwenden Sie entsprechende Ansi/Unicode-APIs entsprechend ('LoadLibraryA' /' LoadLibraryW'). In diesem Fall wird 'std :: string' verwendet, verwenden Sie also' (string.size() + 1) * sizeof (char) '. –