2009-06-21 31 views
1

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

那么我想要做什么?当你不拥有附加程序(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) 
{ 

} 

感谢

回答

1

你不能那样做,因为DLL注入到一个不同的过程,你想在地址执行功能你的挂钩过程的空间。

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

顺便说一句,在技术上你应该能够在DllMain/DLL_PROCESS_ATTACH中创建一个新的线程,只要你没有与其他线程进行任何同步,尽管它不被推荐。我不确定如果在注入DLL时执行此操作可能存在什么问题。