【问题标题】:GetProcAddress weird return addressGetProcAddress 奇怪的返回地址
【发布时间】:2012-06-13 20:38:10
【问题描述】:

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

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

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

【问题讨论】:

  • 在您的 Windows 版本上,这些功能似乎就在此处。在过去的美好时光里,恶意软件编写者必须在没有 Stack Overflow 的情况下完成所有工作。
  • 如果你对这个问题没有很好的答案,我相信这在 SO 上是不受欢迎的
  • 这不是恶意软件,是针对游戏的 AntiHack 解决方案,例如 nProtect GameGuard、AhnLab HackShield 等。
  • 从什么时候开始rootkits不是恶意软件了?
  • 你不能根据它做了什么来判断它,而是它必须做什么。在这种情况下,保护游戏免受作弊者和黑客攻击:)

标签: c windows loadlibrary getprocaddress pointer-address


【解决方案1】:

这是一个简单的导出转发案例,如 Matt Pietrek 的一篇出色的 MSDN 杂志文章 An In-Depth Look into the Win32 Portable Executable File Format, Part 2 中所述。

您可以使用 Dependency Walker 或 dumpbin 等工具自行验证。

dumpbin /exports kernel32.dll | grep codePointer

    205   CC          DecodePointer (forwarded to NTDLL.RtlDecodePointer)
    240   EF          EncodePointer (forwarded to NTDLL.RtlEncodePointer)

【讨论】:

【解决方案2】:

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

【讨论】:

  • 有什么问题吗?也许你有什么问题,程序员!而且我敢肯定,我可以在您的 C/C++ 代码中找到一些安全漏洞(缓冲区溢出、整数溢出……)。
  • 您链接的文章没有讨论转发导出,您的私有工具的输出对我们其他人没什么用?有很多工具可以列出转发的导出。
  • 在“社区内容”中有。但我显示此链接只是为了参考有关导出条目的定义。问题是关于 dll 导出功能的,所以,很高兴看到导出条目是如何定义的并回答问题。我的个人工具就是这么简单,谁都可以写:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多