【问题标题】:How to correct WinAPI calls?如何更正 WinAPI 调用?
【发布时间】:2014-02-21 01:48:48
【问题描述】:

上次我把我的问题描述得很糟糕。 现在我将尝试更清楚地解释我的问题。

我正在尝试进行 HDD 串行检查以防止程序分发。我没有它的src,所以我在.code部分找到了一些空间并在那里注入了代码。

您可以看到模块间调用。例如,call kernel32.GetDriveTypeA 匹配 call 75738D98。但是重启后这个地址会改变。但是我的代码调用了不正确的75738D98 地址。

我需要修复它(解析新的GetDriveTypeA 地址并将75738D98 替换为正确的地址)

【问题讨论】:

  • 现代版本的 Windows 将随机化加载模块的基地址,以使实施“return-to-libc”攻击更加困难。见en.wikipedia.org/wiki/Address_space_layout_randomization
  • 您应该编辑上一个问题,而不是重新编写一个新问题。现在请删除之前的问题。

标签: winapi


【解决方案1】:

LoadLibraryGetProcAddress 将为您提供 DLL 函数的地址。下一个自然的问题是:如果你不知道LoadLibraryGetProcAddress 的地址,你怎么能打电话给他们?

所有用户进程都加载了 kernel32。您不需要在 kernel32 中动态加载任何内容。

通常您的链接器和操作系统加载程序通过链接到导入库(例如 kernel32.lib)为您完成这一切。这将告诉操作系统您希望 kernel32 与您的 DLL 一起加载。您的 DLL 有一个 import address table,其中包含一堆真实导入函数的存根。当你的模块被加载时,操作系统会修补这些存根以指向真正的函数地址。

您可能也应该这样做。如果您尝试变得过于骇人听闻,您的应用甚至会被检测为恶意软件。

你有充分的理由不只链接到导入库吗?

【讨论】:

  • 不,当 DLL 映射到内存时,链接器会生成一个由 OS 加载程序代码连接的存根。
  • 然后继续:如何修改那个存根?
  • 一个更好的问题是:为什么假设它应该保持不变?它是虚拟地址空间;你不应该假设任何模块的位置。这就是存在 LoadLibrary 和 GetProcAddress 的原因。
  • 磁盘上的代码保持不变。内存中的代码(导入地址表)被修补。见:en.wikipedia.org/wiki/Portable_Executable#Import_Table
  • 谢谢,十四!幸运的是,目标 PE 在其导入表中有GetProcAddress!现在我应该只打电话给他们并获得蚂蚁功能的正确地址。
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多