LoadLibraryW ne fonctionne pas tout LoadLibraryA fait le travail
-
21-09-2019 - |
Question
J'ai écrit du programme d'échantillonnage et DLL pour apprendre le concept d'injection DLL.
Mon code d'injection pour injecter la DLL au programme d'échantillonnage est la suivante (manipulation omise erreur):
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());
Memory :: CreateThread est la suivante:
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");
}
}
Le problème est que le module n'est pas chargé. Cependant, quand je change la deuxième ligne à
LPTHREAD_START_ROUTINE pLoadLibraryW =
(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");
il fonctionne (depuis le dll de test n'a pas de caractères unicode dans son nom).
Comment faire fonctionner avec LoadLibraryW
?
La solution
HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
Il faut un TCHAR - si l'argument en faveur LoadLibraryW doit être une grande chaîne; le code passe au-dessus de la forme multi-octet de l'argument, qui est la forme que LoadLibraryA veut.
Autres conseils
Je ne sais pas pourquoi vous créez un fil et lui fournissant l'adresse de la fonction LoadLibraryW
. Ne serait-il plus facile et plus sûr d'appeler directement LoadLibraryW
?
De toute façon, vous ne avez certainement pas besoin de faire des appels WideCharToMultiByte
. LoadLibraryW
attend un grand nom du module de caractères.
Y at-il des raisons pour lesquelles vous ne pouvez pas le faire cela?
HMODULE hLibHandle = LoadLibraryW( L"D:\\Path\\to\\my\\DLL.dll" );