gpt4 book ai didi

c# - 从 VTable 调用结构中的非托管函数

转载 作者:行者123 更新时间:2023-11-30 12:13:03 26 4
gpt4 key购买 nike

是否可以从 C# 调用函数到结构中的非托管函数(通过 VTable)。

例如,我正在进程内挂接一个应用程序,并且正在为(应用程序的)每个类重新创建结构。

public struct SomeStruct {
[FieldOffset(0x00)]
public IntPtr * VTable;

[FieldOffset(0x10)]
public uint SomeValue;
}

然后,我通常会这样做:

var * data = (SomeStruct*)(Address);

我希望通过以下任一方式从结构的 VTable 中调用一个函数

Invoke<delegate>(data->VTable[0x3C])(delegateArguments)

或者

var eax = Invoke<Func<uint,uint>(data->VTable[0x3C])(arg1,arg2)

此外,这是否可以高效地完成(因为这些 vtable 函数可以被调用多次)?

也许通过反射发射?

据我所知,每次调用 Invoke<> 时编码都必须创建委托(delegate)函数功能。

最佳答案

鉴于虚拟方法表包含指向函数的指针,假设您知道偏移量(看起来您知道),您可以在 IntPtr 中获取指针值通过调用 ReadIntPtr methodMarshal class 上,像这样:

IntPtr ptr = Marshal.ReadIntPtr(data.VTable, 0x3C);

然后你可以调用GetDelegateForFunctionPointer methodMarshal class 上获得适当类型的委托(delegate),如下所示:

// Assuming a signature of f(int, int) returning int
Func<int, int, int> func = (Func<int, int, int>)
Marshal.GetDelegateForFunctionPointer(ptr, typeof(Func<int, int, int>));

然后您可以根据需要调用委托(delegate)。

关于c# - 从 VTable 调用结构中的非托管函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com