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,一经查实,立即删除!

相关文章

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;

浮点数的表示

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

区块链媒体推广的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…

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…

Spring Boot统一功能处理(一)

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

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

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

无酒不水浒,无肉不江湖

很难想象,没有酒的《水浒传》,将会是什么样儿? 武松醉打蒋门神,小霸王醉入销金帐、杨雄醉骂潘巧云,诸如此类,都是水浒传中经典的酒故事,倘若离开了酒,水浒少的就不仅仅是故事了&…

头歌-机器学习实验 第8次实验 决策树

第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握决策树的相关基础知识。 引例 在炎热的夏天,没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…

【Linux实践室】Linux高级用户管理实战指南:用户所属组变更操作详解

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔Linux查看用户所属组2.1.1 👻使…

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动(Character Movement)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者&…

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域,一款高效、智能的集成开发环境(IDE)无疑是程序员们不可或缺的神兵利器。今天,我要为大家介绍的,正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户,只…

全球AI顶会NeurlPS开始收高中生论文了

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 卷高考之后的下一步,卷论文? 培养 AI 人才,要从娃娃抓起&…