当前位置: 首页 > ops >正文

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函数


img

http://www.xdnf.cn/news/8141.html

相关文章:

  • 网络安全-等级保护(等保) 3-1 GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》-2019-05-10发布【现行】
  • Mujoco 学习系列(四)官方模型仓库 mujoco_menagerie
  • 道可云人工智能每日资讯|谷歌搜索正式引入AI模式
  • OpenCv高阶(十七)——dlib库安装、dlib人脸检测
  • Docker 挂载策略:何时使用临时容器拷贝默认配置,何时直接挂载?
  • 3.9/Q1,GBD数据库最新文章解读
  • C语言命名规范
  • 【小呆的随机振动力学笔记】随机过程基础【一】
  • 详解受约束的强化学习(二、理解学习)
  • Docker 疑难杂症全攻略:从环境搭建到生产故障的全链路解决方案
  • 计算机网络学习(二)——DNS
  • 智慧在线判题OJ系统项目总体,包含功能开发思路,内部中间件,已经部分知识点
  • 工业机器人RTOS“微秒级战争”:实时Linux能否打破传统RTOS的垄断局面?
  • ModbusRTU转profibusDP网关接三菱变频器与PLC通讯
  • 中国核电信息技术峰会|麒麟信安锻造电力“数智基座“,护航核电安全新生态
  • KaihongOS设备开发中Sensor 驱动开发
  • 【前端】每日一道面试题5:解释Proxy和Reflect的典型应用场景,如何用它们实现数据双向绑定?
  • 48页 @《人工智能生命体 新启点》中國龍 原创连载
  • 2025软考高级信息系统项目管理师英文选择题---管理类常见英语词汇
  • Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署
  • 安卓原生兼容服务器
  • 强化学习算法介绍和代码例程
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.11)
  • VisionPro_T恤缺陷检测_机器视觉案例
  • visual studio重新安装如何修改共享组件、工具和SDK路径方案
  • 蓝桥杯 11. 保卫国王大道
  • 第二十二次博客打卡
  • YOLO学习笔记 | YOLO11对象检测,实例分割,姿态评估的TensorRT部署c++
  • Python与自动驾驶数据集处理:构建智能驾驶的基石
  • 基于亚博K210开发板——神经网络加速器