ue5游戏逆向之寻找GWorld,GName和GUObjectArray
对于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
字符串引用处,即可确定GUObjectArray
是0x730B3F0
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