LoadLibraryw não funciona enquanto o loadlibrarya faz o trabalho
-
21-09-2019 - |
Pergunta
Escrevi algum programa de amostra e DLL para aprender o conceito de injeção de DLL.
Meu código de injeção para injetar a DLL no programa de amostra é o seguinte (manuseio de erros omitido):
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 :: createethread é o seguinte:
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");
}
}
O problema é que o módulo não está carregado. No entanto, quando eu mudo a segunda linha para
LPTHREAD_START_ROUTINE pLoadLibraryW =
(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");
Funciona (já que a DLL de teste não possui caracteres unicode em seu nome).
Como fazê -lo funcionar com LoadLibraryW
?
Solução
HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
É preciso um TCHAR - então o argumento para o loadlibraryw deve ser uma corda ampla; O código acima passa a forma de vários bytes do argumento, que é o formulário que o LoadLibrarya deseja.
Outras dicas
Não sei por que você está criando um tópico e passando o endereço do LoadLibraryW
função. Não seria mais fácil e seguro ligar LoadLibraryW
diretamente?
De qualquer maneira, você certamente não precisa fazer nenhum WideCharToMultiByte
chamadas. LoadLibraryW
espera um amplo nome do módulo de caracteres.
Existe alguma razão para que você não possa fazer isso?
HMODULE hLibHandle = LoadLibraryW( L"D:\\Path\\to\\my\\DLL.dll" );