【发布时间】:2021-02-18 12:46:16
【问题描述】:
我想获取方法地址,以便稍后在我的自定义作弊保护中使用它(我想检查方法是否被钩住)。我目前正在尝试通过使用来获取指针
typeof(MyClass).GetMethod("MyMethod").MethodHandle.GetFunctionPointer();
但这并没有给我正确的偏移量。对不起,如果我的问题看起来很愚蠢,但我认为这是做我需要的唯一方法。谢谢。
UPD:我将我的偏移量与 Cheat Engine 的偏移量进行比较。我知道地址总是不同的
UPD 2:我想读取我自己的应用程序的内存,所以我可以检查它是否被更改(我只对非常重要的方法这样做)
【问题讨论】:
-
简而言之,你不能因为 C# 方法没有单个内存地址(因为方法可以在解释模式下运行由 CLR 提供,它们可以在内存中有多个 JIT 表示,并且每个不同的泛型参数集都将存在泛型方法(和泛型类型的非泛型方法),依此类推。
-
“但这并没有给我正确的偏移量” - 相对于什么的偏移量?您如何确定地址是否“正确”?
-
帮助页面上的备注说:
The returned IntPtr is meant for internal runtime usage and should not be used to call the function from native code. Use Marshal.GetFunctionPointerForDelegate in order to get a function pointer that can be passed to native code.。因此,请尝试使用Marshal.GetFunctionPointerForDelegate。 -
之后你想用那个“指针”做什么?我怀疑您是否真的需要方法的内存地址,而只是对它的 reference 以便稍后调用它。
-
“我想检查方法是否被钩住” - 我想你误解了钩子的工作原理。 “挂钩”是 Win32 特有的(例如,它是 Win32 的设计特性),但您不能在软件中“挂钩”任意方法/函数。
标签: c# function-pointers memory-address