【问题标题】:How can I extract DLL file from memory dump?如何从内存转储中提取 DLL 文件?
【发布时间】:2010-12-11 06:19:34
【问题描述】:

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

【问题讨论】:

    标签: windbg dump


    【解决方案1】:

    要在不使用 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,修复此问题并非易事。

    (部分基于this article

    【讨论】:

    • 我试过了,但没用。我将 Windbg 附加到 Calc.exe 并编写了 exe 并获得了一个更大的文件。奇怪。
    • 我猜这是由于对齐方面的差异 - 由于更大的内存对齐要求,pe32 文件在内存中占用的空间比在磁盘上更多。您需要在转储后正确重建可执行文件以满足这些规则。此外,调试部分没有被转储(因为它没有被映射,我猜)。导入表也需要重建。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      .load clr10\sos.dll
      

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

      !sam c:\notepad
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多