如果有一种方法可以指示windbg / loader在给定地址加载尚未加载的模块,那将会很有帮助。这将使某些脚本/文本比较更容易。
是的,我确实意识到,例如,设置相对于符号名称的断点应该是首选而不是使用固定的addreses,但是能够“重现”参考调试环境肯定具有某些优点。
假设我们正在处理第三方DLL(我无法使用预定义的加载地址重新编译),有没有办法做到这一点?
我很高兴看到.reload
命令有一个地址参数,看起来它完全符合我的要求。但是,即使该命令将加载模块,当程序继续(并且需要实际的dll加载)时,它将继续并仍然为同一模块加载另一个副本(?),并发出如下警告:
WARNING: moduleX_1be0000 overlaps moduleX
所以它并没有像我预期的那样真正起作用,因此这个问题!
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除文件名外还包含地址/大小组合
所以,听起来可以定义自己的地址。