最近去忙着给小弟培训,都忘记上来发文章了,刚好小弟找了个小游戏练练逆向数据分析,下面就给大家讲讲他是怎么做到修改数据后,达到无限满血,全技能升级完的。
首先介绍几个概念:
网络游戏的变态功能的一般实现方式:
逆向数据分析主要去看的就两个点
1:本地数据
某些网络游戏将人物的血量,攻击力,坐标,这些重要数据存在游戏本地的客户端,当然可能会有一些加密,这样的游戏可以直接修改内存实现无敌,秒杀,瞬移等变态功能。当然这种网络游戏并不多见,大多数游戏重要数据都存放在服务器,我们修改内存看到的只是假象。
2:伪造封包
既然是网络游戏,就肯定要与服务器进行网络通信,比如我们在游戏里使用技能,就会向服务器发送使用技能封包,喊话就回向服务器发送喊话封包。大多数封包的漏洞都是服务器判断不严谨或者有一些逻辑漏洞造成的,比如,如果游戏服务器并没有对技能冷却时间进行判断,我们直接一直向服务器发送使用技能的封包就可以实现技能无CD的效果,有些网游怪物死亡会向服务器发送怪物死亡的封包,那我们就可以伪造封包向服务器发送达到秒杀怪物的效果。某些射击网游,玩家朝着敌人射击时会发送一条封包,我们可以通过玩家和敌人坐标计算精确的值修改这些封包,就可以实现枪枪爆头等变态功能。还有些游戏刚进副本时会向服务器发送封包增加人物血量攻击力之类的,我们可以把这条封包找出来,调用游戏发包函数向服务器发送,也可能可以实现倍攻无敌等效果。
大多数网络游戏通过send或者WSASend发包函数向服务器发送封包,当然现在很多网络游戏可能会调用更底层的发包函数,或者一些其他处理,导致用od在这些函数上下断点并不会命中断点,这种情况我们不在赘述。
为什么要找明文发包call?因为我们在这些系统的发包函数下断点,断下看到的数据一般都是加密的 ,所以我们要找到游戏明文的发包函数才能方便分析封包内容。
我们今天讨论的重点是某袋西游的封包bug
我们先要找到游戏中的明文发包函数以及分析使用技能的封包内容
这个游戏的发包函数调用过程非常简单,简单可以概括为
功能CALL==》组包==》明文发包CALL==》加密等等==》send
我们可以在send头部下段,在游戏中 做相应的功能动作,断下时通过栈回朔就可以返回到明文发包call。
我们要找到的是游戏过程中攻击或攻击后所发生变化的封包数据如图所示:
这里只有使用技能才会断下,我们可以观察下这个call的参数;
29 00 45 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 42 A3 03 00
经过我们的对比分析,可以分析出
29 00//包头
45 00 00 00//技能ID
FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01//固定数据
01 42 A3 03 00//