强制将模块(DLL)加载到特定地址

时间:2019-03-27 17:46:35

标签: windbg

  • 可执行文件已加载并在WinDbg中运行
  • 它在某些地址加载所需的模块
  • 在此会话中检索的断点集/跟踪取决于这些地址
  • 当针对同一可执行文件启动另一个会话时(是否取决于更改dll依赖关系的代码执行路径,或者某些不确定的加载器行为?),模块现在已加载到不同的地址。

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

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

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

我很高兴看到.reload命令具有一个地址参数,该参数看起来确实可以满足我的要求。但是,即使该命令将加载模块,但在继续执行程序时(需要实际加载dll),它仍将继续并为同一模块加载另一个copy(?),并给出如下警告: / p>

WARNING: moduleX_1be0000 overlaps moduleX

所以它并没有真正按照我的预期工作,所以这个问题!

1 个答案:

答案 0 :(得分:1)

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

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

更改模块地址的过程称为重定基。如果基址不再可用,例如已被堆使用。在这种情况下,您根本无法阻止重新部署。

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

Stud_PE changing a COFF flag

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

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

  

如果要重新设置为固定地址(ala QFE)   使用@@ files.txt格式,其中files.txt包含   地址/大小组合以及文件名

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