C#中的指针调用函数

时间:2013-09-08 16:02:04

标签: c# pointers

我试图通过C#中的指针调用其他正在运行的进程的函数,但遗憾的是我找不到它的答案。 该函数的内存地址始终相同。

在C ++中,我可以这样做:

#define DefinedMemoryAddress 0x123456
struct someStruct
{
  int someInt;
  float someFloat;
}

int main()
{
  someStruct createdStruct = ...;
  ( (void (_stdcall*)(someStruct*)) DefinedMemoryAddress)( createdStruct );
}

有人可以用它的C#版本来帮助我吗?

2 个答案:

答案 0 :(得分:0)

  

我想从正在运行的进程中调用一个方法。方法总是有的   相同的地址,我知道它的基地址,所以我只需要   叫它,但我不知道如何在C#

中做到这一点

您正在寻找的是Hooking,在C#本身并不容易,事实上您需要使用一些非托管库来实现它。但是,幸运的是,有人写了一个已经存在于库中的所有硬件,称为EasyHook

这不仅仅是您在上面发布的代码那么简单(但我怀疑您上面发布的代码也“正常工作”),他们在downloads section中有一个教程我建议您通读以便学习怎么做。


然而,除此之外,我强烈推荐the suggestion in the comments

  

如果您的c ++代码有效,   在C ++ / CLI中完成并将其包装在托管类中。

采用这种方法比尝试从头开始使用EasyHook之类的东西要容易得多(如果它甚至可以完全按照你想做的那样)。

答案 1 :(得分:0)

Scott的回答肯定是更简单,更清晰的解决方案,但值得注意的是,您可以使用calli instruction将任何指针调用为CIL中的函数指针。它不如代表安全,并且C#没有任何内置的方法来通过反射发出它以外的指令,但好处是它明显快于委托。

您应该只在以下情况下使用它:

  1. 您的代码是时间敏感的
  2. 您在编译时不知道函数的位置(并且不能使用P / Invoke,这更快)
  3. 一个完美的用例是加载OpenGL扩展,其中函数声明是已知的,但该位置是特定于实现的并且在运行时被查询。

    这个问题应该特别使用挂钩库,但如果其他人根据标题找到了这个问题,这可能是他们正在寻找的答案。