首页
社区
课程
招聘
[原创]unreal engine逆向学习之FName(二)
发表于: 2025-8-3 16:25 5882

[原创]unreal engine逆向学习之FName(二)

2025-8-3 16:25
5882

虚幻引擎:528K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2#2L8Y4u0W2j5h3I4W2L8X3N6A6L8X3g2Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5k6p5y4z5

虚幻引擎源码:a36K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6q4M7r3W2U0c8$3q4E0k6i4x3`.   在epic中关联github,并打开网址加入EpicGames

实例游戏:SCUM.exe(也可自己编译模板工程)

(因不同版本GetName算法存在细微差异,演示版本为4.23)



FName 是UE4提供个一种轻型系统使用字符串。其内部并不直接存储字符串,而是将字符串通过CityHash解算后存储在一个全局的NamePool之中。相同字符串的FName在NamePool数据表中也只存储一次。打包后FName 不区分大小写,它们为不可变,无法被操作。

FNames 的存储系统和静态特性决定了通过键进行 FNames 的查找和访问速度较快。其内部存储着字符串在NamePool中的索引值,他的容量非常小,当游戏逻辑在用来传递参数,比较等操作时,只传递或比较索引,而不需要对字符串本身的内容做操作,就可以显著的提升游戏性能。

在源码NameTypes.h文件中可以看到FName类

UnrealNames.cpp

static bool bNamePoolInitialized; 标志位表示FNamePool是否初始化,如果没有初始化则new一个对象,并把bNamePoolInitialized赋值为true,否则直接返回NamePoolData

UnrealNames.cpp 中包含了#include "UObject/UnrealNames.h"

引擎会在初始化的时候注册一些字符串,我们选择“FloatProperty”作为特征去ida中定位


一个正常的UE工程,分为Engine文件和自己的文件,Engine存储的是引擎源码,在自己文件中寻址到本体exe并拖入IDA中

“FloatProperty”附近也存在其他初始化用到的字符串


找到该函数的引用,发现初始化流程与源码一致,成功定位到NamePoolData



NamePoolData+0x10的地方验证一下

FameEntryId:内部只有一个uint32变量占4个字节,让FName变的更轻量。该变量就是存储字符串在NamePool中的Block的下标和地址Offset偏移量。(可以理解为寻找字符串位置的钥匙,哈希的key)

WITH_CASE_PRESERVING_NAME:在下面代码讲解的部分时,会以[编辑器]or[打包后]两种状态讲解,UE提供了WITH_CASE_PRESERVING_NAME宏可对编辑器UHT开启FName大小支持,编辑器默认状态下是已开启,发布版关闭。


这也是前面验证时为何要+0x10的原因


NameEntry是真正存储字符串的结构体,内部包含了字符串的数组,字符串的长度,是否是宽字节。后续会被New出内存分配该Entry。


unreal Engine的三种字符串类:

FString

类似于STL中的String

FText

FString多了语言本地化功能

FName

哈希索引可与FString,FText相互转换


UnrealNames.cpp中的实现方法FName转FString  FString FName::ToString() const


GetPlainNameString FName 类中用于处理名称字符串的函数,主要作用是将内部存储的名称转换为不带路径的纯字符串。

和主线无关,所以重心放到GetDisplayNameEntry,其GetDisplayIndex是获取存储名称在内部哈希表中的索引




Resolve函数


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 67
支持
分享
最新回复 (49)
雪    币: 0
活跃值: (271)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666666666
2025-8-3 19:18
0
雪    币: 961
活跃值: (1851)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
不打游戏在这卷
2025-8-4 02:38
0
雪    币: 88
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
这个讨论对我很有帮助,谢谢!
2025-8-4 09:01
0
雪    币: 104
活跃值: (7189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
666
2025-8-4 09:02
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
支持!
2025-8-4 20:17
0
雪    币: 717
活跃值: (1145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
66666666
2025-8-4 22:31
0
雪    币: 9795
活跃值: (5511)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
6666666666
2025-8-5 18:19
0
雪    币: 740
活跃值: (2552)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
6666666666
2025-8-6 00:32
0
雪    币: 80
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
GetDisplayNameEntry
2025-8-6 11:48
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
rtyugferghu
2025-8-6 14:17
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
6666666666666666
2025-8-8 18:52
0
雪    币: 201
活跃值: (266)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
6666666666666666
2025-8-11 12:05
0
雪    币: 78
活跃值: (1484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习学习
2025-8-12 03:21
0
雪    币: 78
活跃值: (1484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
一看就是某州的解密
2025-8-12 03:51
0
雪    币: 2660
活跃值: (7274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
收藏学习
2025-8-14 08:27
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
收藏学习
2025-8-16 16:08
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
66666666666666666
2025-8-18 11:19
0
雪    币: 21
活跃值: (265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
66666
2025-8-19 05:31
0
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
666
2025-8-22 10:14
0
雪    币: 292
活跃值: (1362)
能力值: ( LV3,RANK:29 )
在线值:
发帖
回帖
粉丝
21
1
2025-8-24 16:07
0
雪    币: 603
活跃值: (1644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
123
2025-8-26 11:55
0
雪    币: 615
活跃值: (1005)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
厉害,学习一下
2025-9-4 19:23
0
雪    币: 477
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
感谢你的贡献,论坛因你而更加精彩!
2025-9-4 19:32
0
雪    币: 281
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习
2025-9-7 06:01
0
游客
登录 | 注册 方可回帖
返回