分类
游戏安全

EasyAntiCheat BattlEye AntiDebug

EasyAntiCheat /BattlEye

分享前些时间研究EAC普通版的 和去年BE(Pubg高级版)  反调戏吧 相比国内的反作弊弱势了很多
asyAntiCheat AntiDebugAntiHandleHijack:
句柄引用计数检测 由回调添加 进实时监测 <目标进程,句柄> 超过1即 关闭游戏 因直接结束进程  EAC也会跟着退出所以 正常任务管理器没有影响,这也是不关闭游戏直接关机时它会提示有趣的Detected 0x*****的原因了~
2020/5/8添加 :在EAC高级版本中 创建了线程去检测被保护进程的句柄权限,并禁用了句柄计数检测。

AntiDebugThreadAttach: 
防止附加 因DebugActiveProcess会创建一条触发int3的线程 来让调试器中断  EAC是这样做的:线程创建检测由内核线程回调检测 如果有ntdlladdress/noimage的地址 直接结束游戏进程并提示Detected 0x*****

AntiHardBreak:
反硬件断点监测  首先它这里用了两个方法 主逻辑线程由驱动程序手动置位线程的hidedebug位 其他线程调用NtSetThreadInformationBattlEye AntiDebug
补充 如EAC这样操作:
```c
__int64 __usercall GetThreadCrossThreadFlagsOffset@<rax>(signed int a1@<r14d>)
{
  unsigned int v1; // ebx
  __int64 PsIsThreadTerminating; // rax
  signed int v4; // er8
  __int64 v5; // rsi
  unsigned __int64 i; // rdi
  char a2; // [rsp+28h] [rbp-30h]
  int v8; // [rsp+49h] [rbp-Fh]

  v1 = PsIsThreadTerminatingOffset;
  if ( PsIsThreadTerminatingOffset != -1 )
    return (unsigned int)PsIsThreadTerminatingOffset;
  PsIsThreadTerminating = Import((__int64)&unk_FFFFF8035C590E48);
  v5 = PsIsThreadTerminating;
  if ( PsIsThreadTerminating )
  {
    for ( i = PsIsThreadTerminating; i < v5 + 0x18; i += (unsigned __int8)a2 )
    {
      asm_engine((unsigned __int8 *)i, &a2, v4);
      if ( _bittest(&v8, 0xCu) )
        break;
      if ( *(_WORD *)i == 0x818Bu || *(_WORD *)i == 0x808Bu )
      {
        v1 = *(_DWORD *)(i + 2);
        PsIsThreadTerminatingOffset = *(_DWORD *)(i + 2);
        break;
      }
      if ( *(_BYTE *)i == 0xC2u || *(_BYTE *)i == 0xC3u )
        break;
    }
  }
  if ( v1 == -1 )
    v1 = 0;
  PsIsThreadTerminatingOffset = v1;
  return v1;
}

char __stdcall SetThreadCrossThreadHideDebug(__int64 a1)
{
  signed int v1; // er14
  char v2; // bl
  __int64 v3; // rdi
  unsigned int v4; // eax

  v2 = 0;
  v3 = a1;
  if ( a1 )
  {
    v4 = GetThreadCrossThreadFlagsOffset(v1);
    if ( v4 )
    {
      v2 = 1;
      *(_DWORD *)(v4 + v3) |= 4u;
    }
  }
  return v2;
}

(Pubg/H1z1)Pubg的反调试在我研究时 相比较H1z1的反调试弱一些 同时并没有EAC对句柄计数的检测,而是内核中直接遍历某些进程的句柄权限 剥离权限.时间有些久可能有些疏漏

AntiHandleHijack:
内核遍历lass等进程剥离其相关权限,csrss采取的是挂钩进入它的内核 检查返回地址 如果有问题bsod.

AntiDebug:
句柄异常检测/CloseHandle(x)如果挂接了调试器 那么内核会模拟一条异常.通常调试器 选择忽略所以被检测系统拦截到 由此检测到调试。
H1z1利用了异常来作为进入游戏时的Dx相关初始化措施 如果触发会爆炸

AntiHardBreak:
调用NtSetThreadInformation Thread.hidedebug位
其他的都是差不多通用了:

…NtQueryProcessInformation …Peb.Debug
2019.4.19 补充 EAC :AntiCreateThread-RtlUserThreadStart ->Jmp PtrTo(EAC Replace Here) BaseInitializeContext (CONTEXT* pContext, PPEB pPeb, PVOID pEntryPoint, DWORD dwInitESP, DWORD dwEipType)

2020.6.2 补充 EAC高级版(V3) 在其驱动程序中调用PsGetProcessDebugPort/PsIsProcessBeingDebugged 检测用户模式调试.
在其所有 用户模式反作弊模块中 有疑似利用ProcessInstrumentationCallback(具体看:https://blog.renjing.wang/698.html)检测调试器

总结:国外反作弊程式并未对反调试做太多检测处理.

FAKE

研究商业反作弊.

“EasyAntiCheat BattlEye AntiDebug”上的3条回复

你是怎么查看EAC hook的呀
我上pchunter 被检测根本加载不了驱动
也没法换自己的签名
大佬可以给个思路吗

请教下大佬,一般这种保护方案要怎么去分析他的内核反调试呢,因为如果对KdDebuggerEnable等一些变量下访问断点的话,系统就会蓝屏,但是其他又没有比较好的思路,困惑很久,大佬能不能稍微解答下

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据