1

所以我有一个应用程序可以启动另一个应用程序并注入我的 DLL(使用 Detours)。入口点是 DllMain。我不能从 DllMain 做很多事情,当然也不能循环。那么如何每隔 x 秒调用一次我的 DLL 监视器函数呢?我读到你不能从 DllMain 创建一个线程(至少在它返回之前),它是真的,因为它让我崩溃了。所以我尝试在附加线程事件中创建它,它让我崩溃了。所以现在我要做的是再次注入它(以防 Detours 失败),这样我就可以获得模块句柄。然后我得到一个创建我的线程的初始化函数的地址。我得到了模块句柄,但我认为我不能得到函数地址。我将函数设为空,但它仍然让我崩溃。所以它甚至没有达到调用函数的程度。Visual Studio 说我没有读取权限。

那我该怎么办?当您不拥有附加的程序 (exe) 时,您如何循环您的 DLL 函数。

//Application.exe
STARTUPINFO si = {sizeof(STARTUPINFO)};
        PROCESS_INFORMATION pi = {0};

        DetourCreateProcessWithDll(filename, NULL, NULL, NULL, TRUE, 
                                    CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, path,
                                    &si, &pi, detoured, hook, NULL);

        processID = pi.dwProcessId;

        hDll = InjectDLL(processID, hook);


if(hDll != NULL)
{
STARTER Starter = (STARTER)GetProcAddress(hDll, "Starter");

if(Starter != NULL)
    Starter();
}

        ResumeThread(pi.hThread);

函数 Starter 是 extern C 导出的,并且看起来很好检查(它是序数 1)。

我不知道可能出了什么问题,只希望那里有人对这个话题和崩溃有过经验。

这是DLL代码:

//Hook.h
extern "C"
{
    void __declspec(dllexport) Starter(void);
}

//Hook.cpp
void Starter(void)
{

}

谢谢

4

1 回答 1

1

您不能这样做,因为 DLL 被注入到不同的进程中,并且您正试图在挂钩进程的地址空间中执行该函数。

您需要做的是调用CreateRemoteThread,在 lpStartAddress 参数中传入您从 GetProcAddress 获得的地址。这将在远程进程上创建一个新线程,并在该进程的地址空间中,在新线程的上下文中执行该函数。

顺便说一句,从技术上讲,您应该能够在 DllMain/DLL_PROCESS_ATTACH 中创建一个新线程,只要您不与其他线程进行任何同步,尽管不推荐这样做。我不确定如果在注入 DLL 时这样做会存在什么问题。

于 2009-06-21T09:51:19.500 回答