Вызов SetDllDirectory из другого процесса не работает?

Я пытался найти способ переключения каталога Dll программы, которой я не владею, из программы "инжектора", которая предполагает переключение каталога загрузки Dll для загрузки измененных или прослушиваемых Dll.

Вот функция:

void AddDirectory(HANDLE Handle, const char* DllPath)
{
    void *Function, *String;
    Function = (void*)(SetDllDirectoryA);
    String = (void*)VirtualAllocEx(Handle, NULL, strlen(DllPath), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)Function, (void*)String, NULL, NULL);
}

Я не могу понять, почему это не сработает?

1 ответ

Решение

Спасибо Бену Волгту за помощь, оказанную выше!

РЕДАКТИРОВАТЬ: Обратите внимание, как сказал Бен Волгт, вы должны быть уверены, что вы можете перехватить процесс вовремя для изменения каталога до загрузки DLL. Поэтому это не всегда будет работать, хотя в моем случае это сработало.

Если кто-то захочет перехватить места загрузки процессов, код можно найти здесь:

    void AddDirectory(HANDLE Handle, const char* DllPath)
{
    if (!Handle)
    {
        //Error Message or Redirect
    }

    LPVOID AddDllDirAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "SetDllDirectoryA");
    if (!AddDllDirAddr)
    {
        //Error Message or Redirect
    }

    LPVOID Alloc = VirtualAllocEx(Handle, NULL, strlen(DllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!Alloc)
    {
        //Error Message or Redirect
    }

    WriteProcessMemory(Handle, Alloc, DllPath, strlen(DllPath), NULL);
    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)AddDllDirAddr, Alloc, 0, NULL);
    if (!Thread)
    {
        //Error Message or Redirect
    }

    WaitForSingleObject(Thread, INFINITE);
    VirtualFreeEx(Handle, Alloc, strlen(DllPath), MEM_RELEASE);
    CloseHandle(Thread);
    CloseHandle(Handle);
}
Другие вопросы по тегам