30.第二阶段x64游戏实战-认识网络数据包发送流程
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
上一个内容:29.第二阶段x64游戏实战-技能冷却
发送数据包的方式(函数)操作系统提供
1.send
2.sendTo
3.WSASend
4.其它非操作系统提供,自己封装的发包函数(它虽然是自己封装的,但是底层还是用操作系统的函数,所以还是可以找)
下图是网络游戏和服务器交互流程(发送网络数据包,简称发包)
游戏客户端和游戏服务器
游戏服务器是在游戏公司那边,游戏公司它会发布一个pc端exe的版本让我们下载(游戏或者叫客户端),也就是下载游戏,下载安装到我们自己的电脑上面,安装好运行、登录,登录就开始给服务器发送消息告诉服务器我们的角色上线了,然后服务器就会把我们角色相关的数据返回给我们(进入的地图场景、身上的装备、背包物品等各种各样的数据,统统发送给我们),在游戏中我们看到的游戏界面实际都是本地(我们电脑中的内存)数据,是我们电脑本身的数据,比如说我们的电脑断网了,游戏还是存在还是可以看得到游戏的界面,但游戏会提示网络超时、掉线等,但游戏还是存在的一些数据也是存在的,还是一样的有场景、有文字、有我们游戏角色、有攻击力、装备等画面还是存在,断网了只不过我们的游戏没办法和游戏服务器相互传输数据了而已,只是传输的这个线断了,我们的数据发不过去,游戏服务器的数据发不过来,现在知道发包这件事之后再看游戏中吃药这个事,点击药物之后血量会增加,它实际上是点击药物之后,给游戏服务器发送一个吃药的事情,然后服务器把最新的血量给我们发过来,我们游戏看到的血量增加只是一个显示效果,这里就要分清一个东西,游戏中那些操作会进行发包,那些不会进行发包,比如打开背包、关闭背包、打开人物信息窗口、关闭人物信息窗口这些功能就没必要告诉服务器这种东西不是很重要没有意义,所以这些东西就不会有发包,也就是断网了也能正常使用,然后比如移动这个东西要不要告诉服务器,这肯定要告诉服务器的,再比如说背包里的货币,这种是最影响战斗力的东西很重要它就会经过服务器校验,就比如背包里显示的货币有55,这个55只是本地的,只是供给我们看的,实际用钱的时候,服务器会拿服务器中的货币来做校验,所以就算我们本地把货币改成9999也没有用,这只是改的本地,服务器没有改
我们玩家和游戏
在 游戏客户端和游戏服务器 中写了,敏感操作都会发送一个数据包,比如买东西时的货币、人物属性变化这种敏感操作都会给服务器发送一个数据包,这个数据包是怎么发送的呢?发送数据包它是通过一个公共函数(公共call),最开始写了发送数据包的4种方式,当我们触发了一个需要发包的操作,比如移动,它就会拼接移动的数据包,比如我们当前坐标、目的地坐标,还有个数据包头,数据包头用于告诉服务器当前是移动还是吃药还是释放技能等,拼接完数据包之后,一般游戏会为了防止被抓包,会加密数据包,然后调用发送数据包函数,把数据包发送给服务器,然后服务器接到我们的数据包,执行服务器对应的代码执行完把结果返回给游戏,然后游戏会进行解密数据包,然后通过数据包的描述执行对应的代码,比如移动
通过上面可以看出,我们触发的移动只是让游戏发送一个数据包,至于移动不移动要看服务器返回的数据包
然后移动、释放技能等会触发发送数据包的操作会有很多,所以游戏开发者不可能给移动专门写一个拼接数据包、加密、发送数据包的代码,也不可能给释放技能专门写一个拼接数据包、加密、发送数据包的代码,如果每个都单独写拼接数据包、加密、发送数据包的代码会很费事,所以所有发送数据包的操作使用的拼接数据包、加密、发送数据包的代码都是同一个,所以拼接数据包、加密数据包一般都是游戏开发者自己写的,我们没法找,但是发送数据包的操作它只能使用操作系统提供的,所以我们在操作系统提供的发送数据包函数设置断点,就能找到加密之前的数据包,然后分析数据包结构,然后模拟数据包,然后把模拟的数据包发送给游戏服务器,这就可以实现一些东西,比如自动喊话
当前的游戏它使用的是send函数发送的数据包,把send、sendTo、WSASend全部设置断点,谁的断点触发了游戏就用的谁,如果都没触发那就找ws2_32.WEP函数,这个函数是Windows系统的用户层发送网络数据包的底层,不调用 send、sendTo、WSASend那一定会调用WEP函数