UE4 - IDA定位查找GWorld

源码及结构

在ue4的源代码中GWorld是一个全局指针

这个UWorldProxy类里面保存了一个UWrold的指针,

其中GWorld全局指针在World.cpp文件被赋值

定位思路

  1. 根据注释和代码可以发现GWorld在这里初始化,联系上下文,得到字符串“SeamlessTravel FlushLevelStreaming”,使用ida搜索这个字符串即可定位

字符串搜索法

以下内容转载自https://bbs.kanxue.com/thread-280042.htm

当然这个字符串不是唯一的,你可以根据你的搜索选择你认为更加合适定位的字符串。

原文的图片可能不太好理解,因为没有对应的源代码可以看,这里我贴上了对应的源代码

随便把一个UE4游戏拖进IDA中,用我们刚刚找到的字符串进行定位。源码和伪代码对比分析,我们可以得出结论

此处就是GWorld,只需减去ImageBase就能得到偏移。(ImageBase是什么都不知道,建议重学!)

GWorld是虚幻中一个非常重要的结构,加上SDK拿到的偏移,我们就能定位到其他结构。

ida搜不到字符串的原因

引用文章:https://bbs.kanxue.com/thread-281339-1.htm

在某些情况下,如果使用CE内存搜索或者hex编辑器去查看二进制文件发现存在这些字符串但是无法搜索出来,可能就是因为

  • 字符串在编译的时候被抹去了

  • ida无法识别这个字符串

第二个情况很少见,几乎没有吧,ue4引擎所使用的字符串编码是UTF-16,而这种编码格式ida string表是默认不搜索的,所以自然就搜不到了。

解决方法就是:只需在string表窗口右键点击设置,勾选上Unicode c-style(16 bits)这个选项即可。

非常规点位寻找GWorld

本次测试用例使用的是DF行动S3 UE版本为4.24.2

只提供学习与交流用途,禁止用于违法用途!

因为DF行动将几个常规点位进行了删除,并把常规点位变成了一个迷惑选项(可以搜索出来但是没什么鸟用)...

根据源代码,我们搜索该字符串可以得到,并做对照

这个v337疑似源代码里面的NewWrold,接下来他会被赋值给GWorld!这里贴一下EWorldType的源代码

namespace EWorldType
{
	enum Type
	{
		/** An untyped world, in most cases this will be the vestigial worlds of streamed in sub-levels */
		None,

		/** The game world */
		Game,

		/** A world being edited in the editor */
		Editor,

		/** A Play In Editor world */
		PIE,

		/** A preview world for an editor tool */
		EditorPreview,

		/** A preview world for a game */
		GamePreview,

		/** A minimal RPC world for a game */
		GameRPC,

		/** An editor world that was loaded but not currently being edited in the level editor */
		Inactive
	};

	UE_DEPRECATED(4.14, "EWorldType::Preview is deprecated. Please use either EWorldType::EditorPreview or EWorldType::GamePreview")
	const EWorldType::Type Preview = EWorldType::EditorPreview;
}

恰好与源代码里面的对应,这里就是EWorldType::Game (对应i32的值为1) 后面发现v339被赋值给了v162v162给了一个静态的东西,初步怀疑off_17CB3018是所谓的GWorld (v337就是v339,我重新反编译了一下,无伤大雅)

接下来我们进行验证众所周知GWorld在某处会被多次引用,这个就是一个校验点,

IDA找到有sub_13751468 / sub_13761140 / sub_137706B0研究一下sub_13751468看看,额,有点陌生,让我想想,(似曾相识???

没错,sub_13751468就是UWorld::FinishDestroy

sub_13761140 其实就是FSeamlessTravelHandler::Tick() 的东西。

哗哗,完结撒花!☆*: .。. o(≧▽≦)o .。.:*☆