首页
论坛
课程
招聘
[原创]某号称国外最强反作弊如何偷鸡监控和拦截鼠标输入
2021-6-8 19:32 8897

[原创]某号称国外最强反作弊如何偷鸡监控和拦截鼠标输入

2021-6-8 19:32
8897

mouclass.sys!MouseClassServiceCallback(原版)




由于mouclass.sys尚未被PatchGuard保护,所以某国外大厂的FACEIT.sys直接暴力挂上了inlinehook:



可以看到该“大厂”只使用了[rsp+offset_retaddr]作为返回地址


而且仅仅只是上报retaddr,PID,TID等信息,并没有做拦截


完整伪代码:

__int64 __fastcall HookMouClassServiceCallback_faceit(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
  __int64 v4; // r12
  __int64 v5; // rbp
  __int64 v6; // r14
  __int64 v7; // r15
  __int64 *v8; // r10
  __int64 (__fastcall *original_trampoline)(__int64, __int64, __int64, __int64); // r13
  __int64 v10; // rax
  __int64 v11; // rdi
  __m128 *v12; // rax
  __int64 v13; // rbx
  int v14; // eax
  __int64 v15; // rcx
  void *retaddr; // [rsp+48h] [rbp+0h]

  v4 = a1;
  v5 = a4;
  v6 = a3;
  v7 = a2;
  v8 = expected_retaddr;
  original_trampoline = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int64))(qword_7F768 + 8);
  v10 = 0i64;
  while ( (void *)*v8 != retaddr )
  {
    if ( !*v8 )
    {
      expected_retaddr[v10] = (__int64)retaddr;
      v11 = ((__int64 (__fastcall *)(__int64))(qword_7D7C8 ^ qword_7D7D0))(qword_7F1A0);
      if ( v11 )
      {
        v12 = (__m128 *)((__int64 (__fastcall *)(_QWORD, __int64))(qword_7D478 ^ qword_7D480))(0i64, 288i64);// ExAllocatePool
        v13 = (__int64)v12;
        if ( v12 )
        {
          memset(v12 + 1, 0, 0x110ui64);
          *(_QWORD *)v13 = v11;
          *(_QWORD *)(v13 + 8) = retaddr;
          if ( ((__int64 (*)(void))(qword_7CE78 ^ qword_7CE80))()
            && ((int (__fastcall *)(unsigned __int64, _QWORD, _QWORD, _QWORD))(qword_7CFB8 ^ qword_7CFC0))(
                 __readgsqword(0x188u),
                 0i64,
                 *(_QWORD *)(qword_7DA28 ^ qword_7DA30),
                 0i64) >= 0 )
          {
            *(_QWORD *)(v13 + 280) = __readgsqword(0x188u);
          }
          v14 = ((__int64 (__fastcall *)(__int64, __int64))(qword_7CF58 ^ qword_7CF60))(v13 + 16, 32i64);
          v15 = *(_QWORD *)v13;
          *(_DWORD *)(v13 + 272) = v14;
          ((void (__fastcall *)(__int64, void *, __int64, __int64))(qword_7D6E0 ^ qword_7D6D8))(
            v15,
            &unk_53720,
            1i64,
            v13);
        }
        else
        {
          sub_255C4();
          ((void (__fastcall *)(__int64))(qword_7D670 ^ qword_7D668))(v11);
        }
      }
      else
      {
        sub_255C4();
      }
      return original_trampoline(v4, v7, v6, v5);
    }
    v10 = (unsigned int)(v10 + 1);
    ++v8;
    if ( (unsigned int)v10 >= 50 )
      return original_trampoline(v4, v7, v6, v5);
  }
  return original_trampoline(v4, v7, v6, v5);
}


而另一个vgk.sys虽然也挂了inlinehook:



但它品味素质修养明显就比FACEIT.sys高很多


可以看到它也有监控返回地址:



估计是考虑到这个函数有被别人先勾了的可能性,所以vgk获取返回地址用了三种方式:



一种是[rsp+offset_retaddr]


一种是readmsr(MSR_IA32_LASTBRANCHFROMIP)


一种是readmsr(readmsr(MSR_LBR_TOS)+MSR_LBR_NHM_FROM)



需要注意的是,vgk的钩子在trampoline跳转到new routine之前先清除了MSR_IA32_DEBUGCTL的bit0


在call original之前恢复了MSR_IA32_DEBUGCTL的bit0


此举可能是为了防止MSR_IA32_LASTBRANCHFROMIP和MSR_LBR_TOS中的分支ip信息被vgk自己的ip覆盖


以下是完整伪代码:


太长就不发了


不是我说,你们美国人的vgk.sys确实比欧洲人的FACEIT.sys有点素质,真的,不是说夸你们美国人呢


[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

最后于 2021-6-8 19:46 被hzqst编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (15)
雪    币: 1560
活跃值: 活跃值 (882)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
はつゆき 活跃值 2021-6-8 19:35
2
0
沙发
雪    币: 4676
活跃值: 活跃值 (595)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
如斯咩咩咩 活跃值 2021-6-8 19:40
3
0
沙发
雪    币: 4827
活跃值: 活跃值 (2240)
能力值: ( LV7,RANK:150 )
在线值:
发帖
回帖
粉丝
淡然他徒弟 活跃值 1 2021-6-8 19:42
4
0
前排出售瓜子 广告位。
雪    币: 9140
活跃值: 活跃值 (1522)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
Lixinist 活跃值 1 2021-6-8 19:48
5
0
捕捉瓶
雪    币: 199
活跃值: 活跃值 (351)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdjytony 活跃值 2021-6-8 20:41
6
0
dbg yyds!
雪    币: 424
活跃值: 活跃值 (415)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
青丝梦 活跃值 2021-6-8 20:58
7
0
啊这!
雪    币: 7356
活跃值: 活跃值 (8665)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 4 2021-6-8 22:05
8
0
表哥带我撸TP啊
雪    币: 611
活跃值: 活跃值 (575)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_foyotena 活跃值 2021-6-9 10:20
9
0
大黄dog威武
雪    币: 2328
活跃值: 活跃值 (795)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 活跃值 2021-6-9 11:22
10
0
啊这
雪    币: 2315
活跃值: 活跃值 (612)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
杰克王 活跃值 2021-6-11 14:17
11
0
表哥 yyds
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
绝对·零度 活跃值 2021-8-4 07:29
12
0
dbg yyds!
雪    币: 518
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
河北小风 活跃值 2021-8-4 09:08
13
0
表格yyds666
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_青蓝梦 活跃值 2021-9-3 13:39
14
0
用cpp版本的protobuf,不做阉割的话,会在.rdata里面留下完整的proto结构表可以dump出来(别人得评论)
请教下楼主   如何dump啊  有相关得例子么    
雪    币: 1061
活跃值: 活跃值 (1194)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
灵幻空间 活跃值 2021-9-24 18:10
15
0

这种监控方式,绕过也不算难,大表哥yyds

最后于 2021-9-24 18:13 被灵幻空间编辑 ,原因:
游客
登录 | 注册 方可回帖
返回