-3

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

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

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

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

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

4

2 回答 2

0

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

您要查找的内容称为Hooking,在 C# 本身中并不容易做到,实际上您需要使用一些非托管库来做到这一点。然而,对你来说幸运的是,有人已经为你编写了一个名为EasyHook的库中的所有困难的东西。

它不像您在上面发布的代码那么简单(但我怀疑您在上面发布的代码也可以“正常工作”),他们在下载部分有一个教程,我建议您通读以了解如何做到这一点。


尽管如此,我强烈推荐评论中的建议

如果您有可用的 c++ 代码,请在 C++/CLI 中执行并将其包装在托管类中。

采用这种方法比尝试从头开始学习如何使用 EasyHook 之类的东西要容易得多(如果它甚至可以完全按照您的意愿做的话)。

于 2013-09-08T16:17:59.717 回答
0

Scott 的回答绝对是更简单、更干净的解决方案,但值得注意的是,您可以使用calli指令在 CIL 中将任何指针调用为函数指针。它不如委托安全,而且 C# 除了通过反射发出指令外,没有任何内置方式来使用指令,但好处是它比委托快得多。

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

  1. 您的代码是时间敏感的
  2. 编译时不知道函数的位置(不能使用 P/Invoke,这样更快)

一个完美的用例是加载 OpenGL 扩展,其中函数声明是已知的,但位置是特定于实现的,并且在运行时被查询。

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

于 2013-09-08T20:20:13.617 回答