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

问题描述 投票:1回答:1
  • 加载可执行文件并在WinDbg中运行
  • 它加载了某些地址所需的模块
  • 在此会话中检索的断点集/跟踪取决于这些地址
  • 当为同一个可执行文件启动另一个会话时(根据代码执行路径改变dll依赖顺序,还是一些不确定的加载程序行为?),模块现在被加载到不同的地址中。

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

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

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

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

WARNING: moduleX_1be0000 overlaps moduleX

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

windbg
1个回答
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除文件名外还包含地址/大小组合

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

© www.soinside.com 2019 - 2024. All rights reserved.