【问题标题】:Calling SetDllDirectory from another process doesn't work?从另一个进程调用 SetDllDirectory 不起作用?
【发布时间】:2015-01-24 00:26:09
【问题描述】:

我一直在尝试从一个“注入器”程序切换我不拥有的程序的 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);
}

我不明白为什么这不起作用?

【问题讨论】:

  • 您从未传输过字符串内容,您所做的只是为它分配空间,它将被零填充。与调用SetDllDirectoryA("");的效果相同
  • 此外,如果您在 DLL 已加载后更改搜索路径,它可能永远不会为您提供所需的行为。
  • 谢谢,我完全错过了!对你的两个回答进行投票。

标签: c++ createremotethread setdlldirectory


【解决方案1】:

感谢 Ben Volgt 提供的上述帮助!

编辑:请注意,正如 Ben Volgt 所说,您必须确定您可以及时拦截进程,以便在加载 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多