11.UE-游戏逆向-内存中的FUObjectArray(深入理解内存数据)

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

本次游戏没法给

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

上一个内容:10.UE-游戏逆向-查找UObject(UObject偏移和FUObjectArray)

首先打开游戏,然后使用任务管理器把SC-Plugin for UE4进程关闭掉(如果关不掉说明检测没有处理,去看之前的内容进行处理)

然后使用ce附加,然后点击下图红框 手动添加地址

游戏exe的文件名+上一个内容中找到的FUObjectArray偏移,也就是0x4A92740,然后点击确定

然后选择浏览相关内存区域

然后选择以8字节十六进制显示

然后对比源码,只要是看绿框的TUObjectArray类型

然后接下来对比TUObjectArray类型,然后看FUObjectItem类型

FUObjectItem** 这样的写法说明内存地址里存放的是一个内存地址,然后内存地址里放的还是内存地址,最终指向一个以FUObjectItem结构存放的内存数据,鼠标单击下图红框,然后按空格键

然后就进入了1DA8F737B40这个内存地址了,然后上方说,内存地址里放的还是内存地址

然后单击下图红框,然后再按空格键进入1DA903B0008内存地址

然后下图就是以FUObjectItem结构存放的数据了

然后对比源码,到这可以应该是可以更深入的理解数据结构这个概念了

然后鼠标右击选择后退,后退到TUObjectArray里也就是FChunkedFixedUObjectArray里

下图红框的代码

代码说明,里面的元素概念指的是FUObjectItem,然后FUObjectItem存放的是UObject,然后UObject指的是角色、武器、道具、组件等游戏中的东西,然后块的概念是可以存放多少个FUObjectItem

c++ 复制代码
/** 主表:指向多个"块"的总目录(二级指针数组)
 *  关系:
 *  - 每个"块"(Chunk)是一个数组,里面装着多个"元素"(FUObjectItem)
 *  - 主表(Objects)就像"仓库货架清单",清单上的每个条目都指向一个货架(块)
 *  - 通过主表能快速找到所有货架,再从货架上找到具体的元素
 */
FUObjectItem** Objects;

/** 预分配的连续内存块:所有元素集中存放的"超级货架"
 *  关系:
 *  - 这是一块连续的内存,里面直接按顺序放着多个"元素"(FUObjectItem)
 *  - 和上面的"多块分散存储"不同,这里是"一块集中存储",访问速度更快
 *  - 相当于把所有标签(元素)都整齐地放在一个超大盒子里,而不是多个小盒子
 */
FUObjectItem* PreAllocatedObjects;

/** 最大元素数量:系统能管理的最多"元素"总数
 *  关系:
 *  - "元素"(Element)就是单个FUObjectItem,每个对应一个游戏对象(UObject)
 *  - 这个值是上限,比如"最多能有10000个标签",不管这些标签放在多少个块里
 */
int32 MaxElements;

/** 当前元素数量:现在实际存在的"元素"总数
 *  关系:
 *  - 等于所有块里的元素数量相加(比如3个块各有100、200、300个元素,总数就是600)
 *  - 每个元素对应一个真实的游戏对象,这个数越多,说明当前加载的对象越多
 */
int32 NumElements;

/** 最大块数量:主表(Objects)能容纳的最多"块"总数
 *  关系:
 *  - "块"(Chunk)是装元素的容器(数组),比如"最多能有10个盒子"
 *  - 超过这个数就需要扩容主表,否则无法新增块
 */
int32 MaxChunks;

/** 当前块数量:现在实际存在的"块"总数
 *  关系:
 *  - 每个块里都装着若干元素(比如当前有5个盒子,每个盒子里装着不同数量的标签)
 *  - 当元素数量增加,现有块装不下时,会新增块(这个数会增加)
 */
int32 NumChunks;

然后以4字节十进制的方式查看

如下图,可以看出当前游戏的最大元素是2162688,当前元素数量是47681个,然后最大块是33,当前块的数量是1,如果切换地图它的数量会有变化

然后它现在变成了52841个元素了,添加了5千多个以FUObjectItem结构存放的数据(FUObjectItem对象)

然后记录一下偏移,TUObjectArray在FUObjectArray中0x10位置,FUObjectArray的位置是游戏基址+上一个内容找到的0x4A92740,也就是说最终的公式 游戏基址 + 0x4A92740 +0x10=TUObjectArray

下一节将要Dump(下载存储)这些内存数据


相关推荐
TeleostNaCl3 小时前
使用 jintellitype 库在 Java 程序中实现监听 Windows 全局快捷键(热键)
java·开发语言·windows·经验分享·kotlin·电脑
祈祷苍天赐我java之术5 小时前
Redis 有序集合解析
java·前端·windows·redis·缓存·bootstrap·html
maki0775 小时前
VR大空间资料 03 —— VRGK使用体验和源码分析
android·vr·虚幻·源码分析·oculus·htc vive·vrgk
你好龙卷风!!!6 小时前
mac | Windows 本地部署 Seata1.7.0,Nacos 作为配置中心、注册中心,MySQL 存储信息
windows·mysql·macos
恸流失9 小时前
java基础-12 : 单列集合(Collection)
java·开发语言·windows
maki07713 小时前
VR大空间资料 02 —— 常用Body IK对比
android·游戏引擎·vr·虚幻·pico·ik
Predestination王瀞潞15 小时前
UE4报错:无法编译项目
游戏引擎·虚幻·解决方案
做运维的阿瑞1 天前
Windows 环境下安装 Node.js 和 Vue.js 框架完全指南
前端·javascript·vue.js·windows·node.js
1024小神1 天前
windows远程桌面连接的时候用户名用什么
windows