有人解释了为什么下一个代码在 ntdll.dll 中返回一个指针?
GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");
PS:如果调用 kernel32 的导出表指向的函数,会抛出断点。
有人解释了为什么下一个代码在 ntdll.dll 中返回一个指针?
GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");
PS:如果调用 kernel32 的导出表指向的函数,会抛出断点。
这是一个简单的导出转发案例,如 Matt Pietrek 的一篇出色的 MSDN 杂志文章“深入了解 Win32 可移植可执行文件格式,第 2 部分”中所述。
您可以使用 Dependency Walker 或 dumpbin 等工具自己验证这一点。
dumpbin /exports kernel32.dll | grep codePointer
205 CC DecodePointer (forwarded to NTDLL.RtlDecodePointer)
240 EF EncodePointer (forwarded to NTDLL.RtlEncodePointer)
它被称为 DLL 转发/重定向或函数别名。出口条目的定义是:
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
所以,entryname 可以定义
EncodePointer=ntdll.RtlEncodePointer
去检查:
C:\>findaddress ntdll.dll RtlEncodePointer
ntdll.dll : 7C900000
RtlEncodePointer@ntdll.dll: 7C9132D9
C:\>findaddress kernel32.dll EncodePointer
kernel32.dll : 7C800000
EncodePointer@kernel32.dll: 7C9132D9
(findaddress 是我快速完成这项任务的个人工具)
你可以在这里看到更多:http: //msdn.microsoft.com/en-us/library/hyx1zcd3 (v=vs.80).aspx
PS:我认为这是个好问题。如果您想编写小程序(甚至是恶意软件)用于研究目的,那并没有错!