本次示范游戏为BattleRoyaleTrainer这个单机游戏
1.GetName函数引擎源码详细分析
直接搜找到引擎源码中的GetName()
在Engine\Source\Runtime\CoreUObject\Public\UObject\UObjectBaseUtility.h里
进入GetFName()看一看,发现它返回了个NamePrivate,NamePrivate为FName类型
再进入ToString(),调用了GetDisplayNameEntry()下的GetPlainNameString(),
进入GetPlainNameString(),发现它只是对字符串的一些处理,说明GetDisplayNameEntry()就已经返回字符串了,GetPlainNameString()不用管
进入GetDisplayNameEntry() ,这里Names也就是GName,Index为名字索引(FName中的成员), 箭头所指地方为关键地方(后面会说),
这边再去TNameEntryArray看看,发现是个类模板的声明定义
再进入TStaticIndirectArrayThreadSafeRead,结合上边返回的Names[Index],这里肯定是重载了操作符[ ],
在该类中找到重载操作符[ ]的函数,发现里面调用了GetItemPtr(index)
再进入GetItemPtr(), 这里就是最里层,最关键的GetName算法部分了
2.内部DumpName
直接照源码里要用的结构抄一下再改一点就可以了
这里先打印20个看看,要dump所有的话,改20为Names->NumElements即可,注入dll后效果如图
3.外部DumpName
外部dump的话就不能用指针方式了,只能一层一层读,也很简单
这里ReadMemory是我自己为方便 封装的一个连续读取的函数
运行效果如图: