所以我有一个应用程序可以启动另一个应用程序并注入我的 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)
{
}
谢谢