【问题标题】:Force a module (DLL) to be loaded at a specific address强制将模块 (DLL) 加载到特定地址
【发布时间】:2019-03-27 17:46:34
【问题描述】:
  • 可执行文件已加载并在 WinDbg 中运行
  • 它在某些地址加载它需要的模块
  • 在此会话中检索到的断点集/跟踪取决于这些地址
  • 当为同一个可执行文件启动另一个会话时(取决于代码执行路径更改 dll 依赖顺序,还是某些不确定的加载程序行为?)模块现在被加载到不同的地址。

如果有一种方法可以指示 windbg/loader 在给定地址加载尚未加载的模块,那将会很有帮助。这将使某些脚本/文本比较更容易。

是的,我确实意识到,例如,应该首选设置相对于符号名称的断点而不是使用固定地址,但是能够“重现”参考调试环境肯定具有一定的优势。

假设我们正在处理 3rd 方 DLL(我无法使用预定义的加载地址重新编译),有没有办法做到这一点?

我很高兴看到.reload 命令有一个地址参数,看起来它完全符合我的要求。然而,即使该命令会加载模块,当程序继续运行时(并且需要实际的 dll 加载),它仍会继续为同一模块加载另一个副本(?),并给出如下警告:

WARNING: moduleX_1be0000 overlaps moduleX

所以它并没有像我预期的那样真正起作用,所以这个问题!

【问题讨论】:

    标签: windbg


    【解决方案1】:

    WinDbg 不加载模块 (DLL)。模块由可执行文件加载。

    WinDbg 的ld.reload 命令不加载模块,它们加载符号信息(PDB 文件)。

    更改模块地址的过程称为变基。如果基地址不再可用,就会发生这种情况,例如已被堆使用。在这种情况下,你根本无法阻止变基。

    可能有帮助的一件事是禁用 ASLR(地址空间布局随机化)。您可以在 DLL 或 EXE 中更改该设置。它是 COFF 标头的一部分:

    在 Windows 7 上,有一些方法 to disable ASLR completely,但不建议为了帮助您调试单个进程而在每个系统的基础上更改该设置。

    另一种选择是使用 Windows SDK 的rebase.exe 并将基地址更改为您认为在加载 DLL 时更有可能空闲的虚拟地址。我自己从来没有这样做过,但是rebase 帮助说:

    如果你想变基到固定地址 (ala QFE) 使用其中 files.txt 包含的 @@files.txt 格式 除了文件名之外的地址/大小组合

    所以,听起来可以定义自己的地址。

    【讨论】:

    • 检查选项,是的,我也意识到.reload 的主要用途与符号有关,但它的官方帮助页面特别说明:In some cases, this command also reloads or unloads the module itself。否则我认为存在地址参数没有多大意义。
    • 至于 ASLR,我确实在 SO RE 中看到了与我的标题相当相似的帖子,这反过来又将我指向了您链接的那个。我只是在尝试系统范围的设置(通过 EMET),结果把系统搞得一团糟。调试器目标不起作用,在我的情况下,它也导致其他应用程序出现问题。我也研究了变基选项。这些页面说MS的rebase(不以基地址作为参数,并且)根据文件名/哈希设置它,所以它不能完全保证无冲突的基地址,你知道是否仍然如此吗?
    • @OzgurH:在 Windows >7 中弄乱 ASLR 可能会导致问题。确实有人说 Win 8.1 已经存在问题:digital-forensics.sans.org/blog/2014/02/17/… 我已经更新了关于固定基地址的答案。看起来相当复杂。
    • 老实说,我希望有更多的虚拟/即时/非侵入式解决方案。但是,如果在接下来的几天内没有其他答案出现,我将尝试 rebase 和 PE 编辑建议,看看它们是否达到了我的要求........(感谢您的快速回复/ 编辑我的评论!-毕竟 rebase 可能会起作用(假设 ASLR 并不总是赢!?)(顺便说一句,你有没有注意到我对你 5 岁以上问题的回答(#20515857)?:))
    猜你喜欢
    • 2019-05-13
    • 2015-11-28
    • 1970-01-01
    • 2017-07-28
    • 2010-10-20
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多