LoadLibraryW не работает, пока LoadLibraryA выполняет эту работу

StackOverflow https://stackoverflow.com/questions/1584502

Вопрос

Я написал несколько примеров программы и библиотеки DLL, чтобы изучить концепцию внедрения DLL.

Мой код для внедрения DLL в пример программы выглядит следующим образом (обработка ошибок опущена):

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 выглядит следующим образом:

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");
    }
}

Проблема в том, что модуль не загружен.Однако, когда я меняю вторую строку на

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

это работает (поскольку тестовая библиотека dll не содержит символов юникода в своем имени).

Как заставить это работать с LoadLibraryW?

Это было полезно?

Решение

HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);

Для этого требуется TCHAR - поэтому аргументом для LoadLibraryW должна быть широкая строка;приведенный выше код передает многобайтовую форму аргумента, которая является формой, которую хочет LoadLibraryA.

Другие советы

Я не уверен, почему вы создаете поток и передаете ему адрес LoadLibraryW функция.Разве не было бы проще и безопаснее позвонить LoadLibraryW напрямую?

В любом случае, вам, конечно, не нужно делать никаких WideCharToMultiByte звонки. LoadLibraryW ожидает широкое символьное имя модуля.

Есть ли какая-то причина, по которой вы не можете просто сделать это?

HMODULE hLibHandle = LoadLibraryW( L"D:\\Path\\to\\my\\DLL.dll" );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top