以下三个程序都是使用python编写的。我们作为体验者而非职业外挂制作者,使用python可以有效提升我们的代码效率,避免陷入无谓的细节中。
1.(故事的开始)跳一跳
关键字:安卓设备,图像处理
GitHub链接:这里
跳一跳的外挂在前一阵子非常火,甚至有些全工科狂欢的势头。从最开始的图像识别法、伪造数据包法,到后来的图像识别法、甚至OpenCL+机械手臂模拟法,可谓八仙过海各显神通。我只想安安静静简简单单刷一个分而已,于是选择了最简单的图像识别法。
这个方法非常简单易懂:利用安卓调试程序(Android Debug Bridge,简称adb)在安卓机调试模式下可以截图并且模拟按键。在进入游戏后启动外挂,整个程序就在:
截图,将手机屏幕保存到指定路径
分析截图,获得 当前棋子 和 下一落点 的位置
根据两者位置模拟按下按键适当时间长度
等待若干秒回到步骤一
这四步进行。整个难点在分析截图,好在网上有各种现成方案可以借鉴。经过实测,可以无压力刷到2000分甚至更高(只要愿意等)。
跳一跳外挂没有不可逾越的技术难点,大多方案也只是在分析截图这一步各有不同。我们可以将这个套路应用到其它类似的手机游戏上。实际上由于手机屏幕的限制和大多数手机游戏的休闲定位,大多数手机游戏外挂都可以被如此制作出来。
对于一些流程逻辑/信息呈现比较复杂的手机游戏,依靠分析截图获取信息只是理论上可行,实际耗费工作量太大,需要直接读取内存中游戏数据,而这就不在这篇文章的讨论范围之内了。
另外对于实时性游戏(比如节奏大师),需要注意的是截图并保存的延时比较高,我们需要另想办法,比如只获取屏幕上若干像素点进行快速判断或者同样读取内存中游戏数据等。
由于跳一跳逻辑简单+单人,我认为它最适合成为外挂的入门自学案例。
2.(有网络接入的情况)头脑王者
关键字:安卓设备,网络数据截取
Github链接:这里
头脑王者则是一个进阶的微信小游戏。它的主要游戏内容是匹配另一位玩家,然后双方同时尽快正确回答5道四选一选择题,得分高的一方胜出。选择题的内容范围非常广,从琴棋书画到天文地理都有。
乍一看这个游戏的外挂非常难制作,毕竟回答问题这个任务是现在自然语言处理的热门方向,无数顶尖团队为攻克它正在进行研究,我们能行吗?但是GitHub上一位程序员敏锐发现由于手机尺寸大小的限制导致题目长度有限,几乎所有题目都无法涉及逻辑推理而只能考察简单的事实判断。于是他提出并实现了如下大致思路:
获取题目
在本地数据库中搜索是否曾经遇到过此题
如遇到过,则直接获得正确答案选项,进入步骤4
如没遇到,则进入步骤3
对题目在百度上进行搜索,统计四个选项在百度返回的页面中的出现频率,由此推断正确选项。
模拟用户点击选择选项。
如这是一道新题,则将题目和服务器返回的正解存入本地数据库。否则忽略此步骤。
回到步骤1
再加上简单的自动排位等功能,完全可以实现24小时无间断全自动答题上分。经过实测,这个大智若愚的方法胜率很高,在我有限的测试中最高达到了至少30+连胜(有可能更高的连胜纪录我没看到)。
虽然头脑王者已经凉了(据说是在最后一次现金赛中出题作大死,然后就立刻被关了),但是我仍觉得这个案例很有学习的价值。因为其中涉及到的网络数据包截取可以让我们方便地实现更强大的功能。试想,若是我们要根据图像识别呈现的文字内容,程序的复杂度和可靠性都会受到很大影响。原作者版本中截取头脑王者的https数据包是使用破解版的Charles。但是破解版的安全性是个问题,同时经过我的调查,实际上更多人使用的是同样强大但开源免费的Fiddler。于是我将原先的 adb+python+Charles 项目改造成了 adb+python+Fiddler,详细可以参见Github中源码。
针对其它游戏,我们甚至可以利用Fiddler截取/篡改/伪造数据包这一思路,实现各种巧妙且高效的妖路子。
- (电脑端网络游戏)连连看
关键字:Windows电脑端
Github链接:这里
Windows教学在CS专业中并没有涉及,所以不少本科甚至研究生毕业后都可能对Windows的一些基本机制不了解。我觉得可以从两个方面入手熟悉它,一个是MFC,一个就是本连连看外挂。
QQ游戏的连连看是一个经久不衰的游戏,它简直就是Windows电脑端外挂入门的最佳对象。首先腾讯对连连看并不重视,导致游戏很久未更新而研究对象保持不变,这样大家才可以进行一致长期的技术交流。第二是其逻辑和美工非常简单便于从多方面下手,对新手友好。最后是其对实时性要求不高,程序可以从容运行不需要考虑效率。
这个连连看外挂的一个版本是我在GitHub上无意发现的。但是其是用C写成的,代码混乱,没有考虑到不同显示器的像素问题,而且还需要改正几处bug后才可以在VS下编译成功。于是我参考其大致思路,编写出了更加简洁易懂的python版本,经过实测可以击败任何人类玩家(除非出现难以重现的小概率意外事件)。这个外挂程序的简化流程如下:
进入游戏房间,准备开始游戏
开始游戏后扫描游戏界面,获取各个方块种类位置信息
计算消去方块的解法并模拟鼠标点击消去所有方块
游戏结束后退出房间,回到步骤一
这个流程看似简单,实际有不少问题。第一步,进入游戏房间可能由于网络延时或者腾讯抽风导致进入失败,这种情况需要处理。进入游戏房间弹出游戏窗口后可能对手玩家一直不开始游戏,这时候也要考虑直接退出房间另找一个。第二步,我们怎么知道游戏开始了呢?我依靠某处背景像素颜色来判断,但假设腾讯升级游戏(虽然不太可能)让背景颜色随机出现怎么办呢?第三步,有可能存在无解的情况(所以有”重排“道具),这时候怎么办呢?想要实现重排可能会导致程序变复杂,或者干脆考虑到这种情况出现很少,让这盘游戏输掉算了?再者,如何调整消去速度,防止过快或过慢操作让对手或自己不开心?(也许可以读取网络数据包获取对手准确消去进度,或者根据游戏界面上方图案估计对手消去进度,让自己永远比最快的选手快一点)第四步,游戏结束后被蓝钻玩家快速踢出房间出现提示弹窗怎么处理?窗口莫名抽风卡了一下怎么处理?
这些问题体现出了它作为一个电脑端相对手机端环境的复杂。由于手机游戏定位,几乎所有手机游戏都是独占屏幕,流程简单,错误少。但是电脑端有多个窗口,各种游戏内/外弹窗导致失去焦点,游戏提示错误(网络延时进入房间失败,被踢出房间等)等都会成为程序设计的困难。如果想要设计出可以流畅运行24小时的全自动外挂还是需要一些功夫的,而在克服这些困难的路上,我们可以学习到常见的Windows基本机制。
- 结语
以上就是我介绍的三种不同类型的入门级外挂制作教程的总结,更加简单的宏外挂(比如dota2中卡尔自动连招),更加复杂的读取/篡改游戏数据甚至伪造网络数据包就不是这一篇文章所涉及的了。有兴趣的话大家可以以此为开端深入学习,让兴趣成为自己最好的老师从而越走越远。
(P.S. 不是在犯罪的道路上越走越远,而是在成长的道路上越走越远。)
(再P.S. 严格意义以上三个不应被称为外挂而是辅助软件,因为并没有破坏或篡改游戏程序或其数据包本身。)
转载于
https://zhuanlan.zhihu.com/p/33901425