首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个进程调用SetDllDirectory不起作用?

从另一个进程调用SetDllDirectory不起作用?
EN

Stack Overflow用户
提问于 2015-01-24 00:26:09
回答 1查看 651关注 0票数 1

我一直试图从一个“注入器”程序中切换我不拥有的程序的Dll目录,这个程序应该切换Dll加载目录来加载修改或点击的Dll。

以下是功能:

代码语言:javascript
复制
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);
}

我看不出为什么这不管用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-24 14:31:29

感谢本·沃尔格特提供的上述帮助!

编辑:注意,正如before所说,您必须确保您能够及时拦截进程,以便在加载DLL之前更改目录。因此,这并不总是起作用的,尽管在我的例子中是这样的。

如果有人想拦截进程加载位置,可以在以下位置找到代码:

代码语言:javascript
复制
    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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28120919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档