首页
社区
课程
招聘
[原创]游戏反外挂技术揭秘
发表于: 2022-1-7 22:24 34388

[原创]游戏反外挂技术揭秘

2022-1-7 22:24
34388

万字长文!inlinehook看这一篇足够了!

远程线程+hook=监控?

硬件断点

硬件断点hook

实战!谁动了我的代码!

前面的文章,我们介绍了inline hook、硬件断点hook、远程线程、代码完整性校验。其实都是为了本篇文章做铺垫,作者做过3年的游戏反外挂工作,今天就把反外挂技术做一个总结。

反外挂工作感悟

永远在路上

没有破解不了的反外挂系统,反外挂是一个对抗过程,需要不断升级。我们反外挂小组会采取对抗方式提升防御,也会研究竞品来获取灵感。反外挂也是非常有意思的,可以学到很多很多底层知识。

善战者无赫赫之功

反外挂,很难做出成绩,你把游戏保护的固若金汤,你会显得很平庸,可有可无。但是如果一旦有一款外挂不能及时防御,你又会显得很无能,所以我选择离开这个行业,主要是所在城市没有太多选择。

本文的结构如下:
结构图

1 反调试

反调试是反外挂中很重要的环节,可以提高外挂作者的门槛。每一种反外挂手段我们成为“暗桩”,其实没有不能破解的反外挂手段,但是如果“暗桩”太多,对于外挂作者也是很难调试游戏的。

下面开始介绍一些反外挂手段。 这里有一个很好的网站,里面包含8大类反调试技术,感兴趣可以看一下。
https://anti-debug.checkpoint.com/

1.1 调试检测

1.1.1 执行时间

当游戏被调试时,运行肯定会变慢,我们可以检测游戏主循环的运行时间,来判断是否被调试,实际上这种检测是最难拔出的“暗桩”。

1.1.2 调试位检测

windows提供了一些api来检测,例如IsDebuggerPresentCheckRemoteDebuggerPresent

// IsDebuggerPresentstatic bool xx_is_debug_1() {
	return IsDebuggerPresent();}// CheckRemoteDebuggerPresentstatic bool xx_is_debug_2() {
	BOOL debuged = false;
	bool ret =  CheckRemoteDebuggerPresent(GetCurrentProcess(), &debuged);
	return ret && TRUE == debuged;}

1.2 硬件断点检测

硬件断点既是调试手段、也是一种hook手段,反外挂时一定要检测的。检测时有两种手段:

  1. GetThreadContext:获取寄存器信息,判断Dr0~Dr3如果不是0,则被下了硬件断点。
  2. 硬件断点占坑:硬件断点只有4个,反外挂系统把硬件断点占住,我只要检测我的断点存在即可。

我使用了硬件断点占坑方式检测,因为调用GetThreadContext检测时容易被hook。

后期我们做对抗时,发现可以用设置内存属性,来绕过硬件断点占坑,以后会写一篇文章来介绍。

2 外挂检测-特征

游戏反外挂系统会“主动出击”,检测一些“知名”的通用外挂工具,例如cheat engine、OD调试器、变速齿轮等。检测的方式可以是进程名、窗口名、模块名(dll)等信息。反外挂系统还会从服务端动态拉取一些特征库,实现不停服升级反外挂系统。

当然特征检测主要还是为了提高外挂制作门槛,不能起到太大作用,有胜于无吧。

3 自我保护

游戏反外挂系统做的再牛,把游戏保护的再好,但是如果反外挂系统被本身干掉了也就白玩了,所以自我保护是重中之重。

3.1 反外挂线程保护

反外挂系统会启动一个反外挂线程来检测,不在主线程运行,以免拖慢游戏程序,首先我们就要保护反外挂线程不被干掉。

我们采取使用游戏主线程与反外挂线程守望相助,由主线程专门来检测反外挂线程的存货,反外挂线程可以采取更新变量、信号等方式通知主线程自己存活。如果主线程检测到反外挂线程不正常工作,就退出游戏程序。

3.2 安全退出

当发现外挂或发现被调试时,游戏程序会弹框提示玩家,然后再退出游戏。如果不做保护,外挂作者可以从弹框入手、顺藤摸瓜来分析反外挂的工作原理,然后指定破解方法。

这里主要防御手段是:延迟退出;堆栈清理。

3.2.1 延迟退出

当发现异常后,反外挂系统不会立即退出,做个标记然后等一会退出,这样被分析时也不会是第一线程,无法定位工作原理。

3.2.2 堆栈清理

弹框时,我们要做堆栈清理,把堆栈弄乱,让外挂作者无法分析调用关系。

    DWORD dwEBP = 0,dwEBPMain = m_MainEBP.GetT();
    __asm    {
        mov dwEBP,ebp    }
    while (dwEBP < dwEBPMain)
    {
        *((DWORD*)dwEBP) = 0;
        dwEBP += 4;
    }

4 游戏保护

游戏保护是反外挂的根本,是反外挂系统的内功,以不变应万变。

4.1 代码保护

代码保护时要考虑执行效率,进行不同的保护手段。

  • 反外挂代码:加壳保护,加壳可以混淆代码,增加调试难度。我选择使用宇宙最强壳,vmprotect。
  • 游戏代码:游戏代码要考虑效率,无法加壳。这里就使用前面介绍的代码完整性校验,把PE文件重定位、修复导入表以后进行校验。

4.2 数据保护

一些游戏内存数据也需要进行保护,一些敏感字符串,一些重要游戏属性。

  • 字符串保护:例如“发现外挂”,如果明文保存,很容易被od搜索出来,然后定位使用的位置。我们采取简单加密,只要搜索不出来即可。
  • 游戏内存保护:我采取动态多级指针,每次启动随机指针的级数,这个不知道作用有多大,毕竟没和外挂作者讨论过。很多保护措施都是我们反外挂小组攻防实验时,加固的。

5 信息收集

信息收集是反外挂系统的重要组成部分,可以帮助我们收集玩家使用外挂证据、收集外挂等。

  • 玩家监控:我们会重点监控“重点玩家”的信息,重点玩家来自于玩家举报,我们会加入监控观察一周。
  • 游戏程序修改:反外挂系统会全量检测游戏.exe和d3d9.dll的代码段,发现修改就把版本和修改的地址上报,会定时分析其中可疑的味道。
  • 文件上传:这个功能有点流氓,我们控制台可以指定上传玩家本地的文件,是我们收集外挂的重要手段。

最后,求关注、点赞、转发,谢谢~
求关注


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 13
支持
分享
最新回复 (33)
雪    币: 1475
活跃值: (14652)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
2
表哥检测关一下?
2022-1-7 23:24
1
雪    币: 3545
活跃值: (4679)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
揭秘的很好 下次不要揭秘了 很尬
2022-1-8 01:16
1
雪    币: 1028
活跃值: (720)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
揭秘的很好 下次不要揭秘了 很尬
2022-1-8 02:24
1
雪    币: 4708
活跃值: (4214)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
执行时间检测 实际上一些调试器早就有应对措施了 当调试器附加程序后会加速目标程序的运行速度 你们的方法还不够猥琐
2022-1-8 10:47
0
雪    币: 7852
活跃值: (2254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
文件上传 未经同意就偷偷上传文件 告到你破产
2022-1-8 12:02
4
雪    币: 549
活跃值: (2703)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
木志本柯 执行时间检测 实际上一些调试器早就有应对措施了 当调试器附加程序后会加速目标程序的运行速度 你们的方法还不够猥琐[em_48]
会和服务端对时啊,例如ping pang
2022-1-9 22:16
0
雪    币: 549
活跃值: (2703)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
friendanx 文件上传 未经同意就偷偷上传文件 告到你破产[em_28]
早就离职啦
2022-1-9 22:16
0
雪    币: 4708
活跃值: (4214)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
assqqq 会和服务端对时啊,例如ping pang
如果只是检测运行时间就认为是调试器的话 这种时候你没有足够的证据证明对方一定开了调试器 那么也就只是断开连接退出游戏而已 对方还是会在上号几次反复后要分析的数据都拿到了  这种一看就存在极大缺陷的设计防御效果不理想还误报严重 完全是弱鸡设计
2022-1-9 23:14
0
雪    币: 549
活跃值: (2703)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
木志本柯 如果只是检测运行时间就认为是调试器的话 这种时候你没有足够的证据证明对方一定开了调试器 那么也就只是断开连接退出游戏而已 对方还是会在上号几次反复后要分析的数据都拿到了 这种一看就存在极大缺陷的设计 ...
不完全靠时间检测啦,只是一个暗桩。这样的暗桩多了据说还是很恶心人的。
2022-1-9 23:30
0
雪    币: 50
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whm
11
同样做了2年,感到前途迷茫,没有尽头
2022-1-10 09:07
0
雪    币: 549
活跃值: (2703)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
whm 同样做了2年,感到前途迷茫,没有尽头
端游还是手游?
2022-1-10 10:03
0
雪    币: 864
活跃值: (5124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
写的不错蟹蟹分享
2022-1-12 11:17
0
雪    币: 14806
活跃值: (6043)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14

不存在揭秘?都是这些套路。
楼主离开是对的,因为的确没什么效果。关键是不能或者说很难知彼,所以反外挂水平很难提升。因为如果外挂成功了就意味着你的所有反外挂套路失败,而失败也就是意味着你一直蒙在鼓里、不知道被反了,所以你怎么会去更新新的套路?再说你不知道怎么被反的,你也无法写出针对性代码。

最后于 2022-1-12 14:50 被tDasm编辑 ,原因:
2022-1-12 14:46
0
雪    币: 69
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Esc
15
很好,学习了。
2022-1-15 21:01
0
雪    币: 412
活跃值: (2161)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
16
自己游戏本身的业务数据分析一点都不带?
2022-1-15 21:39
1
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
感谢您的信息
2022-1-27 14:41
0
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
@assqqq
还揭秘,楼主在是不是小朋友,不要说VT秒杀你
现在还有更牛逼的,工作室两台物理机一根线,物理调试,读写内存,永久过保护,估计楼主还停留在软件层面
2022-1-31 17:10
2
雪    币: 145
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢您的信息
2022-1-31 18:14
0
雪    币: 565
活跃值: (562)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
文件上传 = 侵犯隐私 = 法院传票 =(用户量大) 刑事拘留
2022-2-18 20:22
1
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
苏苏苏苏苏苏 文件上传 = 侵犯隐私 = 法院传票 =(用户量大) 刑事拘留
SZ=旋律=神盾=GS=圈钱
2022-2-21 13:02
1
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
22
苏苏苏苏苏苏 文件上传 = 侵犯隐私 = 法院传票 =(用户量大) 刑事拘留
SZ=旋律=神盾=GS=圈钱
2022-2-28 13:03
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
23
苏苏苏苏苏苏 文件上传 = 侵犯隐私 = 法院传票 =(用户量大) 刑事拘留
GS_context.bin = instant ban = 封号肯定不是我的问题是你电脑里有小电影没删干净
2022-2-28 13:04
0
雪    币: 7527
活跃值: (1181)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
其实我也想问封号的问题…有时候是莫名其妙的
2022-3-2 01:47
0
雪    币: 183
活跃值: (2427)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
揭秘的很好,下次不要揭秘了,很尬。
2022-4-2 12:04
0
游客
登录 | 注册 方可回帖
返回
//