胡和君
胡和君,腾讯游戏安全高级工程师,现就职于腾讯游戏安全中心,从事PC端游戏安全相关工作8年多,涵盖新游戏安全评审、游戏外挂分析与对抗、游戏漏洞分析与应对、安全方案开发等方面,长期负责公司多款头部FPS类游戏安全对抗工作,积累了丰富的游戏安全实践经验,尤其擅长定制化分析及应对FPS类游戏安全风险。
胡和君:大家好,今天我分享的议题是“定制化对抗——游戏反外挂的安全实践”。我来自腾讯游戏安全中心,09年就开始做穿越火线的外挂对抗,现在也是负责多款FPS类游戏的安全工作。与透视、自瞄这样的外挂功能对抗了8年,因此今天来分享一下在这8年的实践中,积累的一些解决思路。
定制化对抗是什么?就是三个字母——IPO。看着好像挺熟悉,想想也挺激动。可是我这里的这个IPO,并不是为了做公司上市的IPO,而是对游戏的一个抽象。
游戏被抽象成什么呢?被抽象成为了一个输入,一个输出,和一个处理过程。游戏其实也就是通过一些输入,比如动动鼠标、敲敲键盘、划划屏幕、或是摇摇手机。然后通过游戏的一些逻辑或是处理流程,最终给到玩家一个反馈,比如移动了、攻击了、成功了、失败了、吃鸡了等等。
而其实除了游戏以外,其他任何的虚拟世界的一个场景或是一个是业务都是可以被抽象成一个IPO的过程。而我们的安全问题,其实也就是和这个IPO过程相关。
安全的问题,往往要么是制造一些非法的输入,比如通过精心构造的参数进行漏洞的触发和利用,要么是对中间过程进行一些篡改,比如病毒对系统的劫持感染,又或是对输出的结果的攻击,比如勒索病毒将正常的文件进行加密,或是诈骗木马将浏览器劫持访问一些非法的网站。
对于游戏来看,常见的一些外挂功能,比如模拟按键是针对输入的攻击、比如修改内存实现的秒杀无敌等功能是针对中间过程的攻击、而透视这样的外挂功能则是给游戏的输出进行了攻击,让你看到了本来不应该看到的东西。
说到防御,通常的方案往往是铸建一个类似城墙的东西,把所有的各式各样的攻击拦截在外面,使得我们的游戏或是其他业务逻辑的IPO能够正常并顺利的运行下去。
但是我们是知道的,天下没有不透风的墙。所以世上没有绝对的安全。那我们还可以怎么做呢?自然就是需要将防御方案深入到业务逻辑当中去,实施定制化的方案。
假设右图是游戏逻辑的一个抽象,而所谓的定制化对抗,就是在除了外城的围墙以外,在具体的每个节点进行防御。而每个节点自身其实也就是一个IPO的过程。所以所谓定制化的对抗,就是从最小单元的IPO所展开进行的,在每一个游戏逻辑的节点以及游戏的路径上进行安全方案的防御和安全方案的部署。
下面就用FPS类游戏常见的自瞄外挂对抗的一个例子,来介绍如何进行定制化方案的建设。因为要深入到游戏逻辑中去进行防御,因此我们先要对游戏自身的逻辑进行IPO的分解。
游戏的瞄准逻辑非常容易理解,且很简单。其输入就是鼠标移动后的delta值,不同的游戏对这个delta值的处理不一样,而对FPS游戏来讲,其中间过程就是把鼠标这类设备输入的delta值转换为游戏逻辑中的Rotation,可以理解为一个朝向。
如果形象一点来理解,可以把朝向认为就是现实生活中的脑袋。就是通过旋转脑袋来改变视野,而当瞄准以后,也就是所谓的输出,则往往是通过游戏内红名,或是人物描边等方式来展现。
对游戏的逻辑进行拆分以后,自然攻击的方法也就非常的明显。而我们防御手段则可以依据攻击方式进行见招拆招。
如何见招拆招?实际就是找不同,针对攻击后的差异点分析。
首先,来看看输入。直接秒想到的就是模拟按键。自瞄就是帮玩家瞄准,模拟按键就是一种帮忙的方式。而这种方式与正常的游戏有什么差异呢?最大的差别就是一种是真实按键,另一种是模拟按键。
不过判断是否是真实安全的防御检测应该是外城墙所干的事情。那从结合业务逻辑的角度来看,又有什么差别呢?实际就是这个鼠标移动的delta值的变化规律。
看看右图的示例,假设要想控制鼠标从A点移动到B点,对于模拟按键来看,这个变化规律是程一条直线,而人的正常移动则如第二个图所示,会有抖动,不是那么平滑。
我们只要通过获取游戏的鼠标输入数据,然后对移动数值进行建模就可以识别出人与机器的差别。当然,模拟按键也可以模拟人的鼠标移动变得不是那么的平滑,但是从最终的数据表现来看,人的不确定性和外挂的相对稳定性是一个非常明显的差异。
在输入这一层找到差异后,继续往后,在中间过程这里,没有什么影响,模拟按键的方式很难影响游戏正常的Rotation转换过程。但是到了输出,也就是游戏的表现层。则是很明显自瞄的外挂比正常的玩家瞄得更准。
而这个准如何去判断识别呢?可以从多个纬度去看,比如,因为瞄得准,因此杀人多,故KD比比较高,KD比也就是击杀和死亡比。又比如因为瞄得准,所以爆头率高。
因为FPS游戏是两兵相遇准者活,这个准除了指能命中,更深入一点就是命中部位。因此也可以针对命中部位的聚集性进行建模。瞄得准,那他的命中部位是会有更明显的集中的。
然而在这个过程中可能也会遇到职业玩家的挑战,因为水平高的玩家实际也就是瞄得准。所以接下来还需要看看正常瞄得准的和使用外挂瞄得准的差别,通过数据分析发现高手玩家瞄准和开枪这两个步骤是一气呵成的,非常连贯。但是作弊玩家这两个环节往往容易出现分离,也就是中间会有时差。总之就是按照找不同的方法去进行,一定可以发现作弊与非作弊的差异。
至此,模拟按键方式实现自瞄的找不同也就结束,对应的我们主要也就形成了基于delta的变化规律检测方案,结合击杀、命中部位、开枪时机等数据的准度识别检测方案。接下来我们再看看攻击方式,除了针对输入层进行攻击以外,针对中间过程也是一个很直接的攻击手段。大家也很容易想到,那就是可以通过修改内存,直接修改Rotation数值来达到瞄准的效果。
修改Rotation数值的方式在游戏逻辑侧有什么差别?
从输入层来看,因为修改中间过程靠后因此对输入无影响。而从输出来看其实也就是和前面提到的模拟按键的最终效果一致。结合开枪、命中、击杀的准度识别检测方案也能够有所覆盖。而重点来看中间过程这里,实际最大的影响就是鼠标移动的delta到Rotation的计算结果发生了变化。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)