我正在尝试在C#中的指定内存地址处调用函数,这是我在C中的处理方式:
typedef void _do(int i);
auto doActor = (_do*)0xAAAABEEF;
doActor(1);
如果可能,如何在C#中复制此行为?对于C#来说是非常新的,感谢所有帮助。
更深入地说明我的情况:我正在尝试创建一个工具,该工具可以帮助我自动执行可执行文件中的某些进程。我反编译了主要API的程序集,并通过拦截网络数据包/欺骗自己的功能来添加了我的功能(大部分情况下)。我无法控制存储在无法反编译的混淆程序集中的客户端。我很少需要从这个混淆的程序集中调用一个或两个函数,并且我使用调试器找到了这些相关函数的内存地址,但是不知道在c#中从哪里可以找到。
答案 0 :(得分:0)
与C#中的C函数指针最接近的等效项是委托。代表是托管的,但您可以使用YYYY is the year
MM is the month
DD is the day
NNNNNNN is a sequence/random number
方法将它们相互转换:
Marshal.GetDelegateForFunctionPointer
但是,与此API有一些限制。我建议您看看at the documentation。
如果您使用的.NET版本早于4.5,那么您将不得不使用其他版本的public delegate void _do(int i); // the delegate type
var ptr = new IntPtr(0xAAAABEEF);
var doActor = Marshal.GetDelegateForFunctionPointer<_do>(ptr);
doActor(1);
:
GetDelegateForFunctionPointer