Windbg 如何从内存转储中提取DLL文件?

Windbg 如何从内存转储中提取DLL文件?,windbg,dump,Windbg,Dump,我有一个内存转储(非托管进程)。 如何提取(使用windbg)加载到进程中的DLL之一?我的意思是实际上将dll文件保存到磁盘中您可以在windbg目录中使用sos.dll 首先,在windbg中加载sos.dll: .load clr10\sos.dll 那就用吧!山姆或!SaveAllModule以提取特定磁盘位置上的模块: !sam c:\notepad 要在不使用SOS的情况下提取DLL,请使用.writeem扩展名,如下所示: 使用lmvm dllname ieframe的输出示例

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

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

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

.load clr10\sos.dll
那就用吧!山姆或!SaveAllModule以提取特定磁盘位置上的模块:

!sam c:\notepad

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

  • 使用
    lmvm dllname

    ieframe的输出示例:
    开始-结束模块名称

    61370000 61fb8000 ieframe

  • 计算长度=结束-开始:
    ?61fb8000-61370000

    输出:
    求值表达式:12877823=00c48000

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

  • 这不太可能为您提供从磁盘加载的确切DLL,修复它是非常重要的


    (部分基于)

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

    我尝试过,但没有成功。我将Windbg附加到Calc.exe并编写了exe,得到了一个更大的文件。奇怪。我想这是因为对齐方式不一致——由于内存对齐要求更高,pe32文件在内存中比磁盘上占用更多空间。您需要在转储可执行文件后正确地重新生成该文件,以满足这些规则。此外,调试部分没有被转储(因为我猜它没有被映射)。导入表也需要重建。