LoadLibraryW nicht funktioniert, während LoadLibraryA den Job
-
21-09-2019 - |
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?
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" );