UE4(5)逆向学习笔记(三)——UEDumper源码学习

news/2024/9/19 15:38:40/文章来源:https://www.cnblogs.com/MLKSJ/p/18407977

目录
  • 0.前言
  • 1.准备
  • 2.开始阅读
    • 2.1 设置版本和Offset
    • 2.2 获取GName
    • 2.3 使用GName
    • 2.4 获取GUObjectArray
    • 2.5 使用GUObjectArray
    • 2.6 寻找dump主流程
      • 2.6.1 ObjectsManager::copyGObjectPtrs
      • 2.6.2 ObjectsManager::copyUBigObjects
      • 2.6.3 EngineCore::cacheFNames
      • 2.6.4 EngineCore::generatePackages
  • 3.疑问
  • 4.结尾

0.前言

笔记(二)中我们拿到了GWorld,GName和GUObjectArray的偏移值,接下来就以这些为输入,来学习一下UEDumper的源码中是怎么使用这些偏移的,以及UEDumper的工作流程。

UEDumper利用GWorld,GName和GUObjectArray,结合UE的反射机制dump出SDK
在了解了UE引擎的反射机制后,我猜测,UEDumper的基本工作流程是:

a.通过偏移+基址的方式获取到目标进程中的GWorld,GName,GUObjectArray
b.遍历GUObjectArray和GWorld中的所有实例
c.再通过GName查询到实例中的各种名称
d.输出

1.准备

源码地址:https://github.com/Spuckwaffel/UEDumper
版本:UEDumper-1.11.1
我这边工程可直接打开并编译,如此步有问题欢迎交流。

如果有对使用UEDumper有疑惑的,可先查看此视频,或自己试试看。

2.开始阅读

2.1 设置版本和Offset

  • 打开工程后定位到UEdefinitions.h,或者从代码中的UE_VERSION宏F12过去


在此处设置好被Dump程序的UE版本

  • 再定位到Offset.h
    这里需要填入GWorld,GName和GUObjectArray的偏移值


setOffsets函数里,代码将GWorld,GName和GUObjectArray的偏移值与对应的名称关联并存入了容器offsets中

2.2 获取GName

搜索函数名setOffsets
定位到如下位置:


在EngineCore类的构造里,调用了setOffsets,将返回的偏移值们存入成员offsets中,再调用函数getOffsetForName和getOffsetAddress来获取GName并存入成员gName。

2.3 使用GName

搜索gName,定位到函数std::string EngineCore::FNameToString(FName fname);这个函数可以将fname(字符串索引)转化为string(字符串)。


功能对应了我猜想中的:

c.再通过GName查询到实例中的各种名称

我们继续看看怎么查询GName,下图是我大概的理解。


注释上有说道,此函数的算法是来自UE引擎源码的,关于FNamePool,FName等类型的具体的结构留到UE源码学习的时候再了解。

2.4 获取GUObjectArray

本来想通过追踪函数FNameToString的引用来追踪遍历GUObjectArray的部分,但是引用的地方比较多且有上层包装。
但是通过上面的分析,我知道了使用offset的时候需要调用getOffsetForName和getOffsetAddress,以此线索搜索到下图:


在ObjectsManager类的构造里看到了熟悉的操作,获取到GUObjectArray后将其保持在成员gUObjectManager.UObjectArray中。

2.5 使用GUObjectArray

搜索gUObjectManager.UObjectArray,我看到了一些循环遍历操作,也有通过index来查找对象指针的操作。
但是ObjectsManager类终归只是提供功能的模块,我现在更想找到程序运行的主流程代码。
观察ObjectsManager类的定义时,我发现了函数setSDKGenerationDone,用来设置SDK生成完成时的状态。

初始状态为“正在获取SDK”,setSDKGenerationDone会将状态设置为“正在使用SDK并查找新的ovject”

2.6 寻找dump主流程

搜索全部setSDKGenerationDone。

发现除了ObjectsManager中的声明和定义,只有一处调用了。

调用发生在DumpProgress::render()函数中,从日志信息来看,就是dump主流程了。

继续阅读代码,看到了之前见过的ObjectsManager和EngineCore


到第5步调用setSDKGenerationDone时,获取SDK就已经完成了,下面再逐步探索前4个步骤。

2.6.1 ObjectsManager::copyGObjectPtrs

函数声明提到,该函数的功能是将UObjectArray中的所有指针复制到一个大缓冲区中。

代码实现中用了一个循环,来遍历UObjectArray数组中的每一个对象指针。

2.6.2 ObjectsManager::copyUBigObjects

该函数的功能是将UObjectArray数组中每个UObject对象复制到缓冲区中

同样也是使用循环遍历,每个UObject获取到UObjectManager::UBigObject类对象中,存储在容器gUObjectManager.linkedUObjectPtrs中。

2.6.3 EngineCore::cacheFNames

该函数的功能是遍历上一步保存的所有UObject对象,缓存其名称(FName)。

object->getName()内部即为2.3中看过的函数FNameToString

关于缓存


2.6.4 EngineCore::generatePackages

该函数的功能是生成所有包。

函数比较大,就先不截图了,主要功能包括了:

a.遍历所有UObject对象
b.判断和统计UObject对象类型
c.生成包文件

3.疑问

一圈学习下来,居然没有发现GWorld的用处,不过根据原理来看,GUObjectArray是包含了GWorld,下一步实战的时候,可以将GWorld填错试试看。

4.结尾

这次学习只能说大概了解了UEDumper的工作原理,其中很多算法细节,类型结构等都还没有弄清楚,大部分还是与UE源码相关,后面将继续学习。

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

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

相关文章

k8s dashboard token 生成/获取

创建示例用户在本指南中,我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount,ClusterRoleBinding您都应该将它们复制到新的清单文件(如)中,dashboard-admin…

个人项目

这个作业属于哪个课程 计科22级12班这个作业要求在哪里 作业要求 这个作业的目标 完成个人项目,实现论文查重的功能,了解软件开发流程Github链接 一.PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 15 20Estimate 估计这个任务…

互联网医疗|基于音视频SDK和即时通讯IM技术实现线上问诊功能

不论是科普医学知识,还是医疗行业者的专业培训、手术示教,采用远程直播培训的方式能够打破空间限制,同时也保留了课堂的互动性,大大节省了讲师和学员的成本。帮助开发者全面监测音视频服务,包括问题定位诊断、洞察质量与体验、业务经营分析、实时监控告警等,低门槛、高效…

Spring boot 2.x validator

1、使用方式 2、常用注解

DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed

前言 DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed 遇到 "Public Key Retrieval is not allowed" 错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。 解决 第一种 可以在连接字符串中添…

Rest-assured框架详解

Rest-assured框架官网 官网url: https://rest-assured.io/ 一、接口测试介绍 - 什么是接口测试 本质上基于某种协议,发送请求给服务器,服务器返回响应数据,对响应数据进行分析,判断和我们的预期是否一致,从而验证功能是否正确。 - 为什么做接口测试 更早发现问题,降低研…

Google Play中无法更新Chrome和Android System Webiew的解决办法

【1】去https://apkpure.com/下载安装最新的Apkpure;【2】打开Apkpure,搜索Google Play,然后更新到最新版本;【3】重新打开Google Play,点自己头像,打开管理应用和设备,你会发现已经不需要更新Android System Webiew了,并且此时可以搜索任何APP进行安装,包括之前极难更…

Consul Windows部署

一、Consul下载 下载地址:Install | Consul | HashiCorp Developer 本次使用Windows版本下载解压后,可看到consul.exe文件二、Consul Server配置 为了方便使用增加server-config.hcl和server-start.bat文件(一) server-config.hcl配置文件 # 节点名称 node_name = "my-c…

国产化:部署单机THS(东方通TongHttpServer替代Nginx)

背景 国产化要求,使用东方通 TongHttpServer 替代 Nginx 。1 安装THS 解压之后把授权文件 license.dat 放到主目录下即可。 tar zxvf TongHttpServer_6.0.0.2_x86_64.tar.gz2 启动主程序 如果以 root 用户启动 THS 时,worker 进程会切换到 nobody 用户 nobody 组运行。所以确…

magma软件许可优化解决方案

Magma软件介绍 MAGMA在90年代初通过代理进入中国市场。为了更好快速的服务中国的客户、带来更便捷的、中文语言的技术支持和培训,2009年,MAGMA德国在中国正式设立分公司,即迈格码(苏州)软件科技有限公司(以下简称为MAGMA中国),从事MAGMA的销售和售后活动,服务中国大陆…

又发现2个bug

bug1 设置缓存过期未注意单位,导致一下失效了bug2 由于bug1 缓存失效导致 bug2 gorm,结构体里面有重复的字段,查询未报错,直接赋值成为了默认值 导致了程序异常 顺便编写了一个脚本,擦了一下屁股,之前的bug 修复了,数据未完全处理,导致偶尔有人反馈异常