You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让含无限循环的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:36