97.网游逆向分析与插件开发-网络通信封包解析-项目需求与需求拆解

news2024/11/25 14:59:20

内容参考于:易道云信息技术研究院VIP课

上一个内容:窗口化助手与游戏窗口同步移动

项目需求:

为游戏的聊天功能做一个增强,能够使用户脱离游戏界面的情况下使用窗口化助手进行聊天,能够设置自动回复,记录关键聊天记录,自动说话等

需求由来,很多使用玩游戏是为了社交,社交很重要的方式就是聊天,窗口化助手提供隐藏游戏窗口功能,后期会全自动所以不用盯着游戏窗口,这时可以玩会游戏

实现这个东西,要找到怎样说话,找到消息来了以后,显示的接口,这个实现起来很麻烦,所以要找一个简单的方式。

需求拆解:

方式就是从网络封包通信的地方去解决,所以接下来是重点解读封包,解读网络游戏或者说应用程序网络通信的它的一个架构一个系统,最后落到实处就是,当前分析的游戏中的封包是什么样子的,当把这个解读出来以后,就可以利用网络封包去做,这个功能,不用累死累活的区找call,还原函数了,现在代码里就已经记录了很多地址了,如图1,然后游戏里所有的操作都是通过网络封包来实现的,也就是说不管是游戏也好还是其它的应用程序也好,它的通信系统其实就是它的核心命脉,只要握住了这个命脉其实就找到了一把钥匙,去解决所有的问题

对于应用程序来讲网络通信经典流程:

组织数据 =》加密数据 =》发送数据

接收数据 =》解密数据 =》处理数据

组织数据:

        比如说话,这个说话要说给谁?比如要说给张三,然后就是张三然后一个分隔符(比如张三;)因为服务器要读取的,服务器要怎样确定哪个是名字呢?所以它总要有一个方法,然后说话的内容XXX,然后就是张三;XXXX;,然后在给一个时间戳,代表什么时候说的,然后就变成了 张三;XXXX;时间戳;,这就是一个最简单的组织数据,这三个内容通过分号就连接了起来。

加密数据:

        数据组织好往往都会进行加密,比如base64加密或其它自己写的算法进行加密,目前来讲加密算法就那几种,专业设计加密的很少,密码学是跟军工是同样级别的东西,我们写的算法都是现有算法的改良或者是一种变种,在一般的应用程序尤其是在游戏里,这种加密算法它基本上都是恺撒密码的变种,恺撒密码的特定是替换或者往后加偏移,一看这个数据是不是恺撒密码就看最根本的就是数据加密前,比如加密前20个字节,加密后还是20个字节,有的数据加密前20个字节加密后16个字节,这个不叫加密叫压缩,面对大型数据会遇到压缩这个情况存在的,然后加密必定会有效率的损耗,它就是为了防止,就是在网络发送的时候会有中间人攻击,这个数据会被拦截,这样的话是不安全的,但有了加密算法加密以后,中间人没有加密算法,就算知道是恺撒密码只要稍微变点变种,想破解难度还是比较大的,攻击成本就会变高,所以加密主要解决这个问题

发送数据:

        没什么特殊的就是发送数据

解密数据:

        服务器处理完数据也会对数据进行加密,所以要解密数据

处理数据:

        比如数据头是0表示说话成功了,也就是根据这个头进行处理。

所以基本上所有网络应用程序都是这样的流程,万变不离其宗

应用程序网络通信的两种架构:发送数据的时候存在阻塞的问题,比如发送一个数据特别大,这时还有用异步通信(完成端口映射或WSA系列函数,虽然是单线程的逻辑,但实际上还是异步的),单线程处理就是先发送完数据再去处理其它的,这时如果是游戏的话它就会卡

1.单线程通信

        组织数据 =》加密数据 =》发送数据

        接收数据 =》解密数据 =》处理数据

单线程处理所有操作都在一个线条上,发送慢的话就会影响后续的操作

2.多线程通信:如果遇到这种情况,通过发送数据去回溯,只能找到线程二的读取队列的操作,找不到线程一的操作,这时该怎么办?那就是通过监视队列的读取或写入,就能从线程二切换到线程一投递数据进入队列的操作上了

   发送数据:

      线程一:组织数据 =》加密数据 =》投递数据进入发送队列

      线程二:读取发送队列 =》发送数据

   接收数据:

       线程一:接收数据 =》解密数据 =》投递数据进入处理队列

       线程二:读取处理队列 =》处理数据

应用程序网络通信的常用函数:(IOCP完成端口映射例子及说明)

recv、send、sendto、recvfrom、WSARecv、WSASend

recv、send 它俩是老式函数容易造成阻塞,也就是说没有发送完以前什么事都做不了,所以它俩通常会出现在多线程的架构中,不然就卡死了

WSARecv、WSASend 它俩支持完成端口,所以本质上是异步的,然后它俩出现了就没必要使用多线程了,因为完成端口本身就是多线程的,它俩发送的时候只是告诉操作系统要发送,然后就完了,然后由操作系统完成数据发送,操作系统发送完会通知它发送完了,所以看到WSA的函数是一个好消息,因为它采用单线程的架构,然后配合完成端口的函数完成。

图1:现在没有地址变化的问题,如果有就要修改所有的地址,需要写自动更新的算法,这个也是一个不小的工作量,总体来讲还是麻烦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1444648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PE 特征码定位修改程序清单 uiAccess

requestedExecutionLevel level"asInvoker" uiAccess"false" 可以修改这一行来启用禁用原程序的盾牌图标,似乎作用不大。以前没事写的一个小玩意,记录一下。 等同于这里的设置: 截图 代码如下: #include …

c语言游戏实战(4):人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:哈希表 1.若两个字符串长度不相等,则一定不符合题意; 2.创建一个map集合,先将字符串s1中的每一个字符与其对应的数量存入集合…

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 根据某个块块 的 左上角坐标,和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…

网络层DoS

网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,其目的 是实现两个终端系统之间数据的透明传送,具体功能包括:寻址和路由选择、连 接的建立、保持和终止等。位于网络层的协议包括ARP 、IP和ICMP等。下面就 ICMP为例&…

linux学习之虚拟地址

在以往的学习中我们经常接触地址,电脑像一个小房间,它的空间是有限不可重叠的,但是可以覆盖。想象一下如果我们要放很多东西进去,如果没有合理的安排,所有东西乱放,那么我们需要寻找某一个东西的时候需要把…

【开源】基于JAVA+Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

stack和queue基本使用

stack和queue基本使用 stackqueuepriority_queuestack和queue容器底层的默认容器:deque stack stack是一种容器适配器(容器适配器可以将一种接口转为用户需要的另一种接口,如将vector、list的接口封装转成用户需要的stack的接口)…

Java实现音乐平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

【Linux系统学习】6.Linux系统软件安装

实战章节:在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,进行练习虽然可以基础掌握这些命令和技巧的使用,但是并没有一些具体的实…

DP读书:《openEuler操作系统》(九)从IPC到网卡到卡驱动程序

DP读书:《openEuler操作系统》从IPC到网卡到卡驱动程序) 上章回顾_SPI上节回顾_TCP 网卡驱动程序简介1.设备驱动2.总线与设备3.网卡及其抽象 驱动程序的注册与注销1. 注册2. 注销 设备初始化1. 硬件初始化2. 软件初始化 设备的打开与关闭1. 设备的打开2.…

lv14 中断处理原理:接口及按键驱动 14

一、什么是中断 一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件 分为: 内部中断 CPU执行程序的过程中,发生的一些硬件出错、运算出错事件(如分母为0、溢出等等),不可屏蔽 外部中断 外设…

OpenAI---提示词工程的6大原则

OpenAI在官方的文档里上线了Prompt engineering,也就是提示词工程指南,其中OpenAI有提到写提示词的6条大的原则,它们分别是: (1)Write clear instructions(写出清晰的指令) &#xf…

React18原理: 再聊Fiber架构下的时间分片

时间分片 react的任务可以被打断,其实就是基于时间分片的人眼最高能识别的帧数不超过30帧,电影的帧数差不多是在24浏览器的帧率一般来说是60帧,也就是每秒60个画面, 平均一个画面大概是16.5毫秒左右浏览器正常的工作流程是运算渲染&#xff…

DataEase

一. DataEase (一). 说明 安装文档 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分…

私有化部署一个自己的网盘

效果 安装 1.创建目录 cd /opt mkdir -p kod/{db,site} cd /opt/kod 2.环境文件 vim db.env 内容如下 MYSQL_PASSWORD123456 MYSQL_DATABASEkodbox MYSQL_USERkodbox 3.编写docker-compose.yml vim docker-compose.yml 内容如下 version: 3.5services:db:image: mar…

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器,你可以按照以下 步骤进行操作: 1. 访问 MinIO 的官方网站:https://min.io/,然后 点击页面上的”Download”按钮。 2. 在下载页面上,选择适合你操作系统的 …

假期作业 8

1、若有以下说明语句:int a[12]{1,2,3,4,5,6,7,8,9,10,11,12};char c’a’,d,g;则数值为4的表达式是( B)。 A)a[g-c] B)a[4] C)a[‘d’-‘c’] D)a[‘d’-c] 2、假…

二、数据结构

链表 单链表 https://www.acwing.com/problem/content/828/ #include<iostream> using namespace std; const int N 1e5 10; //head:头节点的指向 e[i]:当前节点i的值 ne[i]:当前节点i的next指针 idx:当前存储的点 int head, e[N], ne[N], idx;//初始化 void i…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…