UE游戏引擎源码是开源的,所以咱们可以在UE5源码里面翻一番相关游戏世界物理引擎相关的类,找一找和物理重力相关的变量 修改世界全局重力从而实现飞天
在Unreal Engine 5(UE5)中,PhysicsSettings是项目设置中的一个重要部分,它允许开发者对游戏中的物理模拟进行各种配置和优化。通过调整这些设置,开发者可以根据游戏的需求优化物理模拟的性能和行为。
PhysicsSettings在UE5中是控制和优化物理模拟的关键工具。通过合理调整这些设置,开发者不仅能够实现预期的物理效果,还能在性能和效果之间找到平衡,提升游戏的整体质量和运行效率。
所以我们去源码里看看PhysicsSettings这个类,分析下他的继承关系,把整个父子类的所有成员变量罗列出来
class COREUOBJECT_API UObjectBase
{
EObjectFlags ObjectFlags;
/** Index into GObjectArray...very private. */
int32 InternalIndex;
/** Class the object belongs to. */
UClass* ClassPrivate;
/** Name of this object */
FName NamePrivate;
/** Object this object resides in. */
UObject* OuterPrivate;
}
class COREUOBJECT_API UObjectBaseUtility : public UObjectBase
{
}
class COREUOBJECT_API UObject : public UObjectBaseUtility
{
}
class DEVELOPERSETTINGS_API UDeveloperSettings : public UObject
{
FName CategoryName;
/** The Section name, is the short name for the settings. If not filled in, will be the FName of the class. */
FName SectionName;
}
class PHYSICSCORE_API UPhysicsSettingsCore: public UDeveloperSettings
{
float DefaultGravityZ;
}
class ENGINE_API UPhysicsSettings : public UPhysicsSettingsCore
{
}
大家可以自己去翻一番源码,就知道 在UPhysicsSettingsCore 类里面 第一个成员 就是float DefaultGravityZ; 通过英文含义就知道 这个是Z轴重力,也就是我们说的 全局重力,修改他就可以实现无重力 就可以飞起来
那么 现在就解决2个问题就可以实现飞天了
1 找到全局的 UPhysicsSettings 对象
2 找到DefaultGravityZ 的偏移
然后往UPhysicsSettings +DefaultGravityZ 的偏移的地址里面写值 改变重力就可以了
遍历TUObjectArray 就可以找到 className为PhysicsSettings的叫做Default__PhysicsSettings的对象
至于DefaultGravityZ 偏移,我们可以分析父子类的宽度,
从UObjectBase 开始 ,首先 他有虚函数 肯定有个8字节的虚表
EObjectFlags 是个enum 占4字节
InternalIndex int32 4字节
ClassPrivate 是个地址 8字节
NamePrivate 是个FName ,FName多大呢 ?进去看看
class CORE_API FName
{
FNameEntryId ComparisonIndex;
/** Number portion of the string/number pair (stored internally as 1 more than actual, so zero'd memory will be the default, no-instance case) */
uint32 Number;
/** Index into the Names array (used to find String portion of the string/number pair used for display) */
FNameEntryId DisplayIndex;
}
FNameEntryId 进去看就知道 4字节
uint32 Number; 也是4字节,是否使用取决于开发者设置
FNameEntryId DisplayIndex; 由于WITH_CASE_PRESERVING_NAME这个宏是在运行时不参与编译的
所以FName 也是8字节
继续
UObject* OuterPrivate; 是个地址 8字节
所以 UObjectBase 这个类的宽度是
8+4+4+8+8+8 +8 +8=0x28 个字节
UDeveloperSettings 这个类里面 2个FName 所以是8+8 =0x10个字节
所以最后到DefaultGravityZ 的偏移是0x38
最终实现飞天的代码就简单了
auto obj = SDK::UObject::FindObject("PhysicsSettings Engine.Default__PhysicsSettings");
float Gravity = N_Read<float>({(UINT64)obj + 0x38});
N_Write<float>({ (UINT64)obj + 0x38 }, 0.0f);
方法思路适用于所有的UE引擎,不同游戏可能会有偏移打乱和加密的情况,需要具体调试和dump分析
原文始发于微信公众号(微尘网络安全):ZXSJ游戏逆向UE5飞天功能如何实现的
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论