文章目录

  • 前言
  • 数组逆向
    • 通过人物血量查找人物属性
    • 调call取对象
    • call内追局部变量
    • 逆向加密数组下标
    • 分析人物属性
  • 总结

前言

通过之前的分析,我们已经对数组结构有了一个简单的了解,这次就用幻想神域这个游戏来更加深入学习数组。

数组逆向

通过人物血量查找人物属性

以人物血量为切入点,我们要找到所有的人物属性。

首先搜索当前人物血量

接着通过换装备的方式修改人物血量,最后剩下两个结果,一个是当前血量,一个是最大血量。通过修改数据可以分辨。

在OD中对这个地址下硬件访问断点。打开人物属性栏,会对人物所有属性进行访问,断点断下

这里在判断当前的人物血量是否为0,人物血量=eax+8。接着需要通过追踪eax的方式找到所有的人物属性。

eax来源于上一句call

进到call内,eax来源[eax+C]

血量=[eax+C]+8

上面有一句汇编将一个基地址赋值到eax,但这句代码实际上是没有执行的,所以这个地址是无效的。

eax实际上是来源于上面的call。

这个call内部的逻辑比较复杂,遇见这种情况可以用比较简单的方式,直接调用call来获取数据。

调call取对象

我们只要将这个call的参数分析出来,就可以直接调用call来获取返回值。这个call只有一个参数

参数eax是一个固定的值

往上追一下基址,就是一个基地址+0x40C

eax转成十进制之后像是一个ID

而调用这个call以后返回值[eax+C]+8的位置是人物的血量。这里可以大胆猜测一下,参数eax其实就是当前的人物ID,传入人物的ID以后会返回一个人物对象。对象加上偏移可以取到人物属性。

call内追局部变量

接着我们用正常的追踪方式继续追人物的血量基地址

血量=[eax+C]+8

继续进到call追踪eax的值

eax来源于[ebx+0xC],替换一下偏移表达式,继续追ebx

血量=[[ebx+0xC]+C]+8

ebx来源于[ebp-4],继续追[ebp-4]

血量=[[[ebp-4]+0xC]+C]+8

[ebp-4]作为一个局部变量只能存在于当前的函数内,但是我们往上找发现并没有[ebp-4],那就说明[ebp-4]是来源于这个函数内的call

我们需要进入这个被执行的call找[ebp-4]的来源。

追这个局部变量有两种方式,第一种是直接下断,单步跟每一行代码,看是哪行汇编改变了[ebp-4]。这种方式没啥技术含量,这里我们用第二种。

局部变量想要传入call内被修改就必须通过指针的方式,这里我们可以查看一下这个call的参数

这个call有两个参数[ebp+8]和[ebp-8],其中和[ebp-4]最接近的就是[ebp-8],那么就有下面的等式

edx=ebp-8

用上面的等式往[ebp-4]靠近

[edx+4]=[ebp-4]

edx实际上是第一个参数

[edx+4]=[arg1+4]=[[ebp+8]]+4]=[ebp-4]

那么我们进入内层call以后要追的实际上就是[ebp+8]

进入call内找[ebp+8],这里将[ebp+8]赋值给了eax,然后将ecx赋值给了[eax+4],这个[eax+4]就是我们要找的[ebp-4]。所以

血量=[[ecx+0xC]+C]+8

继续往上追ecx

ecx来源于[ecx+4],ecx又来源于ebp-0x14

血量=[[[ecx+4]+0xC]+C]+8
血量=[[[ebp-0x14+4]+0xC]+C]+8
血量=[[[ebp-0x10]+0xC]+C]+8

继续追[ebp-0x10]

[ebp-0x10]来自ebx

血量=[[ebx+0xC]+C]+8

ebx继续往上追,就找到了今天的目标数组了

血量=[[[eax+ebx*8+4]+0xC]+C]+8

eax是数组首地址,继续往上追eax。ebx是数组下标,值等于0x34。下标暂时先不管,后面会有个彩蛋~

eax来源于[esi+0x14]

血量=[[[[esi+0x14]+ebx*8+4]+0xC]+C]+8

esi来源于ecx,返回上一层找ecx

ecx来源于esi,表达式不变,继续返回上层追esi。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkllCxu0-1587787548269)(009 数据结构逆向—数组(困难版)].assets/1587483144194.png)

esi又来源于ecx

血量=[[[[ecx+0x14]+ebx*8+4]+0xC]+C]+8

来到函数头部,继续返回上层追ecx

ecx来源于ecx+0x410

血量=[[[[ecx+0x410+0x14]+ebx*8+4]+0xC]+C]+8

再往上,总算是追到ecx的基地址了

血量=[[[[[0xF84B74]+0x410+0x14]+ebx*8+4]+0xC]+C]+8

逆向加密数组下标

到这里我们就把人物的数组追到了,但是还有个问题就是数组的下标0x3E是怎么来的,我们需要知道这个数组的排列规则,以及当前的下标为什么是0x3E。

所以这里就要考虑去追ebx的来源,看看这个0x3E是怎么得来的。

回到刚才数组的位置追ebx,ebx来源于[eax+eax]

数组下标=eax*2

eax继续往上追

来到这个地方,这段代码明显是一个加密的算法。通过上面的左移右移的指令就能看出来,到这里其实就没有必要继续往上追了,如果需要写代码,直接将这段加密算法抠出来。

最后追出来的数组下标的算法为:

数组下标=(([0xF84B74]+0x40C*0x41]+[0xF84B74]+0x40C/4+0x9E3779B9) and [[0xF84B74]+0x410+0x20])*2

到这里我们就清楚了人物数组下标的来源是通过加密的方式计算的。

分析人物属性

找完这个数据结构以后,我们来进行一个简单的分析。

血量=[[[[[0xF84B74]+0x410+0x14]+ebx*8+4]+0xC]+C]+8

我们把+8的属性偏移去掉,查看一下人物对象

dd [[[[[0xF84B74]+0x410+0x14]+ebx*8+4]+0xC]+C]

记得将ebx替换为加密的下标,我这里是0x34。

其中+8的位置是人物血量,+0x10的位置是人物等级,+0x18是移动速度,+0x24是人物最大血量,+0x30是暴击伤害。

其他的数据可以自己去分析,这里其实没啥技术含量,就是通过不断的对比和分析得出结论。

总结

到这里我们已经对数组有了一个深刻的理解,数组在所有的数据结构里属于最简单的一种,对于这类数据结构来说,只需要一直往上追就能找到想要的数据。如果遇到数据被加密的情况,可以逆推出加密算法,也可以直接将算法拷贝到自己的代码里。

另外在追数据的过程中,偏移表达式每一次变化都要做一次检验,在数据窗口查看当前的表达式是否正确,否则到后面很容易翻车。

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

009 数据结构逆向—数组(困难版)相关推荐

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

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

  2. Java版数据结构之数组模拟环形队列demo

    Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...

  3. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 目录 图书简况 学习指导 第一章 绪论 第二章 数据和表达式 第三章 使用类和对象 第四章 条件和循环 第五章 编写类 第六章 图形用 ...

  4. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  5. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  6. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  7. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  8. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  9. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

最新文章

  1. 医疗领域中的AI/ML机会前景
  2. Android 项目,没有可运行的Module项
  3. ABAP RANGES 在 RFC 的应用示例
  4. HTML <dfn> 标签的简单介绍
  5. 安装Microsoft Hololens开发环境
  6. w3school---JQuery HTML
  7. Codeforces Edu Round 64 (Rated for Div. 2)
  8. c += c-- | ++b;
  9. ImageJ 中文教程(细胞计数)
  10. 影视动画特效制作中的光学动作捕捉
  11. CentOS7L2TP/IPSec
  12. 乐视pro3精英版乐视X722线刷兼救砖_纯净刷机包_教程
  13. 趣图 | 小哥哥你怎么那么高冷呀?
  14. 人工智能换脸python_Python史诗级P图换脸小程序,AI换脸的简易版
  15. 成绩管理系统管理学生属于计算机,学生成绩管理系统属于计算机哪方面的应用?...
  16. 30个最值得去的人间仙境
  17. 曾仕强《中国式管理-人际关系学》笔记中
  18. 多个Repeater嵌套
  19. mysql meb物理备份脚本
  20. Android插件化开发之动态加载本地皮肤包进行换肤

热门文章

  1. NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化、过程全记录
  2. CV之LabelImg:图片标注工具之LabelImg(图像标注工具)的简介、安装、使用方法详细攻略
  3. app 崩溃测试 (转:CSDN 我去热饭)
  4. Discuz升级 Database Error : pre_common_syscache ADD PRIMARY KEY (cname)【解决办法】
  5. Ajax缓存解决办法
  6. Java IDE鱼龙混杂,我们该如何选择呢?
  7. Chrome原生工具实现长截图
  8. 使用树莓派搭建WordPress个人博客
  9. 多索引表 (4)multi_index.hpp源代码
  10. Cosmos VS Palodat