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?

Foi útil?

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" );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top