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?

Était-ce utile?

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" );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top