首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动线程恢复c++

自动线程恢复c++
EN

Stack Overflow用户
提问于 2018-06-13 07:53:30
回答 2查看 624关注 0票数 4

我为一个游戏构建了简单的防作弊模块,我需要保护线程免受暂停(比如从Processhacker挂起线程)。

如果挂起,是否有自动恢复线程的方法?

下面是我的模块代码:

代码语言:javascript
运行
复制
#include "stdafx.h"
#include "Start.h"

void Msg_Sf_Br(){
    MessageBoxA(NULL,"SpeedHack - Detect", load.Nome_das_Janelas, MB_SERVICE_NOTIFICATION | MB_ICONWARNING);
ExitProcess(0);
} 

void Msg_Sf_En(){
    MessageBoxA(NULL,"SpeedHack - Detect", load.Nome_das_Janelas, MB_SERVICE_NOTIFICATION | MB_ICONWARNING);
ExitProcess(0);
}

void Speed_perf()
{
if( *(unsigned long*)QueryPerformanceCounter != 2337669003 ){
if (load.Log_Txt_Hack == 1){
}

    if (load.Message_Warning_En == 1){
    ExitProcess(0); 
}
    if (load.Message_Warning_En == 2){
    CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(Msg_Sf_Br),NULL,0,0);
    Sleep(3000); 
    ExitProcess(0);  
}

    if (load.Message_Warning_En == 0){
    ExitProcess(0);
    }
    else
    ExitProcess(0);
}
}


void performance(){
    if (load.Anti_Kill_Scans == 1)
    {
again:
    Speed_perf();
    Sleep(load.Detecta_Speed_PerformanceT);
    goto again;
}
    else
    {
again2:
    Speed_perf();
    Sleep(load.Detecta_Speed_PerformanceT);
    goto again2;
}
}

void SPerformance(){
    CreateThread(NULL,NULL,LPTHREAD_START_ROUTINE(performance),NULL,0,0);
    }

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-24 23:17:54

使用一个小技巧,您可以隐藏您的线程对任何调试器或工具,如进程黑客。

代码语言:javascript
运行
复制
void func() 
{
}

int main()
{
    int(__stdcall* ZwCreateThreadEx)(HANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, HANDLE, PVOID, PVOID, ULONG, ULONG_PTR, SIZE_T, SIZE_T, PVOID) = (decltype(ZwCreateThreadEx))GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwCreateThreadEx");
    HANDLE hThread=0;
    ZwCreateThreadEx(&hThread,0x1FFFFF,0,GetCurrentProcess(), 
            (LPTHREAD_START_ROUTINE)func,0, 0x4/*hide flag*/,0,0x1000,0x10000,0);
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2018-12-24 17:55:09

你可以这样做:

  • 使用CreateToolhelp32Snapshot获取进程线程ids列表
  • 转到使用方法的第一个线程:Thread32First
  • 对于每个找到的线程(您应该检查是否属于给定进程):
  • 然后使用OpenThread方式打开线程,从线程id中检索线程的句柄,
  • 当您有句柄时,可以使用SuspendThread以检索前一个暂停计数的方式挂起线程,
  • 然后,您可以继续线程,直到它的暂停计数为0。您必须以至少一次的方式恢复,以取消上一步中的暂停。
  • 如果不允许挂起线程,即使没有挂起,也可以使用ResumeThread获取挂起计数。
  • 使用CloseHandle关闭线程句柄
  • 迭代到下一个线程使用Thread32Next

以能够完成整个任务的方式,您必须作为管理员运行。

下面是一个示例:

代码语言:javascript
运行
复制
void TraverseProcessThreads(DWORD pid)
{
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); //get list of all system thread
  if( hSnapshot == INVALID_HANDLE_VALUE)
  { 
     //print error and return;
     return;
  }
  THREADENTRY32 threadEntry;
  if( Thread32First( hSnapshot, &threadEntry) ) 
  {
     size_t threadsCounter = 0, suspendedThreadsCounter=0;
     do{
       if(te.th32OwnerProcessID == pid) //we get all threads in system, should filter the relevant pid.
       {
         threadsCounter ++; //found thread
         HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,FALSE,te.th32ThreadID); //get  handle to thread from its thread id
         if(hThread == NULL) //
         {
           //print error and break. (will be permission error if not administrator)
           break; 
         }
         int suspensionCount = SuspendThread( hThread ) ;//will return previous suspension count. you can also use ResumeThread if there's no way it can be suspended.
         if(suspensionCount > 0) 
         {
            //thread was suspended 
            suspendedThreadsCounter ++;   
         }
         //cancel our suspension... 
         suspensionCount = ResumeThread(hThread );

         /*to resume suspended thread use ResumeThread until it return 1.
         do{
           suspensionCount = ResumeThread(hThread );
         }while (suspensionCount > 1); //similar to Suspend Resume return previous Suspention count. 
         */   
       }  
       CloseHandle(hThread);      
     }while(Thread32Next( hSnapshot, &threadEntry) );
     //print results:
     cout<<"process id"<<pid<<endl<<" has "<<threadsCounter <<" threads " <<endl
       <<suspendedThreadsCounter <<" threads was suspended"<<endl;
  }
  else{
    //print some error...
  } 
  CloseHandle(hSnapshot);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50831861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档