Frage

Ich habe einige Beispielprogramm geschrieben und DLL das Konzept der DLL-Injektion zu lernen.

Meine Injektion Code die DLL in das Beispielprogramm zu injizieren ist wie folgt (Fehler ausgelassen Abwicklung):

std::wstring dll(L"D:\\Path\\to\\my\\DLL.dll");
LPTHREAD_START_ROUTINE pLoadLibraryW = 
    (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW");
int bytesNeeded = WideCharToMultiByte(CP_UTF8, 0, dll.c_str(), dll.length(), 
    NULL, 0, NULL, NULL);
std::vector<byte> dllName(bytesNeeded);
WideCharToMultiByte(CP_UTF8, 0, dll.c_str(), dll.length(), 
    (LPSTR)&dllName[0], bytesNeeded, NULL, NULL);
// Memory is a class written by me to simplify memory processes. 
// Constructor takes desired permissions.
Memory mem (pid, false, true, false, true, false, false, false, 
    false, false, true, true, true, false);
// Ensures deletion of the allocated range.
// true / true / false = read and write access, no execute permissions
std::tr1::shared_ptr<void> allocated = 
    mem.AllocateBytes(dllName.size(), true, true, false);
mem.WriteBytes((unsigned int)allocated.get(), dllName);
mem.CreateThread(pLoadLibraryW, allocated.get());

Speicher :: Createthread ist wie folgt:

void Memory::CreateThread(LPTHREAD_START_ROUTINE address, LPVOID parameter) const {
    std::tr1::shared_ptr<void> hThread(CreateRemoteThread(m_hProcess.get(), 
        NULL, 0, address, parameter, 0, NULL), CloseHandle);
    if (hThread.get() == NULL) {
        throw std::runtime_error("Memory::CreateThread: CreateRemoteThread failed");
    }
    DWORD returned = WaitForSingleObject(hThread.get(), INFINITE);
    if (returned != WAIT_OBJECT_0) {
        throw std::runtime_error("Memory::CreateThread: The remote thread did not complete properly");
    }
}

Das Problem ist, dass das Modul nicht geladen ist. Allerdings, wenn ich die zweite Zeile ändern

LPTHREAD_START_ROUTINE pLoadLibraryW =
    (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");

es funktioniert (da der Test dll kein Unicode-Zeichen in seinem Namen hat).

Wie es mit LoadLibraryW funktioniert?

War es hilfreich?

Lösung

HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);

Es dauert ein TCHAR - so das Argument für LoadLibraryW eine breite Zeichenfolge sein muss; der obige Code übergibt die Multi-Byte-Form des Arguments, das die Form ist, dass LoadLibraryA will.

Andere Tipps

Ich bin nicht sicher, warum Sie einen Thread erstellen und die Adresse der LoadLibraryW Funktion übergeben. Wäre es nicht direkt anrufen LoadLibraryW einfacher und sicherer?

So oder so, Sie brauchen sicher keine WideCharToMultiByte Anrufe zu tätigen. LoadLibraryW erwartet ein breites Zeichen Modulnamen.

Gibt es einen Grund, warum man nicht einfach das tun?

HMODULE hLibHandle = LoadLibraryW( L"D:\\Path\\to\\my\\DLL.dll" );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top