68.网游逆向分析与插件开发-角色数据的获取-利用蓝量属性分析角色数据基址

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

上一个内容:67.网游逆向分析与插件开发-角色数据的获取-分析角色数据基址-CSDN博客

然后分析任何一个东西,逆向分析的本质就是找东西的意思,找东西核心的观念是内存里得有,就是找的东西得知道它什么时候出现,如果连这个都想不清楚一定是找不着的,比如游戏中的一个怪物它有固定的寻址方法或者基址之类的东西吗?多半来讲它是没有的,人物有吗?人物是有的,一般来讲为了方便,基本上会把人物的数据独立出来,就是为了操作起来很便捷,如果没有基址能不能访问这个数据,当然是可以的,有各种各样的方法去访问(比如通过鼠标坐标),对于人物的数据来讲它比较特殊,就是对于我们玩家来说它比较特殊,这么特殊的数据要单独给它做一个指针然后指向它,这是很正常的一种现象,但是这个东西怎样找?有的时候是1级指针有的时候是N级指针,如果是多级指针的话,首先就要想到,游戏中它会怎样去使用这个数据,比如蓝量MP这个数据来去找这个基址,MP这个数据对于我们人物的数据来讲,第一个问题是人物的结构体和怪物的结构体是很有可能是同样的一种结构体,实际上大部分来讲基本都是,或者不是同一个类,那它也会是同一个基类,或者兄弟类,它们肯定有关系存在的,有关系存在那就说明在内存里的结构都差不多,这个时候用MP,MP代表通用属性,就是怪物人物它都拥有的属性,那如果怪物和人物都有的属性,利用这样的一个属性去找它的基址,其实不是特别好,因为会遇到一个问题,就是游戏中在处理这种问题的话,它一定是通用方法,就是怪物也有这种方法人物也有这种方法,那将来的话就才用系统化的方法去处理这个问题,到时它前面一定有非常非常复杂的过程用来游戏自动化获得,这个对象是人物还是怪物的,但是有一个情况是例外的,面对这种通用属性情况下,UI的显示时例外情况,怪物的MP或者某些特定属性,虽然跟人物都有,比如等级怪物也有人物也有,这个时候怪物的属性它基本上来讲不太可能显示,但是人物的属性比如蓝量,它就会在UI界面上显示出来,显示它就会访问,如果我们作为ui的设计的时候,要显示这个数据,是不是要最快最便捷的方式去访问到蓝量这个数据(或者其它人物属性),所以这个地方往往都是一个好的突破口,所以接下来就要找到蓝量,要找访问不要找写入

然后打开 Cheat Engine 搜索蓝量

然后就找到了

然后找是什么访问了这个地址

这个时候就一定能找到ui的访问情况

然后查看eax值的由来,上一个内容可以说是凭借着运气搜索,现在是通过有理有据凭借技术上的逻辑找到的这个东西,在不同的游戏里,这个过程可能会复杂,但是也不会太复杂,基本上会很轻松找到的,因为要考虑到游戏开发的时候,它处理这个问题的时候,它也不会去用很复杂的逻辑去处理这个事情,当然也有极个别的游戏是有的,但是如果说它那个很复杂的话,也可以采用它的逻辑去处理这个问题,而现在第一个点面对这种东西ui是一个非常好的突破口,因为ui和怪物,怪物是不存在ui显示这个问题的,所以这个时候就把怪物的信息干掉了,那这就基本上是针对人物的情况来处理,所以逆向分析的时候要找它独立出现的场景,这是非常重要的点

然后在看第二个函数:可以看到它有一些%d什么的,这就说明是ui数据处理的函数了

然后还有攻击的字符处理,所以第二个函数应该是角色面板绘制的过程

然后接下来用错误的方式写入去找,试一下是怎样的

然后

这时的代码:是get方法,一个成员函数的封装

然后打开动态分析工具,x96dbg,5C94F0,然后接下来追ecx

ctrl+f9,再按f8,来到调用方,ecx来自于esi,这个时候就会出错

然后现在的esi,这里很奇怪,1037D3C是它的基址,这是上一个内容中找到的,现在假设我们不知道,这上来一看esi,在看代码里的1037D3C,它俩能对的上,但是它实际用的时候是用的esi,它这个是个什么操作,它是为了读取蓝量,这只是一个巧合,实际遇到这样的东西不能采纳,因为它不准,所以只能看esi怎么来的

然后点一下高亮模式看一下esi怎么来的

可以看到有两个地方

然后加两个断点看看哪一个是,第一个数值正确

第二个位置不会执行,也就是说,调用下图红框里的函数得到了人物基址,然后它有一个参数edi

后续图中的人物地址变了,因为掉线重连了,98489B,然后edi的值看下图红框位置

然后进入AB4230函数

然后最后哪一个jmp的作用是跳到下图函数,下图函数是一个处理异常的,因为它会有ret,正常函数是用ret的,所以它是处理异常的一般不会进入

经过分析,看出下图红框的两个指令是不等于跳转,再加上调用下图函数式传入的值,它可能把人物指针放到了一个链表结构里,下图中第二个不等于就是判断是不是链表最后一个

所以如果想要人物指针就要得到调用上图函数的参数,参数来自于edi,所以接下来就要看edi从哪来的,然后上方就还剩两个函数,第一个函数调用之前还不存在那个参数,

调用之后出现了参数

514CD0函数它的参数

然后把就把eax值的位置进行更改了,也就是传一个指针进去,它就会把指针内容写成另外一个东西

想求它就要知道ebx是什么,ebx来自于栈,是一个参数,所以ctrl+f9再按f8来到上一层

然后来到了

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

然后在这一层会被不断的调用,首先看它的入参与514CD0那里的ebx是否一致

是一致的

然后 它的edi参数,相似操作类型,然后edi又是来自于上一级的参数,这个函数再往上就不好追了

然后这里看测试一下91FAE5它是做什么的,满蓝的时候不会触发

移动的时候会触发,这时的eax的值是B021,所以B021更新的是人物的坐标

自动回蓝的时候是3057

使用物品是B04C

减物品数量时305C,它可能是一种同步数据的操作,所以当到了这个地方就不用再追了,就可以放弃了,它前面一定有一种管理整个数据组织的过程,而且一定很麻烦,再继续往上找就会到了常断的函数了,所以通过写入去追踪的话,最终通过蓝量的事情就白玩了,这是很正常的,一般来讲这个方法它是一种通用方法,就是人物怪物或者跟其它对象共用的方法的话,那么它一般管理起来都会有可能用到通用性的管理方法,会发现这种方式很痛苦,所以分析一个问题的时候要找好一个切入点,这个切入点一定是要找到的场景是它会独一无二出现的场景,就是出现的地方越少我们处理起来就越有力,通过写入找的数据就很明显不是一个有力的

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

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

相关文章

[足式机器人]Part2 Dr. CAN学习笔记 - Ch03 傅里叶级数与变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch03 傅里叶级数与变换 1. 三角函数的正交性2. 周期为 2 π 2\pi 2π的函数展开为傅里叶级数3. 周期为 2 L 2L 2L的函数展开4. 傅里叶级数的复数形式5. 从傅里叶级数推导傅里叶变换FT6. 总结 1. …

《mybatis》--大数据量查询解决方案

阿丹-需求/场景: 之前写百万以及千万的导出数据的时候,对于将数据写道csv文件并压缩这里没有什么大问题了,但是出现了其他问题为: 1、我们需要将数据从数据库中拿出来,并且在进行装配的时候出现了一些问题。 2、对于整…

GPT实战系列-ChatGLM3管理工具的API接口

GPT实战系列-ChatGLM3管理外部借力工具 用ChatGLM的工具可以实现很多查询接口和执行命令,外部工具该如何配置使用?如何联合它们实现大模型查询助手功能?例如调用工具实现股票信息查询,网络天气查询等助手功能。 LLM大模型相关文章…

高效底座模型LLaMA

论文标题:LLaMA: Open and Efficient Foundation Language Models 论文链接:https://arxiv.org/pdf/2302.13971.pdf 论文来源:Meta AI 1 概述 大型语言模型(Large Languages Models,LLMs)通过大规模文本数…

TMC2226步进电机驱动---学习记录

基于TMC2226数据手册的学习 主要内容介绍: Package Outline TMC2226 手册中引脚解释(按照手册表格顺序) 了解每个引脚是接什么的,之后看原理图 (借用立创广场kirito的原理图,后期换个) 以前的疑…

UIUC CS241 讲义:众包系统编程书

原文:angrave/SystemProgramming 译者:飞龙 协议:CC BY-NC-SA 4.0 欢迎来到 Angrave 的众包系统编程维基书!这个维基是由伊利诺伊大学的学生和教师共同建立的,是伊利诺伊大学 CS 的 Lawrence Angrave 的众包创作实验。…

SpringMVC的四种跳转方式

默认的跳转是请求转发,直接跳转到jsp页面展示,还可以使用框架提供的关键字redirect:,进行一个重定向操作,包括重定向页面和重定向action,使用框架提供的关键字forward:,进行服务器内部转发操作,…

【Golang】补码二进制字符串转整型

原码反码补码移码介绍 在计算机科学中,原码、反码和补码是用来表示有符号整数的三种不同的二进制编码方式。下面将详细解释每一种编码方式的特点和用途。 原码 原码是最直观的有符号数表示方法。在原码表示法中,最高位(符号位)用…

如何解决NAND系统性能问题?--NAND分类

一、故事引言 想象一下,你正在管理一座神奇的数据仓库,这个仓库没有沉重的门、旋转的磁盘和机械手臂,而是由一群训练有素的“数据小飞侠”组成。这些小飞侠们居住在一个叫做闪存芯片(NAND Flash,本文主人公&#xff0…

vue3+TS使用component 组件的实例

目录 一.项目中实际使用 1.代码使用 二.元素 1.使用方式: 2.代码解释 一.项目中实际使用 1.代码使用 之前,我们使用过,在login相关的几个页面使用component 实现登录/注册/找回密码等页面的动态切换,在天转到这个页面时&…

第一天业务题

1-1 请说一下你项目中是如何进行项目管理和发布的 我们项目主要是用到GOGS进行项目代码的管理,jenkins进行项目的部署和编译. 首先GOGS部署在我们公司的服务器上,可以保证代码的安全,在日常的工作中,首先我会将代码拉取到本地,然后功能开发完毕后PUSH到远端,然后GOGS会向JenKin…

Bug:Goland左侧丢失项目结构(Goland常用快捷键)

Goland快捷键&小tips 1 常用快捷键 # 格式化代码 optioncommandL# 在项目中搜索文件中的内容 commandshiftF# 搜索.go文件 shiftshift(按两次shift)# 修改方法、变量(同时替换引用处的名称) fnshiftF6# 将选中代码抽取为方法…

C++中的余数

C中负数的余数是负数,正数的余数是正数,比如, -1 % 3 //结果是-1 2 % 3 //结果是2但有时候,为了方便操作,我们希望余数是正数。可以这样操作, int mod (int x, int y) {return (x % y y) % y; }

设计模式—行为型模式之状态模式

设计模式—行为型模式之状态模式 状态(State)模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类&am…

Python类装饰器跟踪委托对象的属性访问

1 Python类装饰器跟踪委托对象的属性访问 类装饰器通过添加逻辑层,管理实例接口的访问。 通过委托的方式类跟踪对象属性的访问。 通过拦截未定义属性的访问,并且转向委托对象的属性访问,来实现委托。 1.1 非装饰器委托 描述 python通过…

结构体成员 分数比较大小

题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #include<cstring>using namespace std;struct Num{double fenzi;double fenmu;char fenhao;};bool cmp(Num r1,Num r2){return r1.fenzi/r1.fenmu<r2.fenzi/r2.fenmu;}int main(){int n;Num num[n…

Android-多线程

线程是进程中可独立执行的最小单位&#xff0c;也是 CPU 资源&#xff08;时间片&#xff09;分配的基本单位&#xff0c;同一个进程中的线程可以共享进程中的资源&#xff0c;如内存空间和文件句柄。线程有一些基本的属性&#xff0c;如id、name、以及priority。 id&#xff1…

管理沟通能力测试

管理沟通能力测试用于测试管理者的潜能在交流和沟通方面的能力&#xff0c;作为管理者的能力测评是一个综合面&#xff0c;而沟通能力则是尤为重要&#xff0c;团队的凝聚力、创造力都跟管理者的沟通能力有着直接的关系。了解和提高管理沟通能力需要在实践中不断学习和总结。 …

C++(20):vector通过erase,erase_if删除符合条件的元素

C++20前,vector可以通过成员函数erase删除迭代器指定的元素,并返回被删除的下一个元素: iterator erase( iterator pos ); iterator erase( iterator first, iterator last ); 1.删除单个元素 #include <vector> #include <iostream> #include <algorithm&…

php 字符串常用函数

目录 1.一些常用函数 2.代码示例 1.一些常用函数 函数名描述trim()删除字符串两端空行或其它预定义符rtrim()删除字符串右边空行或其它预定义符ltrim()删除字符串左边空行或其它预定义符dirname()返回路径中的目录部分str_split()把字符串分割到数组里explode()使用一个字符串…