有没有办法用 MethodImplOptions.InternalCall 属性找到方法的实现?

逆向工程 反编译 C# 游戏黑客
2021-06-13 01:42:01

背景:
Unity 引擎提供了许多PlayerPrefs.SetXxx可用于保存用户数据的功能。但是,它会自动在您保存的名称后附加一个哈希值。例如, 在 Windows 平台上调用 of
PlayerPrefs.SetString("justTesting", "TEST!");
将添加一个注册表值
justTesting_h3837386411

问题:
我知道它实际上是djb2-xor,但我仍然很好奇哈希函数是如何实现的。通过使用我发现的 dnSpy PlayerPrefs.SetString,它在 中实现UnityEngine.CoreModule.dll,最终调用了一个声明为的本机方法

[NativeMethod("SetString")]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool TrySetSetString(string key, string value);

而我被困在这里。有确实是一个字符串UnityEngine.PlayerPrefs::TrySetSetString.rdata的部分UnityPlayer.dll,但我不知道在哪里可以找到实际的代码吧。我接下来该怎么做?

1个回答

好吧,经过一些大胆的尝试,我终于发现它非常简单,至少在这个 Unity 版本上是这样。首先,找到方法名称字符串及其引用位置: 在此处输入图片说明

它被引用为 11376594。但是这个地址是什么?开始了: 在此处输入图片说明

这是一个字符串表。接下来要做的是找出表的起始地址,然后是什么引用了这个地址。这引导我到这里: 在此处输入图片说明 这里: 在此处输入图片说明 这是一个循环,它将每个函数名称绑定到另一个表中 11371C40 的项目。这个新表是一个函数表,所以我重命名了它: 在此处输入图片说明 现在有理由怀疑这个函数表包含每个本地方法的实现方式。通过将字符串偏移量添加到函数表地址,我得到了bool TrySetSetString(string key, string value)地址。深入研究,这里是哈希算法: 在此处输入图片说明