UE4(5)逆向学习笔记(二)——寻找GWorld,GName和GUObjectArray

news/2024/9/19 16:50:07/文章来源:https://www.cnblogs.com/MLKSJ/p/18407844

目录
  • 0.前言
  • 1.准备
    • 1.1 下载游戏《死寂(DeathlyStillness)》
    • 1.2 下载UE源码
  • 2.寻找GWorld
  • 3.寻找GName
  • 4.寻找GUObjectArray
  • 5.开始Dump
  • 5.结尾

0.前言

笔记(一)中我们了解了GWorld,GName和GUObjectArray是什么,也知道了想要使用UEDumper要获取到它们的偏移。
这次我们就以游戏《死寂(DeathlyStillness)》为例,利用源码中的特征字符串来寻找GWorld,GName和GUObjectArray,并使用UEDumper来Dump这个游戏的SDK。

1.准备

1.1 下载游戏《死寂(DeathlyStillness)》

从Steam下载完成后查看如下目录中的 xxx-Shipping.exe

右键属性查看UE版本为UE4.27

1.2 下载UE源码

下载UE源码需要先获取授权,具体流程可参考文章。
获取授权后就可以进入UE的代码仓库下载了。

原则上是应该下载对应版本的源码进行逆向,这里由于我没有找到4.27,所以我用最新版本5.4.4(4.23版本以上即可)分析,对于今天使用特征字符串的方法无影响。

2.寻找GWorld

GWorld定义在\UE_5.1\Engine\Source\Runtime\Engine\Private\World.cpp文件中。
我在UE源码工程中搜索"GWorld = nullptr",定位到函数FSeamlessTravelHandler::Tick中,查看如下位置代码:


其中字符串"SeamlessTravel FlushLevelStreaming"可作为特征
使用ida打开1.1中查看过的 xxx-Shipping.exe,搜索字符串"SeamlessTravel FlushLevelStreaming"

经过十几分钟的搜索,得到两个结果,直接查看上面这个代码里的。

F5查看伪代码,这里就是之前看过的UE源码

而GWorld是全局变量,源码中有两次源码赋值,使用这个特征在伪代码中可以找到:

那这个qword_144C1D800就是GWorld了,减去ida加载基址,偏移为0x144C1D800 - 0x140000000 = 0x4C1D800

3.寻找GName

GName也是用内存池保存,内存池FNamePool的构造函数会初始化一些Name,例如None,ByteProperty,IntProperty等,在内存中的结构是这样的:

同样的方法,在ida中搜索"ByteProperty",选择下面这个:

可以看到FNamePool的初始化代码:

再点击函数名称按X,跳转到此函数的任一引用处:

函数调用时传入的this指针就是GName了

GName偏移为0x144A99140 - 0x140000000 = 0x4A99140

4.寻找GUObjectArray

GUObjectArray在\UE_5.1\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectHash.cpp中定义。

同样找到GUObjectArray引用的地方,这里找的是int32 FEngineLoop::PreInitPostStartupScreen(const TCHAR* CmdLine)函数
特征字符串"CloseDisregardForGC"的下面就是GUObjectArray

在ida中搜索"CloseDisregardForGC",定位到源码相同代码处,this指针dword_144AD5480即为GUObjectArray

GUObjectArray偏移为0x144AD5480 - 0x140000000 = 0x4AD5480

5.开始Dump

打开UEDumper工程,在offsets.h中填入刚刚获取到的几个偏移。

再搜索UE_VERSION,转到定义,修改UE版本。

F5开始编译运行
填入项目名称,和xxx-Shipping.exe的PID。

依次点击Create,Find,Dump,dump成功后按需保存项目,不知道为何我这里只获取到了BasicType

然后在工程目录文件夹下可看到刚刚保存的内容。

5.结尾

今天通过最简单的方式去找了GWorld,GName和GUObjectArray,如果游戏隐藏了符号信息,那这个方法就不好使了。
dump虽然没有报错,但总感觉内容太少了,不知是哪里的问题,下次再换个游戏试试。

参考文章:https://www.cnblogs.com/revercc/p/17641855.html
https://blog.csdn.net/qq_43355637/article/details/127208395

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

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

相关文章

一个用于管理多个 Node.js 版本的安装和切换开源工具

大家好,今天给大家分享一个用于管理多个Node.js版本的工具 NVM(Node Version Manager),它允许开发者在同一台机器上安装和使用不同版本的Node.js,解决了版本兼容性问题,为开发者提供了极大的便利。在开发环境中,特别是在处理多个项目时,每个项目可能依赖于不同版本的 N…

2552.统计上升四元组

题目描述: 给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的: 0 <= i < j < k < l < n 且 nums[i] < nums[k] < nums[j] < num…

屏幕画笔、截图工具

水豚鼠标助手 用于做屏幕指导比较方便,鼠标换肤,屏幕画笔 https://shuitunapp.com/?from=txc //官网下载pixpin下载地址 这是一款好用的屏幕截图,贴图,gif制作 小工具 https://pixpinapp.com/

屏幕画笔和鼠标点击工具

https://shuitunapp.com/?from=txc //官网下载

disk-Linux磁盘IO性能测试方法-fio

disk-Linux磁盘IO性能测试方法-fio 测试随机写IOPS: fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=1000 -group_reporting -name=/path/testfile测试随机读IOPS: fio -direct=1 -iodepth=128 -rw=randread -ioengine=li…

单实例-oracle巡检模版 -20240912

单实例-oracle巡检模版 -20240912 —————————————————————————————————————————— ---- 2024年9月12日16:38:47 ---- bayaim ---- 以下内容纯属个人原创,纯属个人多年经验总结,非喜勿喷,Gun~ ——————————————————…

Yolo第Y2周:如何正确解读YOLO算法训练结果的各项指标

Yolo第Y2周:如何正确解读YOLO算法训练结果的各项指标🍨 本文为🔗IT男的一人企业中的学习记录博客 🍖 原作者:[IT男的一人企业]上一篇《详解YOLO检测算法的训练参数》讲了该如何设置参数训练。这一篇说说模型训练完,怎么看它训练的好不好。这就像开车跑长途,5个小时跑完…

微服务引擎 MSE 及云原生 API 网关 2024 年 8 月产品动态

微服务引擎 MSE 及云原生 API 网关 2024 年 8 月产品动态

MAT(Memory Analyzer Tool)下载和安装

一、下载 官网地址:https://www.eclipse.org/mat/点击download 由于要在本地电脑中运行,故选择window64位点击,进入如下页面点击DownLoad可能由于网速的原因,下载失败,故用以前的安装波,如下:解压:二、安装 点击MemoryAnalyzer.exe,就可以启动MAT工具。启动后界面如下…

pbootcms一个网站如何绑定两个域名

在PbootCMS中,一个网站绑定两个域名的方法主要涉及到在PbootCMS官网进行域名授权,并将获取的授权码填写到网站后台的相应位置。以下是详细的步骤说明: 1. 域名授权 首先,您需要登录到PbootCMS的官方网站,对需要绑定的两个域名进行授权。授权的具体流程可能因PbootCMS的版本…

PBOOTCMS网站程序提示“执行SQL发生错误!错误:DISK I/O ERROR”

当 PBOOTCMS 网站程序提示“执行SQL发生错误!错误:DISK I/O ERROR”时,这通常意味着磁盘输入输出(I/O)出现了问题,可能是由于磁盘空间不足、文件系统损坏或是磁盘硬件故障等原因导致的。以下是一些可能的解决方案: 解决方案检查磁盘空间 清理缓存文件 修复文件系统 检查…

PbootCMS附件上传报错UNKNOW: Code: 8192; Desc: stripos()

当 PbootCMS 在上传附件时出现错误提示 UNKNOW: Code: 8192; Desc: stripos(),这通常是因为 PHP 中的某些函数被禁用或配置不当导致的。具体来说,stripos() 函数可能被禁用了。 解决方案检查 PHP 配置 启用 stripos() 函数 检查服务器环境 检查 PbootCMS 代码扫码添加技术【解…