0

有人解释了为什么下一个代码在 ntdll.dll 中返回一个指针?

GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");

PS:如果调用 kernel32 的导出表指向的函数,会抛出断点。

4

2 回答 2

7

这是一个简单的导出转发案例,如 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)
于 2012-06-13T21:12:55.547 回答
5

它被称为 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:我认为这是个好问题。如果您想编写小程序(甚至是恶意软件)用于研究目的,那并没有错!

于 2012-06-13T21:13:03.627 回答