10

我有一个内存转储(非托管进程)。如何提取(使用 windbg)加载到进程中的 dll 之一?我的意思是实际上将dll文件保存到磁盘中

4

3 回答 3

6

您可以使用 windbg 目录中的 sos.dll。

首先,在windbg中加载sos.dll:

.load clr10\sos.dll

然后使用 !sam 或 !SaveAllModule 提取特定磁盘位置上的模块:

!sam c:\notepad
于 2009-10-29T14:09:49.177 回答
4

要在不使用 SOS 的情况下提取 DLL,请使用 .writemem 扩展名,如下所示:

  1. lmvm dllname
    使用ieframe 的示例输出发现模块开始和结束地址:
    start end module name
    61370000 61fb8000 ieframe

  2. 计算长度 = end-start:? 61fb8000 - 61370000
    输出:Evaluate expression: 12877823 = 00c48000

  3. 然后按如下方式保存DLL:
    .writemem C:\tmp\mydll.dll 61370000 L?00c48000

这不太可能为您提供从磁盘加载的确切 DLL,修复此问题并非易事。

(部分基于本文

于 2009-10-29T15:55:23.433 回答
-2

对,是真的。calc.exe 也会提取其多用户语言界面信息并将其附加到内存中,许多 Windows 程序(如 mspaint、photoviewer 等)也会如此。

于 2009-11-11T18:56:38.537 回答