【问题标题】:GetProcAddress returns 0 for the function name "RtlGetLastErrorString" in EasyHook32.dll?GetProcAddress 为 EasyHook32.dll 中的函数名称“RtlGetLastErrorString”返回 0?
【发布时间】:2015-08-19 03:33:15
【问题描述】:

打开EasyHook项目的源码,可以看到有一些DllImports导入函数RtlGetLastErrorString是这样的:

//DllName here is a const string equaling to "EasyHook32.dll"
[DllImport(DllName, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public static extern String RtlGetLastErrorString();

所以我假设该函数应该存在。但是,以下代码无法正常工作(GetProcAddress 返回 0):

[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr GetModuleHandle(String path);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string path);

var mh = LoadLibrary("pathToEasyHook32.dll");
var procAddr = GetProcAddress(mh, "RtlGetLastErrorString");

mh 成功返回。我也尝试过不同的变体名称:RtlGetLastErrorStringARtlGetLastErrorStringW,但还是一样。

GetLastError 显示找不到函数名(错误代码:127)。所以我相信它实际上是不存在的。但我想知道为什么DllImport 似乎找到了那个功能?

是否有任何工具可以查看EasyHook32.dll 中的该函数条目?我试过使用OllyDbg,但我不确定我用得好不好,我试过查看Executable modules,但它们看起来都像是从Windows加载的底层模块。我尝试在所有模块中查找所有名称,似乎没有任何名为RtlGetLastErrorString 的条目。所以看起来我对 DllImport 的理解有问题。至少 DllImport 获取函数的方式与GetProcAddress 不同。如果您能就这个问题给我一些解释,那就太好了。非常感谢!

【问题讨论】:

    标签: c# winapi dll pinvoke dllimport


    【解决方案1】:

    您可以使用dependency walker查看导出的dll函数名称。

    RtlGetLastErrorString 的正确名称是_RtlGetLastErrorString@0

    【讨论】:

    • 太棒了!非常感谢你。该工具也非常有用,至少没有这样的工具我们很难确切知道要获取的函数名称。
    • @Hopeless:你并不需要一个工具来获取 C 中符号的修饰名称。你可以通过阅读 Format of a C decorated name 轻松构建它。
    • @lIInspectable 谢谢你提供的信息,非常有帮助。
    猜你喜欢
    • 2013-06-28
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多