我试图通过C#中的指针调用其他正在运行的进程的函数,但遗憾的是我找不到它的答案。 该函数的内存地址始终相同。
在C ++中,我可以这样做:
#define DefinedMemoryAddress 0x123456
struct someStruct
{
int someInt;
float someFloat;
}
int main()
{
someStruct createdStruct = ...;
( (void (_stdcall*)(someStruct*)) DefinedMemoryAddress)( createdStruct );
}
有人可以用它的C#版本来帮助我吗?
答案 0 :(得分:0)
我想从正在运行的进程中调用一个方法。方法总是有的 相同的地址,我知道它的基地址,所以我只需要 叫它,但我不知道如何在C#
中做到这一点
您正在寻找的是Hooking,在C#本身并不容易,事实上您需要使用一些非托管库来实现它。但是,幸运的是,有人写了一个已经存在于库中的所有硬件,称为EasyHook。
这不仅仅是您在上面发布的代码那么简单(但我怀疑您上面发布的代码也“正常工作”),他们在downloads section中有一个教程我建议您通读以便学习怎么做。
然而,除此之外,我强烈推荐the suggestion in the comments
如果您的c ++代码有效, 在C ++ / CLI中完成并将其包装在托管类中。
采用这种方法比尝试从头开始使用EasyHook之类的东西要容易得多(如果它甚至可以完全按照你想做的那样)。
答案 1 :(得分:0)
Scott的回答肯定是更简单,更清晰的解决方案,但值得注意的是,您可以使用calli
instruction将任何指针调用为CIL中的函数指针。它不如代表安全,并且C#没有任何内置的方法来通过反射发出它以外的指令,但好处是它明显快于委托。
您应该只在以下情况下使用它:
一个完美的用例是加载OpenGL扩展,其中函数声明是已知的,但该位置是特定于实现的并且在运行时被查询。
这个问题应该特别使用挂钩库,但如果其他人根据标题找到了这个问题,这可能是他们正在寻找的答案。