如何在不懂编程的情况下仅用初中数学知识剖析网游外挂技术?

之前玩过一款格斗类手机网游,推图会根据条件获得最高三颗星的奖励,其中一项条件是连击数达到100,这就产生了一个问题,当某关卡没能达到100连击而不立即处理的话,等到后面等级和属性爆发性增长,再回头来清理低级关卡,所有怪物都是秒杀,那么便永远无法达到100连击,得不到三星奖励了。

我就因此中招,而官方也一直无意去处理这个问题。于是我不得不依靠破解网络消息来强制修改战斗结果以获得三星奖励。

当然,这也同时打开了新世界大门,开启了大破解时代,作为平民玩家,长期霸占竞技场前三,对于被踩在脚下的高V人民币玩家来说,心中的草泥马是奔腾不息的。

以下讲述详细破解过程,整个破解是不需要编程基础的,懂得初中数学足够。

准备工具

电脑端工具为WPE,以及CCProxy

手机端使用ProxyDroid,或者其他可用的SOCK5协议类型消息代理App

WPE:抓取网络消息的工具

CCProxy:代理服务器,因为是破解手游,WPE无法直接抓取手机消息,所以需要把手游网络消息通过代理APP先发送到CCProxy中转,方便WPE抓取CCProxy中中转的消息

ProxyDroid:手机端代理APP,可以把手机端网络消息发送到代理服务器,即CCProxy进行中转,由CCProxy发送到游戏服务器。要注意的是,这个APP需要ROOT权限才能正常使用SOCK5类型协议消息中转,如果游戏使用http协议可以免用此app,直接在手机设置里开启http代理。

使用工具

先打开CCProxy,进行设置,点击[账号],打开面板,下拉选择[允许所有],此操作会允许所有IP连接代理服务器:

主界面点击[设置],勾选自动检测,此操作会自动设置本机IP地址:

最后点击主界面的[启动],来启动代理服务器:

接下来打开WPE,点击左上角目标程序,选择要抓取消息的目标程序,此处选择CCProxy:

在点击倒三角图标,即开始按钮,随后WPE将会抓取所有通过CCProxy的网络消息。

最后打开手机端的ProxyDroid进行设置,Host填入PC端IP,即CCProxy中自动检测到IP地址,端口填入CCProxy默认的1080,ProxyType为SOCKS5,设置完成后开启代理,如图所示:

此后,手机SOCKET消息都会中转至CCProxy,再由WPE抓取,最后我们通过更改WPE抓取的消息,发送至游戏服务器,完成作弊。

破解过程

一般来说,PC端即时网游战斗过程中,每一个技能释放,每一次普攻,或跑动,都会同服务端通信,消息极其频繁。

但是手游不同,因为要考虑2G\3G令人心塞的网络状况,很多时候整场战斗就通信两次,开局一次,打完一次,避免过多通信造成卡顿,因此,我们只需要抓取打完时发的那条关于战斗结果的消息,进行破解即可。

我要的是连击,自然以连击为突破口,于是先刻意在游戏中打出最高9连击:

通关后,WPE点击正方形按钮,即停止,抓取到大量消息,找出通关时得到的那条,如图所示:

图中所示网络消息以16进制展示,方便阅读,如果你喜欢,可以转成10进制来看。可以看出,相同的消息发送了两次,通过IP分辨出,第一条是从手机发送到了电脑,第二条是从电脑发送到了外网IP,即游戏服务器IP。这就是中转过程,复制消息数据,具体内容为:

02 00 01 54 00 00 02 E3 00 06 1A E6 00 00 00 00 
45 56 44 46 4D 48 42 4B 52 F6 49 4B 4D 7B 4D 59 
D9 13 44 46 D1 E0 42 4B 51 9A 49 4B 5B 00 4D 59 
43 69 44 46 6A 3F 42 4F 51 52 49 49 4F 50 4C AF 
45 57 44 91 4D 49 42 26 51 53 49 4B 4F 52 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 5A 
45 57 40 F5 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 4D 04 4F 50 4D 59 
3A A8 BB B9 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 57 41 51 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 2E 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 56 44 46 6A 3F 42 4B 50 1F 49 4B 4F 9E 4D 59 
45 57 44 46 59 19 42 4B 51 9A 49 4B 4F 57 4D 59 
45 55 44 46 4D 48 42 4A 51 52 49 49 4F 54 4D 59 
45 55 44 46 4C BF 42 4B 51 85 49 4B 4F 3D 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 58 
45 57 44 21 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 5D 1B 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
10 33 F2 36 4D 49 42 7B 51 52 49 4D 4F 50 3D EB 
45 57 44 46 4D 49 42 42

这条消息里,包含了整场战斗的数据,包括连击数,血量,时间等等。

擒贼擒王,既然目标明确,就先找找里面有没有9这个数字,因为9是这场战斗的连击数,9转化为16进制还是9,数据里找不到09这个数字,说明可能存在两种原因:

  1. 没有直接包含几连击的数据,可能以其他形式,比如几分几秒时打出4连击,几分几秒再接上5连击,这样也能表示9连击,但可能性不大,一是大多程序员没那么闲,二是这条消息数据量并不大,不太可能拆出太多数据块。所以,这种可能先排除掉。
  2. 加密了。

事实上加密的可能性是硕大的,接下来尝试破解加密规则,为方便推敲,再打一个10连击,抓取到消息如下:

02 00 01 54 00 00 01 75 00 06 1A E6 00 00 00 00 
45 56 44 46 4D 48 42 4B 52 D4 49 4B 4D 59 4D 59 
D6 21 44 46 DE 84 42 4B 51 9A 49 4B 5B 00 4D 59 
43 66 44 46 6A 3F 42 4F 51 52 49 49 4F 50 4C AF 
45 57 44 91 4D 49 42 26 51 53 49 4B 4F 52 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 5A 
45 57 40 F5 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 4D 04 4F 50 4D 59 
3A A8 BB B9 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 57 41 51 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 1D 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 56 44 46 6A 3F 42 4B 50 1F 49 4B 4F 9E 4D 59 
45 57 44 46 59 19 42 4B 51 9A 49 4B 4F 47 4D 59 
45 55 44 46 4D 48 42 4A 51 52 49 49 4F 54 4D 59 
45 55 44 46 4C BF 42 4B 51 85 49 4B 4F 3D 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 58 
45 57 44 21 4D 49 42 4A 51 5D 00 52 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 5D 1B 4F 50 4D 59 
45 57 44 43 4D 49 42 4E 51 52 49 4B 4F 50 4D 59 
51 1E 01 BE 4D 49 42 66 51 52 49 4D 4F 50 3D EB 
45 57 44 46 4D 49 42 41

10的16进制为0A,消息里依然找不到,这是必然的。但是9和10相差1,在很多常见加密规则下,加密后的9和10依然相差1,先按照这个猜想来破解,如果不是这样再找其他路径,于是对比两条消息,找出所有在同一个位置下,相差1的数,得到结果如图:

一共有三个数字,很可能的结果就是,这三个数字中有一个是连击数。

此时,如果仅仅是为了尝试去破解连击数,那么在WPE中,把这三个位置的数据全部改改,比如全部加减100,再发送至服务器,多尝试几次,就很可能会成功。事实上这样做确实会成功,但作为程序员,怎么能赢的这么稀里糊涂呢?

为了优雅的解决问题,再打出11连击,抓取消息内容如下:

02 00 01 54 00 00 01 5A 00 06 1A E6 00 00 00 00 
45 56 44 46 4D 48 42 4B 52 D4 49 4B 4D 59 4D 59 
D6 33 44 46 DE 84 42 4B 51 9A 49 4B 5B 00 4D 59 
42 62 44 46 6A 3F 42 4F 51 52 49 49 4F 50 4C AF 
45 57 44 91 4D 49 42 26 51 53 49 4B 4F 52 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 5A 
45 57 40 F5 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 4D 04 4F 50 4D 59 
3A A8 BB B9 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 57 41 51 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 22 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
45 56 44 46 6A 3F 42 4B 50 1F 49 4B 4F 9E 4D 59 
45 57 44 46 59 19 42 4B 51 9A 49 4B 4F 47 4D 59 
45 55 44 46 4D 48 42 4A 51 52 49 49 4F 54 4D 59 
45 55 44 46 4C BF 42 4B 51 85 49 4B 4F 3D 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 58 
45 57 44 21 4D 49 42 4B 2E AD B6 B4 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 5D 1B 4F 50 4D 59 
45 57 44 46 4D 49 42 4B 51 52 49 4B 4F 50 4D 59 
33 81 06 13 4D 49 42 67 51 52 49 40 4F 50 3D EB 
45 57 44 46 4D 49 42 40

此时,分别有9、10、11连击的消息,再一起做对比,找出相差1的数据,结果如下:

可以看到,刚好是最后一个数,对应相差1,而9、10、11即09、0A、0B,对应加密后的数据分别为42、41、40。

于是这里可以大胆猜测,最后一个数,就是连击数据,只需要更改这个数字,就可以达到目的,事实上确实如此。但是,程序员怎么能赢的稀里糊涂呢?

为了优雅的解决问题,继续深入破解加密规则。

加密规则

09、0A、0B对应加密后的数据分别为42、41、40,通过观察,可以发现存在这样的数学关系,42+09 = 41+0A = 40+0B = 4B,那么加密方式有可能是4B-连击数,但是程序员怎么能用这么不优雅的加密规则呢?性能上也是一大损耗,对此,先对三组数据进行观察。

回头观察每一组消息数据,可以发现一个规律,

分成16列,每一列都有一个及其频繁出现的数字,第一列是45,第二列57,一共16个:45、57、44、46、4D、49、42、4B、51、52、49、4B、4F、50、4D、59,如图红色标注,其他两条消息也有一样的规律,并且是相同的数字。

这就明摆着告诉我们,加密同这16个数字有关。直接看连击数那一列,出现最多的4B,也正符合上面猜测规则中的4B = 42 + 9 = 41 + A = 40 + B,尝试把100,即16进制的64带入计算,得出4B-64=FFFFFFFFFFFFFFE7,结果为负数,这是很不合理的,说明这个规则不适用于4B以上的数字,况且,前面也说过了,程序员怎么会用这么不优雅的加密方式呢?

可以考虑到,在网络消息加密过程中是十分讲究效率的,位运算效率要远远高于四则运算,考虑位运算的话,异或运算就在这组数据中就蹦了出来,很明显的,可以看出 42 xor 9 = 41 xor A = 40 xor B = 4B,那么其实规则就是异或运算,而这16个数字:45、57、44、46、4D、49、42、4B、51、52、49、4B、4F、50、4D、59就是key,同相应位置进行异或运算。

事实也确实如此,经过打出更多数据来测试结果,都是符合这条推论的,最终得出加密方式,其实就是每16个字节同这16个字节的key进行异或运算。

接下来

这个游戏的网络消息对我们来说已经是明文了,剩下的就是在WPE中截获消息,更改需要的数据后,再发送。

最终依靠这种方式,将大量人民币玩家踩在脚下。

记得当时就有几个玩家怀疑我用外挂,要求我开直播,以证清白。

我只能风轻云淡的说,尔等腐草荧光,如何比得上天空之皓月。


文章由宅日常整理自知乎专栏:程序笔记杂记,原文标题:《不懂编程,用初中数学知识破解网游的外挂技术

评论

0条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注