《魔力宝贝》作为一款非常早的网络游戏,可谓是经久不衰。作为这样一款古老的2D回合制网游,早些年的一些开发理念也导致了游戏中的漏洞比较多。秒遇怪和不遇怪是回合制网游玩家梦寐以求的外挂功能,而这款游戏就可以实现。
所谓秒遇怪是只在无需移动或者短距离移动的情况下就可以频繁遇怪,这种功能很明显是通过主动发送协议完成的。
在老版本的游戏中有这样一个功能函数,使游戏在人物移动时被随机触发,如果我们主动去调用这个函数,就可以绕过随机代码,让概率事件变为必然事件。下面我们用游戏的单机版本来分析一下。
首先我们用xdbg附加游戏,在send下断走路
在包内容上下写入断点,再次下写入断点跳出线程
在函数头部下断发现,不同的动作返回是不同的, 说明我们可以在这里下条件断点过滤掉走路包,并观察下是否在遇怪是会断下
由于游戏是没有心跳包的,所以在游戏再次断下时说明我们遇怪了
多次执行到返回,找到一个比较容易分析的CALL进行测试,我们发现返回三层有一个CALL无需传入参数即可调用
用代码注入器调用这个CALL看下效果
注入之后进入战斗,说明这里就是遇怪CALL
我们可以直接调用这个CALL来进入战斗,同样也可以NOP掉这个CALL来实现不遇怪。
如果需要下载调试工具可以到公众号 任鸟飞逆向----资源下载中下载
============================================
以上是旧版魔力宝贝的遇怪机制,在客户端中会有一个遇怪函数通知服务器遇怪,
但是在新版的游戏里,这个功能被改到服务器随机触发了,在玩家走路时,服务器随机触发战斗,并通知客户端,
这样,我们就没办法直接通过本地的战斗CALL来进行战斗,
但是,我们还有别的办法,
既然战斗是走路随机触发的,那么我们可以频发的调用走路CALL或者发送走路封包,让服务器频繁的进行随机判断,
这样就会在短时间里触发战斗
新版的游戏数据变化不大,由于游戏是静态加密,走相同位置的发包是固定的
所以,我们直接通过调用send函数来验证一下这个想法
首先我们来到send处,下F2断点,移动以后游戏断下(如图)
执行到返回后,得到send函数的原型,并对参数进行分析(如图)
socket的来源直接是一个基地址[E10820],我们直接用代码注入器进行注入,先找一片空地址,将复制的封包拷贝进去(如图)
然后将send 函数填写到代码注入器中(如图)
然后频繁的点击注入,我们在没有移动的情况下就可以进入战斗,当然有时候需要点很多次(如图)
这样我们就达到了秒遇敌的效果,而步步遇敌是说我们可以通过对send进行hook,每当我们移动一步,会对移动包进行hook,并进行频繁的重发,这样就会达到每一步都进入战斗的效果,这种方法的好处时不需要对加密函数进行分析。而原地遇敌就需要对加密函数进行分析,发送向原地移动的封包,才能达到效果。
以上两个版本都能实现秒遇怪,不同点在于遇怪功能是否在服务器进行触发,这两种情况都是游戏早期漏洞导致的,想处理并不是很容易,但是服务器如果想对这两种情况进行检测也很简单,只要对频繁发送的封包进行一下时间戳的验证即可判断是否是玩家手动进入的战斗。