DLL死循环注入后卡死解决方法
对于DLL死循环注入后卡死的问题,我们可以通过以下几个方面来解决:
一、检查注入的DLL是否合法
在DLL注入的过程中,如果我们注入的是一个有问题的DLL,那么就很容易出现死循环或者其它异常情况。因此,在注入之前,我们需要检查一下DLL的可靠性和合法性。具体操作如下:
//加载DLL HINSTANCE hDll = LoadLibrary(L"inject.dll"); //校验DLL是否加载成功 if (!hDll) { printf("LoadLibrary failedn"); return 0; } //获取注入函数指针 FARPROC fn = GetProcAddress(hDll, "StartInject"); if (!fn) { printf("GetProcAddress failedn"); return 0; }
二、防止DLL内部出现死循环
在编写DLL时,我们需要注意内部是否出现死循环,如果出现死循环,则会导致卡死等问题。因此,在编写DLL时要注意以下几点:
1、尽量不要使用递归函数;
2、尽量不要使用死循环;
3、尽量不要在一个函数中同时锁定多个线程。
//错误示范(死循环) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { while (true) { //do something } return TRUE; } //正确示范 BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { //do something } return TRUE; }
三、使用线程池
如果我们注入的DLL中有很多线程,那么就会导致系统资源的浪费,从而导致卡死的情况出现。因此,我们需要使用线程池,来避免线程的浪费。具体操作如下:
//创建线程池 HANDLE ThreadPool = CreateThreadpool(NULL); //设置线程池最大线程数 SetThreadpoolThreadMaximum(ThreadPool, 50); //设置线程池最小线程数 SetThreadpoolThreadMinimum(ThreadPool, 10); //提交线程池任务 SubmitThreadpoolWork(Work, NULL);
四、使用定时器
如果我们注入的DLL中有定时任务,那么就有可能会导致系统卡死的情况。因此,在编写定时任务时,我们需要注意,不要让任一定时任务的执行时间过长,同时我们可以使用定时器来对定时任务进行控制。具体操作如下:
//创建定时器 HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL); //设置定时器间隔 LARGE_INTEGER liDueTime; liDueTime.QuadPart = -10 * 1000 * 10000; //10秒 SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0); //等待定时器 WaitForSingleObject(hTimer, INFINITE); //处理定时任务 ...