获取函数的Ptr值

时间:2013-07-31 15:22:31

标签: c# .net vb.net

我的应用程序中有一个API函数:

    <Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Ansi, ExactSpelling:=True)>
    Private Shared Function GetProcAddress(ByVal hModule As IntPtr, ByVal procName As String) As IntPtr
    End Function

我只想学习这个函数的指针'IntPtr'值。我该怎么办?

注意:我将在C ++中向您展示我想要的确切内容

void* fnGetProcAddress;
fnGetProcAddress = GetProcAddress;

2 个答案:

答案 0 :(得分:2)

好吧,你可以继续使用P / Invoke ......

(注意,这是在C#中,但很容易转换)

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string moduleName);


var hModule = GetModuleHandle("kernel32.dll");
var procAddress = GetProcAddress(hModule, "GetProcAddress");

答案 1 :(得分:2)

  

我想获取此地址并将其作为UInt32

写入BinaryStream

这是一个非常麻烦的计划。与错误的数据类型不同,您有保证您在阅读流时写入的地址仍然有效:

  • 读取流时可能根本无法加载DLL。它确实需要进行LoadLibrary()调用才能在进程中获取它。所以至少你还需要序列化DLL路径。

  • DLL 承诺再次加载到完全相同的地址。嵌入在DLL头中的加载地址仅仅是一个请求,所请求的地址已经被另一个DLL使用,迫使Windows 重新定位 DLL是很常见的。重新安置的地址是不可预测的。一个更大的问题是在现代Windows版本上有意完成重定位。当DLL与/ DYNAMICBASE链接器选项链接时,启用称为地址空间布局随机化的功能。它是一种反恶意软件功能,使恶意软件很难修补代码。

当然,有一种更好的方法可以做你想做的事情。然而,你犯了一个常见错误,就是不解释你的理由,这是不可能猜到的。