GetProcAddress为函数名返回0" RtlGetLastErrorString"在EasyHook32.dll中?

时间:2015-08-19 03:33:16

标签: c# winapi dll pinvoke dllimport

打开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不同。如果你能就这个问题给我一些解释,那将是非常好的。非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

RtlGetLastErrorString的正确名称是_RtlGetLastErrorString@0

enter image description here