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
/** 主表:指向多个"块"的总目录(二级指针数组)* 关系:* - 每个"块"(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(下载存储)这些内存数据