ZXSJ游戏逆向UE5飞天功能如何实现的

admin 2025年3月24日16:40:58评论9 views字数 2474阅读8分14秒阅读模式

  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;#if !UE_FNAME_OUTLINE_NUMBER  /** 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;#endif// ! //UE_FNAME_OUTLINE_NUMBER#if WITH_CASE_PRESERVING_NAME  /** Index into the Names array (used to find String portion of the string/number pair used for display) */  FNameEntryId  DisplayIndex;#endif // WITH_CASE_PRESERVING_NAME

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飞天功能如何实现的

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月24日16:40:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ZXSJ游戏逆向UE5飞天功能如何实现的https://cn-sec.com/archives/3878737.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息