GetProcAddress returns EasyHook32.dll 中函数名称 "RtlGetLastErrorString" 的 0?
GetProcAddress returns 0 for the function name "RtlGetLastErrorString" in EasyHook32.dll?
打开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
returns 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
返回成功。我也试过不同的变体名称:RtlGetLastErrorStringA
、RtlGetLastErrorStringW
,但还是一样。
GetLastError
表示找不到函数名(错误代码:127)。所以我相信它实际不存在。但我想知道为什么 DllImport
似乎找到了那个功能?
是否有任何工具可以查看 EasyHook32.dll
中的函数条目?我试过使用 OllyDbg
但我不确定我是否用得好,我试过查看 Executable modules
但它们看起来都像是从 Windows 加载的底层模块。我尝试在所有模块中查找所有名称,但似乎没有任何名为 RtlGetLastErrorString
的条目。所以看起来我对 DllImport 的理解有问题。至少 DllImport 获取函数的方式与 GetProcAddress
不同。如果你能给我一些关于这个问题的解释,那就太好了。非常感谢!
您可以使用 dependency walker 查看 dll 的导出函数名称。
RtlGetLastErrorString 的正确名称是 _RtlGetLastErrorString@0
。
打开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
returns 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
返回成功。我也试过不同的变体名称:RtlGetLastErrorStringA
、RtlGetLastErrorStringW
,但还是一样。
GetLastError
表示找不到函数名(错误代码:127)。所以我相信它实际不存在。但我想知道为什么 DllImport
似乎找到了那个功能?
是否有任何工具可以查看 EasyHook32.dll
中的函数条目?我试过使用 OllyDbg
但我不确定我是否用得好,我试过查看 Executable modules
但它们看起来都像是从 Windows 加载的底层模块。我尝试在所有模块中查找所有名称,但似乎没有任何名为 RtlGetLastErrorString
的条目。所以看起来我对 DllImport 的理解有问题。至少 DllImport 获取函数的方式与 GetProcAddress
不同。如果你能给我一些关于这个问题的解释,那就太好了。非常感谢!
您可以使用 dependency walker 查看 dll 的导出函数名称。
RtlGetLastErrorString 的正确名称是 _RtlGetLastErrorString@0
。