如何让含无限循环的DllMain返回TRUE以避免注入器挂起?
解决DllMain中无限循环导致无法返回TRUE的问题
这问题我之前也踩过坑!核心原因是DllMain是系统加载器调用的,它必须快速返回——你在里面塞无限循环,系统会一直卡在等待DllMain执行完成的状态,注入器自然就挂起了。要保留无限循环逻辑同时让DllMain正常返回,最靠谱的方案是把循环移到单独的工作线程里。
具体实现思路如下:
- 在
DLL_PROCESS_ATTACH分支中,创建一个新线程,把你的无限循环逻辑放到线程函数里执行 - 启动线程后,直接让DllMain返回
TRUE,这样系统的DLL加载流程就能正常走完,注入器也不会被卡住
修改后的代码示例:
#include <windows.h> // 全局标志:用来安全控制线程退出(可选,但推荐在DLL卸载时清理) volatile bool g_isThreadRunning = true; // 工作线程函数,承载你的无限循环逻辑 DWORD WINAPI WorkerThread(LPVOID lpParam) { while (g_isThreadRunning) { // 这里放你原本的循环代码 // 建议加个Sleep避免线程占用100%CPU资源 Sleep(100); } return 0; } BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: MessageBox(0, "all ok", "injection ok", 0); // 创建工作线程,把循环逻辑转移到后台执行 CreateThread(NULL, 0, WorkerThread, NULL, 0, NULL); break; case DLL_PROCESS_DETACH: // 卸载DLL时,通知线程退出(如果需要安全清理的话) g_isThreadRunning = false; // 若要更严谨,可以保存CreateThread返回的线程句柄,这里简化处理 break; } return TRUE; }
几个需要注意的细节:
- 线程函数必须符合
DWORD WINAPI (*)(LPVOID)的签名要求 - 用
volatile修饰线程控制标志,避免编译器优化导致线程无法感知状态变化 - 循环内加入
Sleep能有效降低CPU占用,避免影响宿主进程性能 - 如果需要更严谨的线程管理,可以保存
CreateThread返回的线程句柄,在DLL_PROCESS_DETACH时调用WaitForSingleObject等待线程完全退出
这样修改后,DllMain就能正常返回TRUE,注入器不会挂起,你的无限循环逻辑也能在后台稳定运行啦!
内容的提问来源于stack exchange,提问作者yellowmen22
相关产品推荐
相关产品推荐

