53.网络游戏逆向分析与漏洞攻防-基础数据分析筛选-逆向分析寻找消息数据解压缩过程

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

如果看不懂、不知道现在做的什么,那就跟着做完看效果

现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包

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

上一个内容:52.面对庞大的数据如何找到节奏

在上一个内容里的分析,看到了带47开头的数据包被压缩了,所以对于47开头的数据包来说现在并不是明文数据,现在做的是逆向游戏客户端找它的解压缩过程,

思路:

首先之前拦截数据包的地方,是游戏接收的地方,游戏接收之后数据包是压缩的,所以游戏也用不了,它肯定会把数据包丢给一个函数,然后在这个函数里面对数据包解压,然后使用数据包,然后它可能还会把数据包丢到一个线程或者队列里面,然后接收的位置就不管了,然后在别的地方经过一段时间依次的处理,这时处理的时候由于数据包没有解压,游戏依然是无法直接使用,所以这个时候游戏也要进行解压操作。

然后由于它的数据包很多,所以在接收的代码里,让它弹一个框,如下图,在 OnRecving 函数里添加0x28数据包判断,为什么是判断0x28要看上一个内容,0x28开头的数据包里有人物基本信息

然后打开x96dbg

选择附加

然后附加到游戏

然后按 ctrl+g 键,输入跳转的位置 10618480

然后就来到下图红框位置,下图红框位置是我们HOOK(拦截)游戏接收数据的位置

然后使用今晚打老虎角色进入游戏

 

然后游戏接收到0x28数据包,这时弹框的确定不要点,后面会说什么时候点

这时在x96dbg里打断点,在下图红框位置打断点,下图红框位置是 10618480函数开头,所以在下图红框位置打断点

下完断点之后回到游戏点击确定

点击完确定x96dbg就能准确的点下来了

通过内容窗口查看也是正确的,如下图,是0x28数据包

然后开始分析,现在只分析游戏如何解压的,为什么要分析这里,看11.接管游戏接收网络数据包的操作,看完 11.接管游戏接收网络数据包的操作 之后,就可以知道,通过之前的分析得出这里是游戏接收数据包存在明文数据的地方

首先下图红框位置的eax是上一层计算出来的指针(从连接对象里算出来的指针)

然后edi+0x24,也就是eax+0x24,也就是从连接对象里算出来的指针的值+0x24

得到了一个像是长度

然后ebx+0x1

然后又一个像是长度的东西

然后继续往下走,看到下图红框位置,现在的edi是从连接对象里计算出来的对象,然后现在从计算出来的对象里偏移0x10位置得到了0x40000,这个0x40000像是一个内存大小也就是一个缓冲区

然后长度与缓存区比较

然后继续往下,下图两个不知道是什么,接下来这种不知道是什么的东西就不写了(都加上太长了影响观看)

一路f8,然后就来到了下图位置,从栈里得到了数据包

下图中第一个红框不知道计算的什么,初步判断是往队列里放东西,第二个红框可能是求下一个队列位置

然后得到了一块内存空间

然后调用了一个函数,函数的参数如下图,ebp是是一个长度,eax如下图是数据包内容,edx是上图里的内存空间

然后在下图位置按F7,进入函数里

然后一路f8,就看到下图位置了,函数里并没有循环,所以它不是解密的函数,如果解密的话必定会有循环

然后函数执行完,发现原本eax存放的是数据包,现在eax的值是从上方计算的出的队列的地址,并且把数据包复制到队列的内存空间里,如下图

然后发现到后面就没什么东西了,就结束了ret了,也就是说接收数据这一条线就结束了,就走完了

下一步,要不就是另起一个线程去处理,下图红框里的数据,要不就是这里返回之后,后面再去处理下图红框里的数据,游戏里把网络设置成非阻塞的模式,就是没接收到数据返回,接收到数据也返回,所以游戏它就不会卡主,它接收数据的过程就是把数据复制到一个队列里

然后接下来设置一个访问内存的断点,看谁读取了这个内容断点,如下图

然后按f9,让游戏跑起来运行,然后就来到了下图位置,然后把位置记录下来 0x1061157E

然后ecx-27之后比较与9的关系

然后0x30-0x27=0x9

然后ja指令的意思

也就是说,eax大于9就跳转,这个意思应该是它的数据包头的范围是0x0 到 0x30

下图红框位置,是一个跳转表,具体的作用现在不知道,如果以后必须用到了,在分析它,这里先不管

接下来看下图红框的函数

按F7进入函数

然后ecx是数据包+1位置,如下图也就是47位置,这里把47取了出来

下图红框位置的汇编,把47这个数字通过and指令、sub指令、sbb指令、and指令、add指令一路计算最终判断结果是不是等于3,如果大于3就跳转

然后再下图红框位置从数据包中得到了一个数字 0x03EF,十进制是 1007

然后把03EF这个数字返回出去了,这应该是数据包压缩之后的长度

然后执行ret,回到上一层

然后与FFFF作比较,FFFF十进制是65535,如大于FFFF就不跳转,不跳转可以看到有一段内容 decompress size error,中文意思是解压大小错误

然后继续f8,就来到下图位置,先继续往下翻

这里要用鼠标双击进入看,不要断点进入了,需要先大体看一看,因为现在经过这么长的分析脑子很混乱了,所以先不用断点,通过静态分析的方式大体看一眼,然后它接下来它肯定会在某个位置解压数据了,然后这时的栈里有数据包,然后它的参数是一个也就是ecx,ecx是一个地址

然后现在ecx地址的内容

然后现在需要知道的东西已经够了,然后鼠标双击函数进入函数,进入函数之后,主要关注汇编的跳转指令j开头的指令,看看它是否存在循环,循环的特征就是跳转指令会往上跳转,然后如下图,进来之后,一共有两个跳转指令,并且它们都是往下跳转,不满足循环特征

然后它还调用了,如下图两个函数,这里还是用鼠标双击进入,大体看一眼

首先进入,下图红框里的函数

这个函数里存在循环的特征,如下图

然后往下翻,可以看到,它有很多跳转,也就是说明存在多个循环,这样的情况就符合加密解密、压缩解压的逻辑特征

所以0x106011E0函数,可以大胆猜测它是用来解压数据的函数

然后现在猜测,解压完的数据会放到ecx里,下图是未执行 0x106011E0函数时

然后按F8,可以看到ecx有了数据

然后之前的目录,现在也可以正常显示,并不是一段正常显示一段不正常显示,到这就得到了,解压之后的数据包

然后顺手再往后看看,下图红框位置有一个je的跳转,也就是相等就跳转,ebp的值是之前得到的,eax是0x106011E0函数的返回值,这个意思是看看解压之后的数据是否与服务端传来的长度一致,如不一致就报错,下图中也可以看到 decompress failed,中文意思是解压失败

然后继续往下看,上方有一个跳转表 0x10611904,上方没有截 0x10611904 它里面的内容,但是我是访问了一下,但是当时并不知道它是什么东西,所以没有截图,现在可以知道了,当解压完,它会执行到0x1061160B位置,这也就是说 0x10611904 控制了如果数据不需要解压它就跳转到0x10611616位置,不执行上方分析的解压函数,它可以知道什么数据压缩了那些数据没有压缩

然后下图红框位置,它有10字节,数据都是0或1,也就是代表了,数据是否压缩

由于上方0x10611594位置的代码截图不详细,但是经过上方两个图,感觉它们很重要,所以下方补充截图

如下图,eax的值现在是1

所以从0x1061190C里取出的数据是00

也就是从0x10611904位置取出一个值,然后jmp(跳转)到这个值,也就是jmp到0x106115A2这个位置,跳转到0x106115A2位置之后会执行解压操作

然后现在的数据包是开头0x28,所以0x28是1,然后0x29肯定是2,依次类推27 28 29 2A 2B 2C 2D 2E 2F 30,如下图,其中2B和2D是不压缩的

然后往下翻可以看到游戏它处理数据包的方式,一个很明显的 switch 结构

总结:

从0x1061157E位置计算得出当前的数据包是否要解压,然后从0x1061159B位置的0x10611904跳转表,如果要解压就通过0x10611904跳转表跳转到解压函数位置,如果不解压就跳转到其它位置,目前也只分析了跳转解压的,其它的没有分析

然后0x106115E4位置调用了0x106011E0函数对数据包做解压操作

然后如果要屏蔽这种数据,就要让它返回一个false,然后hook要下在下图红框位置,下图红框位置决定了是否解压成功,eax是解压之后的长度,ebp是服务端发送来的长度,带入当前的场景也就是在0x28开头的数据包里的长度,然后由于游戏把数据包丢到了一个队列里,这可能导致在这个位置hook没办法做模拟数据,模拟数据这个操作看后续的代码,这里不详细写了,没法写清楚,看代码理解起来最简单,看不懂代码可以看代码里的文字说明,会写的很详细,然后现在只要知道有这么回事就行

然后解压失败就让它跳转到,下图红框位置,为什么要下图红框位置?

如果不在下图位置又不想写代码,就要跳转到下图红框位置,跳转到下图红框位置之后,它会执行一个虚函数进行报错,这个函数里可能会有信息收集的操作,人家本来就没错,我们只是屏蔽数据包,这样的情况下游戏收集信息肯定就能检测出游戏被人搞了,所以跳转到上图红框位置最合理

上方只是分析,只是找到了解压之后的数据包,在什么位置可以得到,然后这个解压之后的数据包具体怎样用以后续的代码为准,现在只是初步定义hook点返回值


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

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

相关文章

Spring Boot 整合 Apache Phoenix 进行 HBase 数据操作指南

在Spring Boot中集成Apache Phoenix以便执行SQL查询和表操作,你可以使用Phoenix的JDBC驱动。下面是一个简单的示例,展示了如何在Spring Boot应用中集成Phoenix,并执行基本的表操作和查询。 1. 添加依赖 首先,你需要在你的pom.xm…

C# Solidworks二次开发:访问BOM表特性相关API详解

大家好,今天要讲的文章是和BOM表特性相关的API。 下面为要介绍的API: (1)第一个为GetConfigurationCount,这个API的含义为获取此BOM表可用或在此BOM表中使用的配置数,下面是官方的具体解释: …

phpMyadmin 设置显示完整内容

额外选项这里,默认部分内容改成完整内容 方案: 版本>4.5.4.1,修改文件:config.inc.php,添加一行代码: if ( !isset($_REQUEST[pftext])) $_REQUEST[pftext] F;

什么是已检查异常和未检查异常?

在Java中,已检查异常(Checked Exceptions)和未检查异常(Unchecked Exceptions)是两种主要的异常类型。 已检查异常(Checked Exceptions):这种类型的异常在编译期就会被检查&#xf…

浮点数的表示

王道考研ppt总结: 二、个人理解 浮点数解决的是定点数的位数局限,导致表示范围有限的问题 阶码:由阶符和数值部分组成,阶符为,小数点向左移动,否则向右移动;数值部分,是底数的几次幂…

【算法】标签算法及其运作流程

标签算法 1. 标签算法及其运作流程2. 标签算法主要有哪些?3.用python语言举例实现聚类 1. 标签算法及其运作流程 标签算法是一种用于自动为数据或文本内容添加标签或分类的算法。这些标签可以帮助组织、检索和理解数据,是信息管理和数据挖掘中的重要工具…

区块链媒体推广的8个成功案例解析-华媒舍

区块链领域作为一个新兴行业,媒体推广对于项目的成功发展起着至关重要的作用。本文将从八个成功案例中来分析区块链媒体推广的重要性和成功策略。 1. 媒体报道对于区块链项目的重要影响 媒体报道是提升区块链项目知名度和用户认可度的重要手段。对于区块链项目来说…

Java | Leetcode Java题解之第25题K个一组翻转链表

题目: 题解: class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode hair new ListNode(0);hair.next head;ListNode pre hair;while (head ! null) {ListNode tail pre;// 查看剩余部分长度是否大于等于 kfor (int i 0…

CSS3新增

一些CSS3新增的功能 课程视频链接 目录 CSS3概述私有前缀长度单位remvwvhvmaxvmin 颜色设置方式rgbahslhsla 选择器动态伪类目标伪类语言伪类UI伪类结构伪类否定伪类伪元素 盒子属性box-sizing问题插播 宽度与设置的不同 resizebox-shadowopacity 背景属性background-originb…

BIRDy:机器人动力学辨识基准

文章目录 前言入门前提条件Benchmark结构运行benchmark如何(重新)生成一条激励轨迹如何(重新)生成实验数据如何(重新)生成机器人的辨识模型如何重新编译基准程序的.MEX文件用户自定义在基准中添加新的机器人在基准中加入新的辨识算法源码前言 如果没有一个合适的框架,学生、工…

SDK-0.7.8-Release-实体管理 - ApiHug-Release

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 更多精彩…

大数据存储解决方案和处理流程——解读大数据架构(四)

文章目录 前言数据存储解决方案数据集市运营数据存储(Operational Data Store)数据中心 数据处理数据虚拟化和数据联合虚拟化作为 ETL 或数据移动的替代品数据目录数据市场 前言 在数字时代,数据已成为公司的命脉。但是,仅仅拥有…

CNN卷积神经网络:理论基础、核心架构与多元应用

CNN是一种深度学习模型,利用卷积层提取图像特征,池化层降维与增强不变性,全连接层实现分类/回归。核心理论包括局部感知、权值共享、多层抽象。广泛应用图像识别、目标检测、语义分割、生成任务等领域。 一、CNN理论基础 1、局部感知野&…

二叉树之遍历

概述 之前有说到二叉树的建树,这次讲讲二叉树的遍历过程。二叉树的遍历分为深度优先遍历和广度优先遍历,二叉树的逻辑结构如下所示: class TreeNode{int val;TreeNode left;TreeNode right;public TreeNode(){}public TreeNode(int val){thi…

dPET论文笔记

PBPK论文笔记 题目:Self-supervised Learning for Physiologically-Based Pharmacokinetic Modeling in Dynamic PET 摘要 动态正电子发射断层扫描成像 (dPET) 提供示踪剂的时间分辨图像。从 dPET 中提取的时间活动曲线 (TAC&a…

C#如何快速读取大型文本文件?StreamReader+FileStream

FileStream读取字节流, StreamReader则是用于从字节流中读取文本数据并进行解码。 FileStream用于打开文件流,提供了对文件的底层访问,它读取的是字节流。 StreamReader用于从字节流中读取文本数据,并根据指定的编码(或使用默认编…

题目:一个最优美的图案。

题目:一个最优美的图案。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should l…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求(doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口,通常会安排几个…

(我的创作纪念日)[MySQL]数据库原理7——喵喵期末不挂科

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

软考系统架构设计师考试论文应试技巧

写论文是你展示系统分析水平的最佳时机,如果您面对三个论文问题的阐述,怎么才能让人相信你有项目实践经验,有较强的分析问题、解决问题的能力,怎么才能让你的论文就很有说服力呢?下面是湖北软考网小编总结出来的几条系…