C#如何通过内存地址调用方法

3

我想在C#中调用指定内存地址的函数,以下是在C语言中如何实现:

typedef void _do(int i);
auto doActor = (_do*)0xAAAABEEF;
doActor(1);

如果有可能,我该如何在C#中复制这种行为?我对C#非常陌生,需要您的帮助。
更详细地解释一下我的情况:我正在尝试创建一个工具,帮助我自动化可执行文件中的某些流程。我反编译了主API的程序集,并通过拦截网络数据包/欺骗自己的方式添加了我的功能(大部分)。我无法控制客户端事物,存储在我无法反编译的混淆程序集中。我很少需要调用其中的一两个函数,并使用调试器找到了那些相关函数的内存地址,但不知道如何在C#中继续操作。

1
由于C#自己管理内存,直接开始引用内存通常不是一个好主意。对于您的用例,您可以存储对函数的引用。例如,这个:var x =()=> {return 1; }使x指向返回1的函数。 - Carlo Bos
2
在C#中直接实现这个可能有些困难,但根据你想要实现的目标,可能会有替代方案。建议你提供一个明确的例子来说明你的问题。 - Etienne de Martel
3
请具体说明您希望解决的实际问题,而不仅仅是针对问题提出的解决方案。如果您试图模拟演员模型,请明确说明;在 C# 中有比您提出的更好的方法。C# 很好地支持一级函数,并且不需要操纵内存地址来支持它们。 - Robert Harvey
必读内容:托管与非托管。一旦你理解了这个,还要阅读:在托管内存中处理非托管内存指针 - John Wu
我很少需要从这个混淆的汇编中调用一个或两个函数。我有点困惑...你需要调用的函数是包含在.NET程序集、纯Win32 DLL还是.exe文件中? - John Wu
显示剩余2条评论
1个回答

3
在C#中,与C函数指针最相似的是委托(delegate)。委托是被管理的,但你可以使用 Marshal.GetDelegateForFunctionPointer 方法来将一个转换成另一个。
public delegate void _do(int i); // the delegate type

var ptr = new IntPtr(0xAAAABEEF);
var doActor = Marshal.GetDelegateForFunctionPointer<_do>(ptr);
doActor(1);

这个API有一些限制。我建议你看一下文档
如果你使用的.NET版本早于4.5,那么你需要使用不同版本的GetDelegateForFunctionPointer
var doActor = (_do)Marshal.GetDelegateForFunctionPointer(ptr, typeof(_do));

这个问题解决了,但我头疼了一会儿,因为我显然是针对 .Net 3.5 框架进行的。非常感谢! - HelplessAndConfused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接