type
Post
status
Published
date
Jun 5, 2025
slug
summary
tags
Unreal
作弊
category
技术分享
icon
password
定位GameInstance(纯ida)
理论上来说你应该使用sdk去定位的,因为游戏99%会去除UE引擎的调试字符串,导致你毛也看不见!
他在UWorld类里面定义如上代码,但是我们要怎么找到他的偏移,神经病一样自问自答...
虚幻引擎内这个OwningGameInstance是私有的外部不能直接获取,是通过一个方法获取的,虽然编译后和直接获取没什么区别(
你看,这里有调用获取的方法,还带上了我们最喜欢的日志!虚幻引擎真的是太好玩了!

ULevel的定位
这里这个定位,我会介绍两种方法,一种是市面上比较泛滥的,一种是对照源码比较直观的!
第一种
这种方法比较不明所以,是我从网上学来的,虽然我不知道对应的源代码在什么地方,但是这个定位方法好像是依赖一块打印输出当初帧率CPU占用的代码的,
对GWorld进行xrefs,然后找下面有相同的两次CALL(arm64是BL)的汇编

然后我们IDA跳过去,兜兜转转又回到了这里,

第二种
我们看看下面的一个代码,这个是完整的代码,没有任何阉割!
我们发现
GWorld = NewWorld;是一处赋值语句,我们定位出GWorld之后可以全局(就是去xrefs)去找这种赋值的操作,缩小一下查找范围,接下来我们找if (WorldContext.WorldType == EWorldType::PIE)其实这在ida里面对应的就是
这在
GWorld = NewWorld之后必然有一个xxx == 3的操作,我们的目的是要找一下GetWorldSettings的方法,下面是UWorld::GetWorldSettings的源代码,我们发现里面对PersistentLevel进行了调用。回到ida,对应的第一个
Level::GetWorldSettings的入参就是ULevel啦!
Actor的定位
这个的定位其实最好是通过伟大的内存搜索器,比如CE、GG修改器什么的去做,因为在ULevel里面保存Actors的是一个TArray一个模板类,
我们定位到ULevel之后,可以去翻内存,找一个指针,并且下面偏移8字节有一个数组大小的东西,那个大概率是
Actors(也可能是ActorsForGC)... 回到正题!先贴一段源代码,我们搜索字符串
UWorld::DestroyActor: World has no context! 。搜索这个干什么呢?为了找RemoveActor !这对我们的大聪明来说轻而易举好吧,
这里贴一下
UWorld::RemoveActor源代码
