当前位置: 首页 > news >正文

22.第二阶段x64游戏实战-分析周围对象类型

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

上一个内容:21.第二阶段x64游戏实战-分析采集物偏移

上一个内容里发现采集物的名字通过我们的列表展示出来是空的,然后又去找了采集物名字的偏移,这里就有一个问题,现在名字的偏移有两个npc(包含我们的角色、附近玩家、游戏中的npc)是一个偏移,采集物名字又是另外的偏移,什么时候用采集物的偏移什么时候用npc的偏移?游戏中它自身也会有这个问题,所以游戏中它肯定是有一个对象(对象是一个抽象的概念它指的可以是玩家、附近玩家、游戏中的npc、采集物等,它可以指任意一个东西,当前说的对象指的是玩家、附近玩家、游戏中的npc、采集物)类型,比如1表示我们的角色、2表示的是附近玩家、3表示游戏中的npc、4表示采集物等这样的数据,本次就来找这个类型是什么,找到类型之后,就可以通过类型判断什么时候用什么偏移了。

开始找类型,首先如下图红框,来到上一个内容得到采集物名字的位置

如下图红框,一设置断点它就会断下来,下图红框位置是采集物的名字,为什么会断下来?因为我的角色里采集物很近,游戏中访问采集物名字了

如下图,人物就在采集物旁边

接下来移动我们的角色,让它远离采集物,移动到采集物在地图上看不到了为止,如下图让角色远离采集物之后再次设置断点它就不会断下来了,当前位置前面的代码肯定有一行判断了类型,接下来就开始找远离了采集物在什么位置设置断点它还会断下来,为了防止有其它问题在开始之前记得把我们之前写的读取附近npc代码关闭

就算找在什么位置断下来也是有技巧的,下图rsi在上一个内容中看到的它是采集物对象,然后就找rsi在哪赋值的,通过找它来找断点位置

如下图通过往上滑看到还有位置读取了rsi+0x150位置,给他设置断点它也不会断,继续往上滑

通过不断的往上滑和设置断点,发现下图位置设置断点之后会断下来

然后在下图位置设置断点不会断下来

当移动到有矿石的位置它才会断下来

它断不断取决于下图红框位置的代码 test eax,eax,test和je配合意思是值是0的时候je会跳转

下图置位的意思是赋值,也就是把zf标识设置成1

然后eax的值来自于下图红框call,所以就要进入这个call

设置断点

取消断点

然后按F7进入call

代码的分析,大体就是判断rdx和r8是不是相等,rdx和r8应该就是类型了

如下图按减号(-号)回到上一层,可以看到r8来自于一个基址,rdx来自于rax

r8的值是一个字符串这个字符串Resource应该就是采集物的类型了,Resource中文是资源的意思

然后找一下rax的值哪来的,如下图红框,rax的值来自于call rax+0x70这个函数

通过分析下图红框的三行代码,可以知道这个应该rax+0x70是一个对象的虚函数(下面就写虚函数在内存中的样子和介绍)

设置断点

取消断点

按F7进入call rax + 0x70,如下图它就一行代码

然后跳转到 0x00007FF6BE5253E0 这个地址 MouseTarget中文意思鼠标目标

然后移动角色到采集物位置,继续在下图红框位置设置断点,这个游戏如果不移动到采集物附近,rax的值不会变

如下图断点查看当前rax的值

如下图打开我们的遍历周围列表,可以发现rcx是对象地址

通过上面的分析知道了,对象继承了一个通用类,虚函数就是父类中的函数,这是C++中的概念,不了解C++只要记得上面三行的写法就是调用虚函数(见多了就记住了),虚函数有多个对象首地址存放的就是虚函数列表,rax+0x70虚函数用来得到当前对象的类型,下面手动找虚函数,查看它的类型,下图红框是一个怪物的对象

跳转到对象位置

然后在内存窗口中跳转过去

然后右击选择地址

然后偏移0x70位置

右击选择在反汇编中转到指定QWORD

如下图跳转之后

然后复制 lea rax, ds:[0x00007FF6BE524FC8]中 0x00007FF6BE524FC8这个地址,这个怪物的类型是PlayerNPC

再看一个我们自己 PlayerMySelf,MySelf中文我自己的意思

现在就找到类型了,然后开始计算 lea rax, ds:[0x00007FF6BE524EA8] 里面的0x00007FF6BE524EA8怎么取,去它要用到下图红框的两个东西,下一行代码的地址和当前代码+0x3位置

为什么是当前代码+0x3位置,如下图

计算公式 A1 09 82 00 这是小端序存储用的时候要反着写(我们自己用的Windows系统一般都是小端序存储)

总结:

现在我们要取类型的话,首先获取对象,然后获取虚函数表,然后得到0x70位置的虚函数,然后取加0x3位置的数据就得到了A1 09 82 00,然后在取+0x7位置也就是下一行代码的地址,然后让它俩相加就得到了类型

开始写代码,下图红框位置是列表显示类型的代码

然后获取名字的代码

VDataStu  GameData::TraverseBN(QWORD point) {// [[[[ReadDword64(B_number + 8) + 0x10]+ 0x28] + 0x1B0] + 0x18] + 0x8/**判断是否选中(或者说找到目标的标记)*/if (!ReadByte(point + 0x19)) {Role_Stu Rstu;Rstu.m_Objadr = ReadDword64(point + 0x28);// 获取树中的数据/*Rstu.m_ID = ReadInt(Rstu.m_Objadr + 0x44);*//**ReadDword64(Rstu.m_Objadr) + 0x70) 得到虚函数ReadDword64(ReadDword64(Rstu.m_Objadr) + 0x70) + 3) 得到虚函数+0x3位置的数据,也就是A1 09 82 00ReadDword64(ReadDword64(Rstu.m_Objadr) + 0x70) + 7) 这个是得到下一行代码*/QWORD address = ReadDword64(ReadDword(ReadDword64(ReadDword64(Rstu.m_Objadr) + 0x70) + 3) + ReadDword64(ReadDword64(Rstu.m_Objadr) + 0x70) + 7);Rstu.type_name = ReadStrA((char*)address);QWORD addr = ReadDword64(ReadDword64(Rstu.m_Objadr + 0x1b0) + 0x18);Rstu.m_HP.ptr = ReadFloat(addr + 8) * 100;// 判断 type_name字符串是不是以Resource结尾,如果是就说明当前是采集物if (Rstu.type_name.find("Resource") != string::npos)// 得到采集物名字Rstu.m_Name = ReadStrA((char*)(ReadDword64(ReadDword64(Rstu.m_Objadr + 0x150) + 0x8)));elseRstu.m_Name = ReadStrA((char*)(addr + 0x30));Rstu.fPos.x = ReadFloat(Rstu.m_Objadr + 0x5c);Rstu.fPos.z = ReadFloat(Rstu.m_Objadr + 0x60);Rstu.fPos.y = ReadFloat(Rstu.m_Objadr + 0x64);m_Around.m_data.push_back(Rstu);TraverseBN(ReadDword64(point));// 遍历左边的树TraverseBN(ReadDword64(point + 0x10));// 遍历右边的树}return m_Around;
}

效果图:

 


img

相关文章:

22.第二阶段x64游戏实战-分析周围对象类型

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:21.第二阶段x64游戏实战-分析采集物偏移 上一个内容里发现采集物的名字通过我们…...

【C/C++】无符号调试:GDB解栈实战指南

文章目录 无符号调试:GDB解栈实战指南1 生成并加载 Core Dump2 查看原始堆栈信息(地址形式)3 确认加载的共享库地址范围4 手动转换地址为函数名5 反汇编关键代码段6 加载外部符号文件(如有)7 结合系统库文档分析8 示例…...

梦熊联盟:202505基础语法-题解

202505基础语法-题解 T1 - 九的倍数 解法: 对于 9 的倍数,只需要判定其各位的数码和是否为 9 的倍数即可。 例如判断一个数是不是 9 的倍数,只要判断其各位数字之和是不是 9 的倍数,因为一个数能被 9 整除当且仅当它的各位数字之和…...

Java SE(11)——内部类

1.内部类 定义:Java中的内部类(Inner Class)是指在一个类的内部定义的类。 使用场景:当一个类的内部,存在一个部分需要完成的结构进行描述,而该内部结构只为外部类提供服务,那么这个内部结构就可以使用内部类&#xff…...

优化审核模块响应时间从8s降至1.2s的数据库解决方案

优化审核模块响应时间从8s降至1.2s的数据库解决方案 要优化审核模块的数据库性能,需要从多个层面进行分析和优化。以下是具体的SQL语句设计和优化方案: 1. 分析当前性能瓶颈 首先需要找出慢查询: -- 查看慢查询日志中的审核模块相关查询 …...

YOLO-World:基于YOLOv8的开放词汇目标检测

文章目录 前言1、出发点2、方法2.1.TextEncoder2.2.ReparmVLPAN2.3.输出头 3、实验3.1.数据集3.2.LVIS测试集 总结 前言 本文介绍一篇来自腾讯的开放词汇检测工作,发表自CVPR2024,论文链接,开源地址。 1、出发点 GroundingDINO在开放词汇检测…...

NX989NY104美光科技芯片NY109NY113

NX989NY104美光科技芯片NY109NY113 存储市场新势力:美光科技的崛起与技术突围 在半导体行业波澜壮阔的浪潮中,美光科技宛如一颗璀璨的明珠,以其独特的技术实力和敏锐的市场洞察力,在存储领域占据了重要的一席之地。尤其是其旗下…...

LabVIEW的PID参数自适应控制

在工业控制领域,PID 控制凭借结构简单、稳定性好、工作可靠等优点被广泛应用。然而,传统固定参数的 PID 控制在面对复杂多变的工况时,控制效果往往难以达到最优。基于 LabVIEW 实现 PID 控制根据情况选择参数(即参数自适应调整&am…...

Quartus与Modelsim-Altera使用手册

目录 文章内容: 视频内容: Quartus: ModelSim: 顶层设计与子模块: 只是对所查阅的相关文章的总结与视频总结 文章内容: 这篇对基础操作很详细: 一、Quartus II软件的使用_quartus2软件上…...

设计模式之工厂模式(二):实际案例

设计模式之工厂模式(一) 在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。 以下是我整理出来的类图: 关键说明&#x…...

数据可视化大屏——智慧社区内网比对平台

综述分析: 智慧社区内网数据比对信息系统 这段代码实现了一个智慧社区内网数据比对信息系统的前端界面,采用三栏式布局展示各类社区安全相关数据。界面主要由左侧数据统计、中间地图展示和右侧数据分析三部分组成,使用了多种图表可视化技术…...

Spark任务调度流程详解

1. 核心调度组件 DAGScheduler:负责将Job拆分为Stage,处理Stage间的依赖关系。 TaskScheduler:将Task分配到Executor,监控任务执行。 SchedulerBackend:与集群管理器(如YARN、K8s)通信&#x…...

LeetCode 215题解 | 数组中的第K个最大元素

数组中的第K个最大元素 一、题目链接二、题目三、算法原理四、编写代码 一、题目链接 数组中的第K个最大元素 二、题目 三、算法原理 法一:排序 法二:优先级队列(堆) 重点看法二: 默认建大堆,意味着以…...

探秘 Cursor 核心:解锁系统提示词的进阶之路

在 AI 编程领域,Cursor 无疑是一颗耀眼的明星,其母公司 Anysphere 在短短三个月内,估值从 25 亿美元狂飙至 100 亿美元,这样的发展速度令人咋舌。而 Cursor 强大功能背后的核心 —— 系统提示词,始终笼罩着一层神秘的面…...

ElasticSearch入门详解

1.ElasticSearch 1.1 ElasticSearch(简称es) Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。 客户端支持Java、.NET(C#)、PHP、Py…...

【计算机网络01】 网络组成与三种交换方式

【参考资料】 《自顶向下的计算机网络第八版》湖科大计算机网络(b站)王道考研(b站) 文章目录 一、网络基础概念解析1.1 网络、互联网与因特网 二、因特网发展三阶段(了解)三、ISP3.1 ISP基本概念3.2 基于I…...

计算机网络——以太网交换机

目录 交换机的作用 以太网交换机的自学习功能 因为以太网交换机有自学习功能,所以以太网交换机支持即插即用 交换机的作用 它工作在数据链路层,为结点转发帧,并且可以根据一个帧的目的MAC地址去进行相应的转发,以及交换机的每…...

机器视觉开发教程——C#如何封装海康工业相机SDK调用OpenCV/YOLO/VisionPro/Halcon算法

目录 引言前期准备Step1 创建工程Step2 创建接口2.1定义操作相机实例接口方法2.2定义设置相机参数接口方法(部分) Step3 创建基类3.1定义操作相机实例&&设置相机参数的抽象层3.2定义操作相机实例&&设置相机参数的公用方法1.获取当前帧图…...

c++STL-string的模拟实现

cSTL-string的模拟实现 string的模拟实现string的模拟线性表的实现构造函数析构函数获取长度(size)和获取容量(capacity)访问 [] 和c_str迭代器(iterator)交换swap拷贝构造函数赋值重载(&#x…...

HTTP 和 WebSocket 的区别

✅ 一、定义对比 协议简要定义HTTP一种基于请求-响应模式的、无状态的应用层协议,通常用于客户端与服务器之间的数据通信。WebSocket一种全双工通信协议,可以在客户端和服务器之间建立持久连接,实现实时、低延迟的数据传输。 ✅ 二、通信方式…...

【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)

这里写目录标题 1. VS基本使用1.1. 快捷键1.2. 查看变量地址1.3. 查看代码汇编1.4. visual studio 热重载功能的使用1.5. vs远程服务器调试1.6. 引入第三方库VLD1.7. release debug模式 1. VS基本使用 1.1. 快捷键 ctrl c :复制光标所在行 注意:只需要光标在这…...

一周内学完计算机网络课程之二:计算机网络物理层的理解

消失人口回归,重新开始学习新知识。再次伟大。 物理层详解 需要理解的几个概念: 曼彻斯特编码、差分曼彻斯特编码 码元:构成信号的基本单元 调制: 通信中的调制是一种将原始信号(如音频、视频、数据等)转…...

Python OpenCV性能优化与部署实战指南

在计算机视觉领域,OpenCV作为开源视觉库的标杆,其性能表现直接影响着从工业检测到AI模型推理的各类应用场景。本文结合最新技术趋势与生产实践,系统性梳理Python环境下OpenCV的性能优化策略与部署方案。 一、性能优化核心技术矩阵 1.1 内存…...

深度解析:可视化如何重塑销售策略制定与执行

为什么你的销售策略总是“听起来挺对,做起来却没用”? 你有没有遇到过这样的情况: 销售团队天天跑客户,但业绩还是上不去;市场部说数据在增长,销售部却觉得“根本没转化”;高层开会时信心满满…...

opencv关键点检测

python 使用opencv进行图片关键点检测 功能: 在一张图片中裁剪出一块小图 使用cv2中 cv2.SIFT_create() SIFT检测器检测关键点 匹配原图和小图的关键点 import cv2 import numpy as np # 读取图像 img1 cv2.imread(rE:\234947.jpg, cv2.IMREAD_GRAYSCALE) img…...

C#游戏开发中的注意事项

目录 一、性能优化:提升游戏运行效率 1. 避免不必要的循环和迭代 2. 减少字符串拼接 3. 利用Unity的生命周期函数 4. 使用对象池(Object Pooling) 二、内存管理:避免内存泄漏和资源浪费 1. 及时释放非托管资源 2. 避免空引用异常 3. 合理使用引用类型和值类型 4. …...

MySQL的锁

锁 概述:锁是计算机协调多个线程或进程并发访问某一资源的机制。如何保证数据库中并发的一致性,有效性,这就是锁的作用。 分类: 全局锁 对数据库实例加锁,加锁之后,处于只读状态,后续的DML语句…...

学习黑客5 分钟小白弄懂Windows Desktop GUI

5 分钟小白弄懂Windows Desktop GUI 🖥️ 大家好!今天我们将深入浅出地探索Windows桌面图形用户界面(GUI)——这是我们每天与计算机交互的"门面"。无论你是刚开始接触计算机,还是想在TryHackMe等平台上提升安全技能,理…...

机器人运动控制原理浅析-UC Berkeley超视觉模态模型

加州伯克利发布的超视觉多感知模态融合(FuSe, Fuse Heterogeneous Sensory Data)模型,基于视觉、触觉、听觉、本体及语言等模态,利用自然语言跨模态对齐(Cross-Modal Grounding)优调视觉语言动作等通用模型,提高模型任务成功率。 总体框架 …...

【计算机网络】网络IP层

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:传输层协议TCP 下篇文章:数据链路层 文章摘要&#xff1…...

Nginx重写功能

目录 一 . 简介 二. if指令 2.1基本语法 2.2 举例说明 2.3 配置实例 三. return 3.1 基本语法 3.2 配置实例 四. set指令 4.1 基本语法 4.2 举例说明 4.3 配置实例 五.break指令 5.1 作用 5.2 举例说明 5.3 配置实例 六.rewrite指令 6.1 基本语法 6.2 配…...

2025-05-11 项目绩效域记忆逻辑管理

好的,我们可以用一个故事来帮助记忆这些规划绩效域的要素,同时通过逻辑关系来串联它们。以下是一个故事化的版本: 《项目管理的奇幻之旅》 在一个遥远的王国里,有一个勇敢的项目经理名叫小K。小K被国王赋予了一个艰巨的任务&…...

全模态具身智能:从 VLM 到 MLLM

写在前面 人工智能的感知边界正在以前所未有的速度扩展。最初,我们惊叹于大型语言模型(LLM)对文本的深刻理解和流畅生成。很快,视觉语言模型(Vision-Language Models, VLM) 登场,让 AI 第一次真正“看见”了世界,能够理解图像内容并将其与语言关联,实现了“看图说话”…...

C++入门小馆: 二叉搜索树

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...

C++.IP协议通信

C++IP协议通信 1. TCP协议通信1.1 服务端实现创建套接字绑定地址监听连接接受连接数据传输关闭连接1.2 客户端实现创建套接字连接服务器数据传输关闭连接1.3 示例代码服务端代码示例客户端代码示例绑定地址接收数据发送数据关闭套接字2.2 客户端实现创建套接字发送数据接收数据…...

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框1. 退出编辑器时弹出的“Save Content”窗口2. File 菜单中的保存选项3. 区别总结 1. 退出编辑器时弹出的“Save Content”窗口 退出时…...

【KEIL】更新AC6编译器

看过部分的文章,Arm Compiler 6(AC6)编译器,相比AC5在编译速度和代码优化上提升了。因此,笔者决定升级到AC6的最新版本。可以更新keil5到最新版本,上面集成AC6编译器的版本,与最新版相差不远。假…...

Mosquitto MQTT库实战指南

目录 1. MQTT协议简介2. Mosquitto概述3. 开源MQTT实现对比4. 为什么选择Mosquitto5. Mosquitto的交叉编译6. MQTT发布订阅实战7. 进阶应用与最佳实践8. 总结 1. MQTT协议简介 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻…...

C语音学习---函数指针

目录 1. 函数指针解析 2. 自定义实现(函数指针赋值) 利用下面一段例子来解析: int (*set_slave)(modbus_t *ctx, int slave); 1. 函数指针解析 set_slave 是一个 函数指针,指向一个函数。 该函数接受两个参数: mo…...

04.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending

本实例主要讲解内容 这个示例展示了Three.js中**骨骼动画的叠加混合(Additive Animation Blending)**技术。通过加载一个机器人模型,演示了如何在基础动画(如站立、行走、跑步)之上叠加额外的动画效果(如潜行姿态、悲伤表情、点头同意等),实现更丰富的角…...

WSL配置docker启动nacos容器load derby-schema.sql error.问题解决方案

nacos配置问题 问题再现查看错误logsQWEN的解答不挂载/data结论 问题再现 本来想要本地跑一下nacos,之前都是直接在Linux环境下面,现在就使用windows的wsl跑一下nacos,之前是需要先配置/conf文件下面的porperties文件以及构建对应的nacos-config数据库。所以我使用…...

游戏引擎学习第272天:显式移动转换

回顾并为今天的内容铺垫背景 我们刚开始为游戏主角编写一些程序逻辑,因为我们之前已经完成了大部分引擎方面的开发,现在可以专注在角色身上。这个角色的移动方式会有些特别,与大多数游戏角色的运动机制不太一样。我们当前正在实现的控制方式…...

AVL树解析

插入操作 // 插入操作 bool insert(const pair<K, V>& kv) {// 若树为空&#xff0c;直接构造&#xff0c;new一个if (_root nullptr) {_root new Node(kv);return true;}// 用于遍历树的当前节点Node* cur _root;// 用于记录当前节点的父节点Node* parent n…...

vue 中的数据代理

在 Vue 中&#xff0c;数据代理&#xff08;Data Proxy&#xff09; 是 Vue 实现 MVVM 模式 的关键技术之一。Vue 使用数据代理让你可以通过 this.message 访问 data.message&#xff0c;而不需要写 this.data.message —— 这大大简化了模板和逻辑代码。 我们来深入理解它的本…...

Linux共享内存深度解析:从内核机制到云原生应用

引言&#xff1a;超越进程边界的内存魔术 在Linux系统的进程间通信&#xff08;IPC&#xff09;领域&#xff0c;共享内存&#xff08;Shared Memory&#xff09;如同魔法镜子般的存在——不同进程透过它看到相同的内存镜像。这种机制摒弃了数据拷贝&#xff0c;直击性能瓶颈&…...

Vue Router全局拦截

Vue Router全局拦截全攻略 一、为什么需要全局拦截&#xff1f; 最近在开发后台管理系统时&#xff0c;突然发现所有页面都需要登录才能访问。如果每个页面都手动检查登录状态&#xff0c;那代码简直要写成意大利面条了。这时候&#xff0c;Vue Router的全局拦截功能就像个贴…...

从0开始学linux韦东山教程第三章问题小结(3)

本人从0开始学习linux&#xff0c;使用的是韦东山的教程&#xff0c;在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心&#xff0c;视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…...

【前端】【css】【总复习】三万字详解CSS 知识体系

🌈 CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS(Cascading Style Sheets,层叠样式表)是一种用于给 HTML 页面添加样式的语言,作用是让网页更美观、结构更清晰、布局更灵活。 核心作用: 控制网页元素的 颜色、字体、间距、边框、背景布局网页元素位置…...

Linux 进程等待

1、进程等待 僵尸进程 是一个比较麻烦的问题&#xff0c;如果不对其做出处理&#xff0c;僵尸进程 就会越来越多&#xff0c;导致 内存泄漏 和 标识符 占用问题 进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为力&#xff0c;因为…...

轻量服务器与宝塔

因为访问宝塔面板是需要在安全组设置一下开放端口&#xff0c;比如这里是42450 但是我们用的轻量服务器是把安全组这种功能削减了的&#xff0c;所以我就去尝试修改了一下防火墙设置 然后就可以访问了...