繁体   English   中英

在其中注入DLL的内部循环?

[英]Where inside injected DLL to loop?

因此,我有一个应用程序启动了另一个应用程序,并注入了我的DLL(带有Detours)。 入口点是DllMain。 我不能从DllMain做很多事情,当然也不能循环。 那么如何每x秒调用一次DLL监视器函数? 我读到您无法从DllMain创建线程(至少直到返回),因为它使我崩溃了,所以它是真实的。 所以我尝试在attach thread事件中创建它,这使我崩溃了。 因此,现在我要尝试的是再次注入它(以防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是外部C导出的,并且经过仔细检查(序号1)。

我不知道可能出什么问题,只是希望外面有人对这个话题有经验并崩溃。

这是DLL代码:

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

//Hook.cpp
void Starter(void)
{

}

谢谢

您不能那样做,因为DLL被注入到另一个进程中,并且您试图在挂钩进程的地址空间中执行该功能。

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

顺便说一句,从技术上讲,只要不与其他线程进行任何同步,就应该可以在DllMain / DLL_PROCESS_ATTACH中创建一个新线程,尽管不建议这样做。 我不确定如果在注入DLL时执行此操作可能会存在哪些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM