【问题标题】:Call function by pointer in C# [closed]在C#中通过指针调用函数[关闭]
【发布时间】:2013-09-08 16:02:04
【问题描述】:

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

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

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

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

有人可以帮我做一个 C# 版本吗?

【问题讨论】:

  • 您能否提供更多详细信息,您是在尝试调用非托管 dll (P/Invoke) 的函数,还是尝试对正在运行的进程执行 dll hooking,或者完全是其他什么?
  • Windows 为每个进程提供自己的地址空间。这不可能奏效。你想完成什么?
  • 你可以试试 Marshal.GetDelegateForFunctionPointer 从指针获取委托
  • 我想从正在运行的进程中调用一个方法。该方法总是具有相同的地址,并且我知道它的基地址,所以我只需要调用它,但我不知道如何在 C# 中执行它
  • 我现在要为您节省一些时间:如果您有可用的 c++ 代码,请在 C++/CLI 中执行并将其包装在托管类中。

标签: c# pointers


【解决方案1】:

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

你要找的东西叫Hooking,在C#本身就不容易做到,实际上需要使用一些非托管库才能做到。但是,幸运的是,有人为您编写了所有困难的东西,已经在一个名为 EasyHook 的库中。

它不仅仅是您在上面发布的代码那么简单(但我怀疑您在上面发布的代码也可以“正常工作”),他们在downloads section 中有一个教程我建议您通读以了解如何去做吧。


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

如果你有可以工作的 c++ 代码, 在 C++/CLI 中完成并将其包装在托管类中。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多