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

7.游戏逆向-pxxx-TUObjectArray分析

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

本次游戏没法给

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

上一个内容:6.游戏逆向-pxxx-GName加密算法(解密)

找它的原因是通过GObject(TUObjectArray)dump函数地址、枚举、结构体、类,这样就可以比较轻松的找到游戏需要的结构,在UE中万物皆对象,GObject就是对象的管理器,所有对象都归GObject来管,都在GObject里面,想要得到GObject就要了解TUObjectArray

如下图使用VS搜索 TUObjectArray

下图红框的就是TUObjectArray,直接双击下图红框进行跳转

如下图红框TUObjectArray是一个FFixedUObjectArray类型

按着CTLR鼠标左键单击FFixedUObjectArray就可以跳转到下图红框位置了,也就是FFixedUObjectArray里面

它有下图红框的三个成员,除了下图红框的三个成员,其它的不需要知道

/*** 固定大小的UObject数组(UE引擎专用)* 简单说:这个类是用来"装"游戏里各种对象(UObject)的容器,而且容量是固定的,不能随便扩容* 注:UObject是UE引擎中几乎所有游戏对象的"祖宗"(基类),比如角色、道具、技能等最终都属于UObject*/
class FFixedUObjectArray
{/** * 指向存储UObject项的主数组(核心存储区)* 可以理解为:这是一个"盒子数组",每个盒子(FUObjectItem)里装着一个UObject对象的信息* FUObjectItem:是包装UObject的小结构体,里面除了UObject本身,可能还有一些状态标记(比如是否在使用中)*/FUObjectItem* Objects;/** * 数组能容纳的最大元素数量(总容量)* 因为是"固定大小"数组,这个值一旦确定就不会变,比如MaxElements=10000,就最多能装10000个UObject*/int32 MaxElements;/** * 当前实际存储的UObject数量(已使用的槽位)* 比如MaxElements=10000,现在存了3000个对象,那NumElements=3000(一定小于等于MaxElements)*/int32 NumElements;
};

接下来进入FUObjectItem结构

/*** UObject数组中的单个项目(相当于"数组里的每个小格子")* 简单说:这个结构体是UObject的"包装器",除了装着实际的游戏对象,还附带了一些管理这个对象的小信息*/
struct FUObjectItem
{// 指向实际分配的UObject对象(核心内容)// 比如:如果这个Item在"角色数组"里,Object就指向具体的角色对象(如玩家、怪物);// 如果在"道具数组"里,就指向具体的道具(如武器、药水)class UObjectBase* Object;// 内部标记(状态标签)// 用整数的不同位表示对象的各种状态,比如:// - 是否被标记为"待删除"// - 是否正在被使用(被其他对象引用)// - 是否是临时对象(用完就扔)// 引擎通过这些标记快速判断对象的状态,不用每次都去查复杂信息int32 Flags;// UObject所属集群的根索引(分组管理用)// 引擎会把相关的对象分到一个"集群"(比如一个关卡里的所有怪物属于一个集群),// 这个索引指向集群的"根对象"(集群的老大),方便批量管理(比如一次性加载/卸载整个集群的对象)int32 ClusterRootIndex;// 与对象关联的"弱指针序列号"(防止野指针用)// "弱指针"是一种特殊的指针,不会阻止对象被删除。当对象被删除后,// 这个序列号会变,弱指针通过检查序列号就能知道"指向的对象是不是已经没了",// 避免访问已经被销毁的对象(防止程序崩溃)int32 SerialNumber;
};

然后接下来进入UObjectBase

UObjectBase它的成员

class COREUOBJECT_API UObjectBase
{// 1. 对象状态标志(用"二进制位"记录对象的各种状态)// 比如:是否能被编辑(RF_Editable)、是否正在被垃圾回收(RF_GCCollectible)、是否是临时对象(RF_Temporary)等// 引擎通过这些标志快速判断对象的行为(比如垃圾回收时会跳过标记为"不可回收"的对象)EObjectFlags ObjectFlags;// 2. 全局对象数组中的索引(相当于对象的"身份证号")// 所有对象都会存在一个全局数组(GObjectArray)里,这个索引就是该对象在数组中的位置// 作用:通过索引能快速找到这个对象(类似数组下标,O(1) 速度)int32 InternalIndex;// 3. 对象所属的"类"(相当于"对象的模板")// 比如:玩家对象的 ClassPrivate 是"APlayerCharacter"类,道具对象的是"AItem"类// 类里定义了对象有哪些功能(方法)和属性(变量),就像"人类"这个类定义了人会走路、吃饭一样UClass* ClassPrivate;// 4. 对象的名字(每个对象的唯一标识,类似"小明""小红")// 用 FName 类型存储(UE 中的高效字符串类型,确保名字不重复)// 比如:玩家对象可能叫"Player01",武器对象可能叫"Sword001"FName NamePrivate;// 5. 外部所有者对象(相当于"这个对象属于谁")// 比如:玩家手里的武器,武器的 OuterPrivate 就是玩家对象;关卡里的怪物,OuterPrivate 就是关卡对象// 作用:形成对象之间的"所属关系树",方便管理(比如删除关卡时,自动删除它所有的子对象)UObject* OuterPrivate;}

到这应该就对TUObjectArray有了一个了解,接下来找GObject的基址,找GObject基址就要用IDA了,所以要找一个可以在IDA中搜索的字符串,如下图在vsz中搜索CanvasObject,CanvasObject是一个画布对象它也是在GObject里面,CanvasObject是一个比较常用的

找下图红框的,直接双击下图红框

然后就可以看到下图红框的内容,我们要找的是GetCanvasByName函数,它是通过一个名字得到一个对象,也就是从GObject里面得到一个对象

如下图在ida中搜索 CanvasObject,然后双击下图蓝框

然后双击下图红框

然后就可以看到下图的代码了

然后按F5,如下图生成伪代码开始分析

然后通过源码对比,就找对了地方

通过对比分析下图红框的是比较符合GetCanvasByName函数的

进入GetCanvasByName函数,它里面很复杂,下一节再细写


img

http://www.dtcms.com/a/577133.html

相关文章:

  • web214-web220
  • 通州北苑网站建设程序开发的基本步骤是什么?
  • 专题:2025中国制造业出海与出海品牌社媒影响力洞察报告|附300+份报告PDF、数据、绘图模板汇总下载
  • 【 C/C++ 算法】入门动态规划 ----- 简单多状态 dp 问题》打家劫舍 和 股票买卖问题
  • (114页PPT)华为FusionCloud私有云最佳实践RegionTypeII(附下载方式)
  • 赤壁专业建站公司学做卤味视频网站
  • 3d光学轮廓仪如何局部测量标准台阶?
  • 【数据集+完整源码】水稻病害数据集,yolov8水稻病害检测数据集 6715 张,目标检测水稻识别算法实战训推教程
  • 3D Gaussian Splatting:渲染流程
  • 云原生LVS+Keepalived高可用方案(二)
  • IBM VO 面试经验分享|一场更像“聊天”的正式考核
  • 用单位的服务器做网站关键词优化网站
  • C语言基础开发入门系列(八)C语言指针的理解与实战
  • 如何绑定网站域名解析电商网站模板html
  • 【机器视觉通用检测框架】基于VS2019 C#+VisionPro9.0开发的视觉框架软件,全套源码,开箱即用
  • 智慧交通管理新范式 基于深度学习的城市交通车型识别AI监控系统 车型识别 停车场车型分类系统 高速路车型识别算法
  • pnpm 安装依赖后 仍然启动报的问题
  • 【河北政务服务网-注册_登录安全分析报告】
  • 深入理解 package.json:前端项目的 “身份证“
  • 【辽宁政务服务网-注册_登录安全分析报告】
  • 免费正能量励志网站建设网站要多久到账
  • 新乡市红旗区建设局网站网页制作素材网有哪些
  • 用车申请车辆管理小程序开发
  • 单片机.RS485
  • 从单模型到多域自由转换:StarGAN的公式与多域图像生成魔法
  • 人工智能在全球多领域的应用潜力及当前技术面临的挑战
  • Python处理json数据
  • go开发规范指引
  • 期权交易中的希腊字母:风险管理的多维指南
  • C++---关键字constexpr