ue5游戏逆向之寻找GWorld,GName和GUObjectArray

发布时间 2023-08-18 23:49:45作者: 怎么可以吃突突

对于ue4而言,符号如果暴露出来的可以直接通过导出表寻找GWorld,GUObjectArray。ue4.23版本以前的通过GNames函数,ue4.23版本及其以后的通过FNamePool::FNamePool构造函数寻找GName。对于未暴露符号的寻找方法和ue5未暴露符号的三件套找法一样。

寻找GWorld

查看UE5.1源码,GWorld定义在\UE_5.1\Engine\Source\Runtime\Engine\Private\World.cpp文件中。

寻找哪里引用的GWorld,随便找一个函数UWorld* FSeamlessTravelHandler::Tick(),可以看到在字符串SeamlessTravel FlushLevelStreaming的上面GWorld会被赋值

继续往上看,GWorld在被赋值之前会先被初始化为NULL

ida中在搜索字符串SeamlessTravel FlushLevelStreaming,然后跳转到交叉引用处往上找即可看到GWorld

继续往上找可以看到GWorld被初始化为NULL,因此GWOrld就是0x7488768

寻找GName

ue5的GName也是用内存池保存,内存池FNamePool的构造函数会初始化一些Name,例如None,ByteProperty,IntProperty

ida中搜索字符串ByteProperty,转到交叉引用处就是FNamePool构造函数。

跳转到FNamePool的引用处,传入的参数(this指针)就是GName

寻找GUObjectArray

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

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

ida找到CloseDisregardForGC字符串引用处,即可确定GUObjectArray0x730B3F0

DUMP SDK

对github上的ue4dump进行修改,兼容ue4.25版本以及ue5版本。项目地址 https://github.com/revercc/UE4Dumper.git
运行./ue4dumper64 --newue+ --strings --gname 0x72C9F40 --package 包名 --output /sdcard/Download dump Strings

运行./ue4dumper64 --newue+ --sdkw --gworld 0x7488768 --gname 0x72C9F40 --package 包名 --output /sdcard/Download dump SDK