文章目录

  • 前言
  • 背包数据嵌套结构
  • 背包二叉树
  • 二叉树分析
  • 背包数据结构分析
  • 总结

前言

学习完了链表的数据结构,我们再通过幻想神域了解一下二叉树在游戏中的存储形式。

这一次要逆向的数据是背包中的所有物品,为了能将背包中的数据尽量分析完整,这个游戏建议尽量升到20级。会送两个背包扩展券,背包越大数据越多,能够分析到的数据越完整。

我这里是有两个背包扩展券。,一个20格扩展卷,一个5格扩展券。

背包数据嵌套结构

背包里有很多物品,每一个物品的每一个属性都可以成为突破口,最简单的当然是物品数量了。

用CE附加游戏,扫描背包的物品数量,数据类型勾选2字节

再次扫描,剩下三个数值,分别对这三个数值进行修改,然后重新打开背包,就能过滤出真实的地址。

在这个地址下两个字节的硬件访问断点,吃药让断点断下

此时eax+28的当前物品数量,往上追eax

ecx来源于[ecx+edi*4]

物品数量=[ecx+edi*4]+28

这个地方我们发现是一个数组,下断,观察edi数组下标的值,这个下标的值有下面几种变化

0-1D:30
0-4:5
0-13:20

三种变化分别对应自带的20个背包格子数量,5格补充背包和20格补充背包。再来看ecx数组首地址的值,也有三种变化。

这里其实是N+1个数组,N个扩展背包加上一个自带的背包。ecx代表的是背包对象,edi代表的是背包对象的每一个成员。

背包二叉树

继续往上追ecx背包对象

ecx来源于[esi+8],esi来源于[edi+0x10],到这里edi的值依然是变化的

物品数量=[[esi+8]+edi*4]+28
物品数量=[[[edi+0x10]+8]+edi*4]+28

edi来源于[eax]。这里下断观察eax的值,eax的值每次断下都是不变的。

从这里不变化再到下面三个值发生变化,说明edi并不是来源于eax,而且代码不是顺序执行的。

这个地方可能是有循环。接着对这段代码进行分析,找出寄存器变化的来源

首先找到向上的跳转,确定循环头部和循环尾部。但是变化的eax和edi不在这个循环体内,说明这个循环和我们要追的数据没有关系

这个循环一直在对数组下标+1,那这里应该是数组循环头部和数组循环尾部

继续找向上的跳转,确定循环头部和循环尾部。

变化的寄存器edi在循环体里面,不变的寄存器eax在循环外,说明这个就是我们要找的循环。

确定好了循环,继续在循环体内追edi,edi一直到循环头部没有来源,继续在循环体下面的代码中找edi

edi来源于[ebp-C],

物品数量=[[[[ebp-C]+0x10]+8]+edi*4]+28

接着追[ebp-C],[ebp-C]在循环内也没有来源,而是来源于循环外的edi,说明edi是第一个物品对象。

但是[ebp-C]作为局部变量在循环内没有来源,不太可能,说明循环内有call改变了[ebp-C]。

在这个位置下断,观察[ebp-C]的值,[ebp-C]的值现在是0x21CDE0A0,数据窗口跟随这个地址,下一个对象是0x21CDE260

步过这个call以后再观察[ebp-C],变成了0x21CDE260,说明我们追的背包对象的变化是来自于这个call,这个call参数放入一个背包对象,然后返回下一个背包对象。

二叉树分析

想要得到整个数据结构的数据,有两种方法,第一种是找到根节点,直接调用call,一直取下一个对象;另外一种是根据这个对象下访问断点,找到遍历的代码。

这种背包结构在游戏中必定是会有代码不断访问背包数据,所以直接在这个背包对象[ebp-C]下访问断点。

对象下断后断下的位置,eax是我们想要追的背包对象,并且这块代码是一个标准的二叉树遍历。 接着我们来分析这块代码

首先找到循环头部和循环尾部。然后我们发现循环里面有两个跳转

如果跳转成功,eax取[eax]]位置的值,如果跳转不成功,eax取[eax+8]的值。和之前的链表循环一样。区别在于多了一个节点,其正向代码如下:

struct node
{// 左节点node *lc;// 右节点node *rc;// 数据域int data;
};

[eax]是左节点,[eax+8]是右节点

物品数量=[[[[eax]+0x10]+8]+edi*4]+28

eax就是二叉树的根节点,如果想要写代码遍历的话需要再把eax的基址追到。这次的目的是学习二叉树,这个过程省略。

另外这个地方比较[eax+0x15]是否为0,不是则继续遍历,这个位置是二叉树的标志位。

左子树:[eax]
右子树:[eax+8]
标志位:[eax+0x15]

找到这三个东西,再分析出后面的属性偏移,就能将整个二叉树的数据遍历出来。

背包数据结构分析

物品数量=[[[[eax]+0x10]+8]+edi*4]+28

再回到之前的偏移表达式,简单分析一下整个数据结构

  • eax作为二叉树头节点里面每一个成员都是背包对象
  • [[[[eax]+0x10]+8]代表的是N个背包对象数组的首地址
  • [[[[eax]+0x10]+8]+edi*4]代表的是背包中每一个物品对象
  • [[[[eax]+0x10]+8]+edi*4]+XX代表的是背包中每一个物品对象的属性

对于属性的分析就比较佛系了,能看出来多少算多少,各位随缘吧~

总结

对于二叉树和链表的分析,最关键的在于通过观察寄存器的变化,找到变化源,然后在变化原中找出循环体,并分析循环体内的代码,从而判断出程序所使用的数据结构。

最后,附上Github地址,里面有游戏下载链接和相关工具,需要请自取:
https://github.com/TonyChen56/GameReverseNote

011 数据结构逆向—二叉树相关推荐

  1. 008 数据结构逆向—数组(简单版)

    文章目录 前言 逆向背包数组 一维背包数组 二维背包数组 数组结构分析 总结 前言 对于游戏逆向来说,核心需求其实就只有两个 追踪游戏数据 定位游戏功能call 对于追踪游戏数据来说,单纯从一个寄存器 ...

  2. 【数据结构】二叉树及其相关操作

    二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...

  3. 数据结构之二叉树(遍历、建立、深度)

    数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...

  4. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

  5. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

  6. 009 数据结构逆向—数组(困难版)

    文章目录 前言 数组逆向 通过人物血量查找人物属性 调call取对象 call内追局部变量 逆向加密数组下标 分析人物属性 总结 前言 通过之前的分析,我们已经对数组结构有了一个简单的了解,这次就用幻 ...

  7. python处理mysql数据结构_python环境下使用mysql数据及数据结构和二叉树算法(图)...

    python环境下使用mysql数据及数据结构和二叉树算法(图): 1 python环境下使用mysql 2使用的是 pymysql库 3 开始-->创建connection-->获取cu ...

  8. 数据结构之二叉树:折纸问题——11

    数据结构之二叉树:Python代码解决折纸问题 折纸问题 要求:请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开.此时折痕是凹下去的,即折痕突起的方向指向纸条的背面.如果从纸 ...

  9. 数据结构树二叉树计算节点_查找二叉树中叶节点的数量 数据结构

    数据结构树二叉树计算节点 Algorithm: 算法: One of the popular traversal techniques to solve this kind of problems i ...

最新文章

  1. 十二、Redis五大数据类型之四Hash
  2. Linux 终端訪问 FTP 及 上传下载 文件
  3. 【深度学习】绝了!分割mask生成动漫人脸!爆肝数周,从零搭建
  4. 【QGIS入门实战精品教程】4.4:QGIS如何将点自动连成线、线生成多边形?
  5. 如何在页面显示json数据
  6. 使用HTML5构建iOS原生APP(2)
  7. 配置vmcore通过ssh转储到其他主机的方法
  8. 静态电子购物网站设计回忆
  9. GAMIT数据的下载与准备
  10. 《艰难的制造》:4星。基本是关于制造业的报告文学。严重剧透。
  11. glm::quat 四元数,坑了一下午
  12. k8s对外攻击面总结
  13. 黑名单(诸如反爬虫等)
  14. 编程中的匈牙利命名法
  15. java 处理word,excel,pdf -javacode
  16. SQL Server 2008服务器安装设置向导
  17. DisplayPort接口最详解析
  18. 解决eclipse中overlaps the location of another project: 'xxxx'
  19. 【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人
  20. RxJava从入门到精通:RxJava源码初步分析

热门文章

  1. DL之LSTM:基于tensorflow框架利用LSTM算法对气温数据集训练并回归预测
  2. NLP:基于nltk和jieba库对文本实现提取文本摘要(两种方法实现:top_n_summary和mean_scored_summary)
  3. DL之BigGAN:利用BigGAN算法实现超强炸天效果——画风的确skr、skr、skr,太特么的skr了
  4. BlockChain:《世界经济论坛:区块链将如何重塑金融业?》—20160812—听课笔记
  5. Algorithm之OP:OP之GA遗传算法思路理解相关配图资料
  6. MQ各个元素的详细理解
  7. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例...
  8. [BZOJ1984] 月下“毛景树”
  9. angularJS前台传list数组,后台springMVC接收数组
  10. Java 关于File使用