dll 线程调用游戏主线程,30分-1小时崩溃

探讨DLL注入游戏实现自动选怪、判断攻击状态及自动攻击功能时出现的崩溃问题。作者尝试通过去除无限循环并将代码放入时钟来解决,但效果不佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:dll 注入游戏后,开线程 自动选怪-》判断是否可攻击-》攻击


while(1)
{
    if(选中 && )
    {
         if(是否可攻击)
       {
               攻击
        }
    }else
    {
         循环当前场景怪物,回去最近怪物并选中;
    }
   sleep(1000);
}


以上是线程中的写法。
开启线程后,30分钟到1小时差不多的时间,就崩了,有时候会更少。windbg 挂起来,也没找到,dll 哪里出问题。后来得知是dll线程和游戏主线称冲突。
有人说,找到出错的调用,安装键盘钩子,用时钟调用。但终究不是正经的解决办法。
求大神看看。如何解决。
注:我去掉while(1) 然后将里面的代码,放到时钟里面,2-3小时都没问题。
此问题,困扰太久了,希望能有高手指点。
因为我之前是用c# 的,想着能有异步来代替线程,发现异步也是开启线程来执行。
这几周来寻求解决办法,无果,希望懂得的你能不吝赐教。
### 易语言中实现主线程注入DLL的方法 #### 获取目标进程句柄 为了向指定的游戏进程中注入DLL,首先需要获得该进程的句柄。这可以通过`OpenProcess()` API完成,在易语言中可通过声明外部函数的方式调用此API。 ```cpp // 声明 OpenProcess 函数 extern "C" { int OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); } ``` #### 配远程内存空间 接着要在目标进程中配一块用于存储待加载DLL路径字符串的空间,通过`VirtualAllocEx()`来创建这块区域,并将本地准备好的DLL文件名复制过去。 ```cpp // 定义 VirtualAllocEx 和 WriteProcessMemory 外部接口 extern "C" { void* VirtualAllocEx(int hProcess, void *lpAddress, size_t dwSize, int flAllocationType, int flProtect); bool WriteProcessMemory(int hProcess, void *lpBaseAddress, char *lpBuffer, size_t nSize, size_t *lpNumberOfBytesWritten); } ``` #### 创建远程线程启动DLL载入过程 最后一步是在远端进程中启动一个新的线程去执行LoadLibraryA()操作从而真正意义上把DLL引入到对方环境中运行。这里涉及到的关键Win32 API为`CreateRemoteThread()`。 ```cpp // CreateRemoteThread 接口定义 extern "C" { HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); } // LoadLibrary 地址获取 extern "C" { FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName); } ``` 上述所有步骤均需按照顺序依次实施才能成功地让DLL被嵌入至目的程序内部并随其一同运作。值得注意的是,由于不同版本Windows操作系统可能存在差异性的安全机制(如DEP、ASLR),因此实际开发过程中可能还需要额外处理这些因素带来的挑战[^2]。 对于提到的游戏崩溃问题,考虑到可能是由多线程同步不当引起的情况,建议尝试调整逻辑结构使之更加稳定可靠,比如采用事件驱动模型而非简单的轮询方式;另外也可以考虑利用消息循环挂钩技术替代直接修改游戏行为的做法以减少潜在风险[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值