75.网游逆向分析与插件开发-背包的获取-背包结构与指针的逆向分析

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

上一个内容:物品名称与物品编号的映射关系分析-CSDN博客

通过上一个内容已经可以通过物品的id得到一个名字,知道了它的算法,它的算法自己封装好了,我们直接用就好,接下来要用到物品的指针了,所以接下来分析物品的指针怎样得到,某一个物品的指针怎样得到,然后上一个内容中分析出,它是通过调用物品类里的成员看出得到的,这个物品对象地址是通过ebx,所以接下来,看看ebx从哪来的。

首先打开x96dbg,来到下图位置(0x739915)

236e3588cc0a4b848650a9cff8891583.png

然后往上滑看到:ebx的值是从esi+390位置得到的,也就是说是通过传参进来的

97d1997f66034ff7895c6fb1641b1427.png

看断点:

a36655efc0654caebf47c8b8ca9b3bfc.png

调用物品类成员函数位置,可以看出它与 esi+390位置得到的 内容一样,然后esi是通过ecx来到,所以它是通过上一层得到的,所以接下来去上一层,

def8a02575b34090b0d10d3e367f47a9.png

ctrl+f9再按f8,来到上一层

04c329bb3da240c894f7d6387a8f0852.png

上一层里的ecx,是0x22A33490

5fb8b880d33c40a89e49a9ac378891ad.png

与获取名字的函数里的esi一样,然后在反上一层看看(从0x754348位置反不是下图中的位置)

72f0fd8e550241a3a1df67408257d967.png

然后就来到了,下图位置

9768080ceaf746d9a2cf9027810e5d23.png

然后在断点:还是0x22A33490,然后反上一层看看,现在追了这么多层还没找到,不是一件好事,这说明这个体系比较复杂

2da380c0b9a340239e111d58cc8eaab4.png

然后ctrl+f9,再按f8,来到下图位置

8866bae8f1254cd697b612936bdd2008.png

然后它的ecx还是没变,然后继续往上追

4f97a9654fdb4eba864245cda59e4c7b.png

然后ctrl+f9,再按f8,来到下图位置

d44adce8b1644f0e85858d28b685a315.png

它的ecx也还是没变,然后继续往上追

c7657e137689472cbfb53f9e051a07e8.png

然后ctrl+f9,再按f8,来到下图位置,然后游戏中鼠标一动它就会断点住,它应该是跟界面有关系,也就是说最终得到的是0x72FC98位置的函数,所以只能在 0x72FC98位置的函数里获取,然后不分析它了,但凡涉及到ui的就是很底层的代码了,这么底层的代码去找的话很累,所以不用它,不找这个麻烦,然后继续往下看

220b188afaa74129b9bf0ab33823e4f1.png

接下来找一个跟ui没关系的地方,上方式通过,鼠标放到物品上然后弹框显示内容的代码找的,所以追到ui的逻辑里面没有什么问题,然后物品只有人物独有怪物没有,所以理论上讲背包它一定是有基址的,或者有一个很方便的基址管理方法的东西,接下来通过数量的写入来找,也就是通过物品数量的写入来追,第一物品是独立的,符合追基址的假设,第二物品既然是独立的那么写入也会是相对独立的,访问会涉及到ui,但是写入就不涉及ui的事了,所以通过写入可以把ui给毙掉,然后写入它肯定会根据背包的基址计算出物品的位置,然后再改,这样我们可以获得计算物品位置的代码,也顺便知道了背包是一个链表结构还是一个数组结构了

d5d8ba89b95449c0bde13b9f78a1a28d.png

然后关闭x96dbg,重启游戏,打开 Cheat Engine 找写入地址,地址是0x5BAF36

b41a13efc681469fb059765a48bb9e30.png

然后打开x96dbg,来到 0x5BAF36

3902110952b345fc800793b3b7366c96.png

然后使用物品发现它会执行两次,两次ebx的值分别是通过 Cheat Engine找到的那俩值

9efe994215e74e57adc689c99931a00c.png

然后反到上一层找ebx的值在哪来的

af795591f1054e639f530b949188b839.png

然后下图红框位置是一个典型的数组结构,这里就有背包的意思了

d2b0f4b035d74061bb17a6c52fc0e5b6.png

然后现在确定我们要找的ecx来自于,一个数组,如上图红框位置,然后ebx是物品指针,然后ebx来自于ecx+edi*4位置那么ecx就是背包基址,看下图使用背包第一个物品时,edi是0,ecx是一个指针,ebx是物品指针,然后继续往下看

a3b0591cd6134e7bb9adec5908337047.png

使用第二个物品是,edi是1了,也就是edi是物品在背包里的序号,然后接下来就找ecx的值从哪来的

2c47c8c6a5204962a828b62d8b953f39.png

然后ecx的值是从下图红框位置来的,然后首先esi+3A0位置是背包里第一个物品,然后下方有一个test ecx,ecx,然后紧接着一个je指令,也就是如果ecx是0它就跳转,跳转到的函数是一个报异常的函数,然后je指令的下一行是mov eax, dword ptr ds:[esi+3A4],然后sub eax,ecx,这一句的意思就是,现在假设eax的值是12(32位的内存地址是4字节,12就表示有3个地址,4+4+4=12),然后ecx的值是0,也就是12-0结果是12,然后有sar eax,2,sar是右移运算符,也就是eax/4的意思(c++代码是eax>>2),通过上方假设的值就是12/4结果是3,然后也就是数组长度是3,这样意思是计算数组长,指针是4字节所以除以4得到数组长度,然后cmp edi,eax,edi是使用的物品序号然后物品序号跟eax作比较,然后后面跟着一个jb指令,jb指令是小于就跳转,也就是说判断使用的物品下标是否超出了背包大小,如果超出了就报异常,然后edi的值我们不需要知道,然后现在计算背包大小的方式是背包结构偏移3A4与3A0位置的值相减,然后除以4的结果

ab4d4ee257cc4767a381d78b7d8080c5.png

背包有32个

892b31c89b3c44ae9285d32ee229d2c3.png

eax的值也是32

3c6c8a82df54474e90e3d72bd80fcd42.png

然后通过下图可以看出背包是一个指针数组,也就是数组里面放的是指针,这个指针是指向的物品结构体

fdbee0439c96401e93045e1027fdce31.png

然后现在知道了怎样计算背包的大小,背包的结构是指针数组,接下来就剩分析背包的基址了

 

 

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

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

相关文章

机器学习之numpy库

机器学习之numpy库 numpy库概述numpy库历史numpy的核心numpy基础ndarray数组内存中的ndarray对象ndarray数组对象的特点ndarray数组对象的创建ndarray对象属性的基本操作数组的维度元素的类型数组元素的个数数组元素索引(下标) ndarray对象数组的自定义类型切片操作一维数组切片…

【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)

背景需求: 上个月,看到大4班一个孩子在玩“点兵点将点到谁就是谁”的小游戏,他在桌上摆放两排奥特曼卡片,然后点着数“点兵点将点到谁就是谁”,第10次点击的卡片,拿起来与同伴的卡片进行交换。他是从第一排…

npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED

npm install时报错code CERT_HAS_EXPIRED 一、报错情况二、解决方案 一、报错情况 一直用的好好的,突然今天发现npm install 出问题了,具体报错如下: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to…

unity项目《样板间展示》开发:火焰和UI设计

第二章:火焰和UI设计 前言一、火焰模型管理灶台火焰壁炉火焰 二、电视机播放三、UI设计结语 前言 这次带大家从0到1做一个unity项目:《样板间展示》。 顾名思义,项目内容是展示样板间,即玩家可以与房间中的物体、家具进行交互。 至…

30天零售应用构建挑战:低代码平台的惊人潜力

随着零售业格局的不断演变,零售商正被迫在一个日益活跃、竞争日益激烈的客户驱动型市场中展开竞争。随着互联网上产品信息和评论的出现,消费者的态度发生了巨大的变化——购物者不再依赖销售人员来获取信息。他们现在知道的和许多零售销售人员一样多&…

Portainer Docker容器可视化管理平台实践

Portainer Docker容器可视化管理平台实践 引安装登录Remote ENV 实践 引 平常用docker命令操作比较多,找了一款docker可视化工具,方便快速预览和批量操作,不想一行一行敲的时候,可以偷偷懒。Portainer试用了一下,安装…

linux的安装配置

文章目录 1.centos7安装2.如何进行一个网络的开启3.客户端Xshell和Xftp的一个使用4.换源 1.centos7安装 1.我是在虚拟机里面重装了一个liunx系统,首先我们新建一个虚拟机 2.前面东西都不需要我们进行一个选择,到图中的这一步我们选择一个liunx,版本的话我们选择一个…

网络防御保护1

网络防御保护 第一章 网络安全概述 网络安全(Cyber Security)是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断 随着数…

Midjourney基础 | 使用流程 注册,基础文生图,图的放大微调,保存

文章目录 1 使用流程2 生成自己的第一张图3 图的放大,微调3.1 放大3.2 微调变化 4 图的保存 Midjourney是依托于Discord的,但我也是通过Midjourney才了解的Discord 维基百科说~~Discord是一款专为社群设计的免费网络实时通话,主要针对游戏玩家…

请你来了解一下Mysql-InnoDB中事务的两段式提交

欢迎订阅专栏,了解更多Mysql的硬核知识点,原创不易,求打赏 ACID:事务的四个特性 A:原子性 原子性表示把一个事务中所有的操作视为一个整体,要么全部成功,要么全部失败,是事务模型区…

Flink处理函数(2)—— 按键分区处理函数

按键分区处理函数(KeyedProcessFunction):先进行分区,然后定义处理操作 1.定时器(Timer)和定时服务(TimerService) 定时器(timers)是处理函数中进行时间相关…

LeetCode_11_中等_盛最多水的容器

文章目录 1. 题目2. 思路及代码实现(Python)2.1 双指针 1. 题目 给定一个长度为 n n n 的整数数组 h e i g h t height height 。有 n n n 条垂线,第 i i i 条线的两个端点是 ( i , 0 ) (i, 0) (i,0) 和 ( i , h e i g h t [ i ] ) (i…

联想M7268、7208打印机加粉清零方法

联想小新M7268激光一体机基本参数 产品类型 黑白激光多功能商用一体机 涵盖功能 打印/复印/扫描 最大处理幅面 A4 耗材类型 鼓粉分离 耗材容量 硒鼓LD2268:10000页,墨粉LT2268:1000页 双面功能 手…

Linux常用的管线命令(pipe)

只介绍命令和对应的功能,详细用法可针对性的自行搜索 管线命令基本上都是对文本进行截取的功能,据我观察,他们基本上会以行为单位。 以下命令都可以用在管道上,但是有些也可以单独使用。 以下演示的文件是用last | head -n 12 >…

你知道Mysql的架构吗?

msyql分为server曾和存储引擎层 server层包括了连接器(管理连接,权限验证)、查询缓存(命中直接返回结果)、分析器(词法分析,语法分析)、优化器(执行计划生成,索引选择)、…

java.lang.IllegalArgumentException: When allowCredentials is true

1.遇到的错误 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a…

vue echarts地图

下载地图文件: DataV.GeoAtlas地理小工具系列 范围选择器右侧行政区划范围中输入需要选择的省份或地市,选择自己想要的数据格式,这里选择了geojson格式,点右侧的蓝色按钮复制到浏览器地址栏中,打开的geojson文件内容…

gRPC-gateway使用介绍

gRPC-gateway 参考资料:gRPC-Gateway使用指南 服务中,使用了gRPC gateway(代理)来将外部的http请求映射为内部rpc调用。 proto文件示例: // 导入google/api/annotations.proto import "google/api/annotations…

Oracle 19c rac集群管理 -------- 集群启停操作过程

Oracle rac集群启停操作过程 首先查看数据库的集群的db_unique_name SQL> show parameter nameNAME TYPE VALUE ------------------------------------ ----------- --------------------------- cdb_cluster_name …

Android Dialog 显示不全的问题

前言:开发的时候发现一些运行到手机里的dialog显示不全,只显示一半左右 问了下chatgpt发现没有任何头绪,于是开始自己慢慢分析 显示去掉了原有的dialog的style发现问题解决了,但在原有基础上如何解决呢? 先看看xml&a…