外挂攻防

很久以前的一个梦

小时候,玩qq农场的时候就在想,啊啊啊,我的菜呢,为啥别人家的菜都这么及时收

然后就想要是我有个外挂定时收菜就好了~

然后就入行了程序员, 辗转若干年, 发现虽然成为了程序员,但是还是没有了解过外挂,这趁着有空,学习了一把~

声明: 本过程没有任何真人受到伤害!

外挂的类型

学习一把之后发现了外挂的攻防游戏已经进展到了你死我活, 玩家要么放弃一切隐私否则只能成为陪玩的地步~

直接干

最简单的外挂当然是 直接读写游戏进程的内存。 windows居然能提供api OpenProcess直接获取读写其他进程内存的权限,这让我大为震惊。那么如果不做防范的话,当然直接读写就完事了,没有例外。如果是普通的单机游戏、 小公司的游戏的话,这样也足够了。当然,大名鼎鼎的csgo甚至也能这样直接拿到权限,这让我难以想象。

而如果采取dll注入方法插入游戏进程,也是这一类里,但是他们只要检查自己的进程代码内存就可以逮捕了,并无差异。

只不过这又有个问题,他们可以通过微软的api ObRegisterCallbacks 审核调用权限的请求,将坏蛋逮捕封号,这增大了人们开挂的难度。

伪装成系统服务

这时候, 有坏蛋就想了, 如何能够绕过检测呢? 有的小聪明就发现了, 有些进程本身就需要获取游戏进程内存的权限,如discord.exe, obs等。 那么我伪装成他们不就行了? 于是就有了dll注入和句柄劫持。 我把我的外挂注入到这种白名单进程里,你无法不给我放行,那你又能奈我何?? 毕竟你如果不放行,那游戏本身可能就无法正常运行,如discord。 而你又不能不让用户直播(obs)。

这时候想要打击就必须“看”其他进程,其他设备的内存,甚至严格一点的更会扫盘了(不过我仍然无法理解扫盘这一行为,因为实际上可以从远端读取二进制,没必要本地存,那扫了也没用,只能说是提高了门槛)。 而这明显涉及侵犯隐私, csgo这边相传并不打算如此,“玩个游戏就要破坏隐私”,这导致了他们的的反作弊系统vac让人诟病。

伪装成内核驱动

这时候用户做出了巨大的牺牲后, 外挂已经难以简单存在了,但是大坏蛋又又又想到了好主意,那就是做成内核驱动, 不走OpenProcess api调用,那你自然就无法检测。但是此时成本已经很高了, windows下驱动加载需要有正确的泄露状态的驱动签名,或者漏洞。而前者只要维护泄露库即可识别, 漏洞会被修复。 而更狠的还会通过ept让游戏的内存连内核态也不可读写,让外挂更加艰难。

硬件接管

但是更艰难的是直接通过dma直接旁路内存访问。 简单的就模拟一个网卡、声卡。通过dma获取内存,直接控制鼠标,显示人物位置等等。 但是iommu可以防止直接dma。

更复杂的就是像ict的包老师做的hmtt, 让内存接到特制板子上、板子再插入主板。这个板子把访存通过光纤传递到其他机器上处理后。 这种则难以处理。当然,作为深入研究过的人士, 我给出一种方法是,直接检测内存频率。因为她为了做逻辑处理,不得不降低内存频率。如果发现频率较低,直接认为他有嫌疑是有可行性的。

AI 识别

而终极方法就是不改动游戏机器,通过摄像头获取游戏界面,识别敌人后控制鼠标移动开枪~。 这更是无敌,只能通过检测鼠标异常移动来封禁了。 但是这个前提下,坏蛋的行为将被大幅度收敛,毕竟你必须表现得像个正常人没法开转,那么就存在交互,诛仙的可能。 而游戏的攻防正式进入ai时代, 外挂主要是需要模拟人的鼠标移动。 而游戏商则检测鼠标移动是否属于人类范畴。 而这注定无法彻底平息。成为永远的战争。

我的尝试

学习完之后,我权衡之后选择简单又不那么简单的第二种, 伪装成系统服务。 效果挺好,直接得到了所有角色的位置、血量等信息。

其实开始时遇到最大的问题都有解, 比如烦人的内存位置寻找。毕竟如果要自行通过cheat engine扫描内存,识别变化来定位,那得到猴年马月,消耗大量时间。 而某大型射击游戏比较特别,因为比较大型,他的内存位置直接被开源。让人研究基础外挂构造有了充足的舞台。

而其余内容根据想要做的架构按部就班即可完成,而在ai辅助下,这更让人倍感轻松。

最终成功完成了一个雷达挂件,完成了童年的小心愿~

当然再次重申, 本文研究过程中只有机器人收到了伤害

一点思考

学习完之后,我内心久久不能平静, 因为这种扫盘扫内存的操作,让我们本地隐私无法保留, 以后可能再也没法去玩平台了,转向纯官方。 个人感觉只能是通过加大开挂风险来平衡了,如平台都是按人封。 而官方则通过通行证加码账号价值,毕竟100+的账号,如果内部有道具则更贵,一般就不会开。