比如现在我有一个非托管内存中的地址Inptr ulongIntPtr;里面存储了一个ulong类型的数据,但是静态类Marshal中并未提供读取ulong的方法,(它有ReadInt32,ReadInt16...可偏偏没有无符号型的读取方法)那我该怎样将这个ulong提取出来呢?
试试这篇博文纯C#实现Hook功能中的方法:
最后就是这个原函数的调用过程了,因为是动态拼接的函数,所以想到的就是用Marshal.GetDelegateForFunctionPointer转成委托来执行,后来发现不对,因为我虽然拼接的是汇编,而这个汇编是C#方法jit后的汇编,这个并不是C方法编译后的汇编,通过把非托管指针转换为委托的方式运行函数是会添加很多不需要的操作的,例如托管类型与非托管类型的转换,但我拼接出的函数是不需要这些过程的,这个怎么办,看来只能用调用C#普通函数的方式调用,这个怎么实现呢,其实很好办,只需写一个空壳函数,然后修改这个函数的方法表中的原生指令指针即可,具体方法如下:
*((ulong*)((uint*)method.MethodHandle.Value.ToPointer() + 2)) = (ulong)ptr;