2009-06-21 77 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時執行此操作可能存在什麼問題。