UE4逆向篇-1_FNamePool

这篇具有很好参考价值的文章主要介绍了UE4逆向篇-1_FNamePool。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

1.UE4.23以下与4.23以上版本是有所区别的,笔者所使用的UE源码为4.27。

2.UE4为开源的GitHub项目,但你想下载其源码需要将epic账号与GitHub账号绑定,其次会收到一封邮件以加入GitHub组织。

https://github.com/EpicGames

一、开始之前

1.由于C++没有反射,而UE自行实现的反射导致其暴露出了非常多的接口,所以我们可以利用这些暴露出来的接口。

2.GNames是Unicode字符串的数组。

3.GObject是类指针的数组。

拥有GObjects以后,可以访问游戏中大部分对象,而GName则对应其对象的名称?

拥有这些信息以后,可以生成出一个SDK来修改游戏。

二、GNames

a.什么是Gnames

1.GNames 指的是 alignas(FNamePool) static uint8 NamePoolData[sizeof(FNamePool)];

2.也就是NamePoolData

3.它是一个数组结构。

b.NamePoolData/FNamePool

以下是该结构体原型:


class FNamePool
{
public:
	FNamePool();
	
	void			Reserve(uint32 NumBlocks, uint32 NumEntries);
	FNameEntryId	Store(FNameStringView View);
	FNameEntryId	Find(FNameStringView View) const;
	FNameEntryId	Find(EName Ename) const;
	const EName*	FindEName(FNameEntryId Id) const;

	/** @pre !!Handle */
	FNameEntry&		Resolve(FNameEntryHandle Handle) const { return Entries.Resolve(Handle); }

	bool			IsValid(FNameEntryHandle Handle) const;

	FNameEntryId	StoreValue(const FNameComparisonValue& Value);
	void			StoreBatch(uint32 ShardIdx, TArrayView<FNameComparisonLoad> Batch)	{ ComparisonShards[ShardIdx].InsertBatch(Batch); }
#if WITH_CASE_PRESERVING_NAME
	FNameEntryId	StoreValue(const FNameDisplayValue& Value, bool bReuseComparisonId);
	void			StoreBatch(uint32 ShardIdx, TArrayView<FNameDisplayLoad> Batch)		{ DisplayShards[ShardIdx].InsertBatch(Batch); }
	bool			ReuseComparisonEntry(bool bAddedComparisonEntry, const FNameDisplayValue& DisplayValue);
#endif
	/// Stats and debug related functions ///

	uint32			NumEntries() const;
	uint32			NumAnsiEntries() const;
	uint32			NumWideEntries() const;
	uint32			NumBlocks() const { return Entries.NumBlocks(); }
	uint32			NumSlots() const;
	void			LogStats(FOutputDevice& Ar) const;
	uint8**			GetBlocksForDebugVisualizer() { return Entries.GetBlocksForDebugVisualizer(); }
	TArray<const FNameEntry*> DebugDump() const;

private:
	enum { MaxENames = 512 };

	FNameEntryAllocator Entries;

#if WITH_CASE_PRESERVING_NAME
	FNamePoolShard<ENameCase::CaseSensitive> DisplayShards[FNamePoolShards];
#endif
	FNamePoolShard<ENameCase::IgnoreCase> ComparisonShards[FNamePoolShards];

	// Put constant lookup on separate cache line to avoid it being constantly invalidated by insertion
	alignas(PLATFORM_CACHE_LINE_SIZE) FNameEntryId ENameToEntry[NAME_MaxHardcodedNameIndex] = {};
	uint32 LargestEnameUnstableId;
	TMap<FNameEntryId, EName, TInlineSetAllocator<MaxENames>> EntryToEName;
};

c.FNameEntryAllocator

1.FNamePool结构体之中的大部分我们都可以忽略。

2.更需要重点关注其中的:FNameEntryAllocator Entries;


class FNamePool
{
private:
	FNameEntryAllocator Entries;
};

需要注意 FNameEntryAllocator 并不是一个指针,而是完整的结构体。

可以将其视作为FNamePool。

FNamePool = FNameEntryAllocator。

同样的,该结构体中的大部分都可以忽略,重点关注以下内容:

static constexpr uint32 FNameMaxBlocks = 1 << FNameMaxBlockBits;
class FNameEntryAllocator
{
	mutable FRWLock Lock;                    //0x0000
	uint32 CurrentBlock = 0;                 //0x0008
	uint32 CurrentByteCursor = 0;            //0x000C
	uint8* Blocks[FNameMaxBlocks] = {};      //0x0010
};

FName中存储的其实就是一堆字符串,而字符串中的内容是什么样的呢?

接下来我们开始查找它。

三、查找NamePoolData

1.想要查找NamePoolData其实非常简单,只需要打开游戏并使用CE附加游戏。

2.搜索字符串:MulticastDelegateProperty,注意不要勾选UTF-16(宽字符)。

ue4逆向工具,UnrealEngine,ue4

3.搜索字符串后浏览内存相关区域,快捷键Ctrl+B,并向上翻:

ue4逆向工具,UnrealEngine,ue4

看到内存区域类似.None.....ByteProperty.....IntProperty即可。

4.此时从None往前推6个字节,即:......None,并将该地址记录下来:

ue4逆向工具,UnrealEngine,ue4

ue4逆向工具,UnrealEngine,ue4

ue4逆向工具,UnrealEngine,ue4

记录下该地址,回到CE中进行新的扫描,勾选HEX扫描8字节:

ue4逆向工具,UnrealEngine,ue4

如果扫描不到可以尝试调整CE的可写选项

注意:

可尝试先前推2个字节拿到地址进行搜索,如果搜索不到再向前推更多字节。

如该游戏前推2个字节搜索不到结果,笔者这里直接将地址的最后一位用0替换(也就是前推6个字节),即可搜索到了。

不同的游戏可能不一样。

扫描出的地址:"DeadByDaylight-Win64-Shipping.exe"+D20C610

其指向的就是 FNameEntryAllocator 中的 uint8* Blocks[FNameMaxBlocks] = {};

static constexpr uint32 FNameMaxBlocks = 1 << FNameMaxBlockBits;
class FNameEntryAllocator
{
	mutable FRWLock Lock;                    //0x0000
	uint32 CurrentBlock = 0;                 //0x0008
	uint32 CurrentByteCursor = 0;            //0x000C
	uint8* Blocks[FNameMaxBlocks] = {};      //0x0010
};

ue4逆向工具,UnrealEngine,ue4

5.现在,只需要使用扫描出的地址减去 Blocks(uint8* Blocks[FNameMaxBlocks] = {};) 的偏移0x10,即可得出FNamePool,使用ReClass验证一下:

1.打开ReClass并打开文件选择附件里的FNamePool.reclass。

2.点击Select按钮选择游戏进程。

3.点击Edit按钮,选择FNamePool,并将地址填入进行验证。

ue4逆向工具,UnrealEngine,ue4

至此,查找NamePoolData的工作就完成了,通过修改UnrealDumper 的源码即可导出Names:

ue4逆向工具,UnrealEngine,ue4文章来源地址https://www.toymoban.com/news/detail-762484.html

到了这里,关于UE4逆向篇-1_FNamePool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4/5:通过Blender制作BlendShape导入【UE4/5曲线、变形目标,blender形态键】

    UE4/5里面,我们经常可以在一些骨骼模型上面看到相关的曲线,如Metahuman里面就是通过这个曲线来改变人物的脸部表情。 而这里笔者将教导如何去制作这种曲线。 这种曲线都是存在于骨骼模型上的,所以我们要么直接制作骨骼模型导入ue,要么做一个普通的模型,然后导入

    2024年02月03日
    浏览(63)
  • 幽灵行者ue4崩溃怎么解决?幽灵行者ue4崩溃原因深度解读及全套解决方案

    UE4崩溃通常是由于多种原因引起的,如虚幻引擎版本过旧、GPU驱动程序过时或损坏、注册表设置错误等。那么幽灵行者ue4崩溃怎么解决呢?下面一起来看看吧! 一、原因 1. 硬件兼容性问题 •显卡驱动不兼容:过时或错误的显卡驱动可能导致与UE4引擎的交互出现问题,引发崩

    2024年04月26日
    浏览(65)
  • UE4/UE5 动画控制

    工程下载 ​ ​​​​​​​​​​​​​https://mbd.pub/o/bread/ZJ2cm5pu   蓝图控制sequence播放/倒播动画: 设置开启鼠标指针,开启鼠标事件 在场景中进行过场动画制作 设置控制事件

    2024年02月09日
    浏览(55)
  • UE4 框架介绍

            我们知道每一个大型的游戏引擎,都有一个属于他们自己的架构,虚幻引擎也不例外。游戏由 GameMode 和 GameState 组成。加入游戏的人类玩家与 PlayerControllers 相关联。这些 PlayerController 允许玩家在游戏中拥有棋子,以便他们可以在关卡中拥有物理表示。PlayerControllers

    2023年04月16日
    浏览(44)
  • UE4网络同步

    Actor是UE网络同步核心。所有的数据同步都是围绕Actor展开的。服务器将保留一份Actor列表并定期更新客户端,以便客户端保留每个Actor(那些需要被同步的Actor)的近似复本。(比如:玩家角色,武器等) Actor主要通过两种方式进行更新: 属性复制 和 RPC(远程过程调用) 如此

    2024年02月08日
    浏览(41)
  • ue4打包错误

    UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: begin: stack for UAT UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: === Critical error: === UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: Fatal error! UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: UA

    2024年02月03日
    浏览(44)
  • UE4游戏保存

    在游戏运行过程中由于某些事情需要暂停一下游戏,那就需要把游戏当前的进度保存起来,下次打开的时候还可以再次玩,我们这里主要保存的就是。所有需要有一个游戏保存的机制。UE4提供了这样的机制。 首先新建一个类继承在SaveGame,命名为FirstSaveGame 打开VS2019编辑代码

    2024年02月12日
    浏览(57)
  • UE4射线检测

    第一人称为例,首先要获得需要发出射线的位置和方向。 主要的蓝图   start需要连接射线开始的位置,end连接射线截止的位置。 根据射线得到的结果来连接之后的功能。        

    2024年02月16日
    浏览(38)
  • UE4 物体的旋转

    1.新建Actor,创建立方体cube,AddLocalRotation(添加本地旋转),创建自定义事件连接(自定义事件作用是为了可以一直旋转) 2.添加Branch控制流程(若是Flip Flop也可以不过只是A------B之间切换)创建自定义变量,获得自定义变量 3.第2步只是设置变量,还没有赋值,Add Custom Event并给

    2024年02月17日
    浏览(45)
  • UE4 资产的迁移

    如何把第一个UE项目中的地图资产复制到另外第二个项目中使用。 在第一个项目中,点击鼠标右键弹出菜单选择【迁移】 弹出界面,默认全部勾选,点击【确定】 弹出需要复制的目标文件夹,一定是第二个项目的Content文件夹,点击【选择文件夹】,就可以了。 然后在第二个

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包