如何从内存转储中提取 DLL 文件?
我有一个内存转储(非托管进程)。 如何提取(使用 Windbg)加载到进程中的 dll 之一?我的意思是实际上将dll文件保存到磁盘中
I have a memory dump (unmanaged process) .
How can I extract (using windbg) one of the dlls loaded into the process ? I mean actually saving the dll file into the disk
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用windbg目录中的sos.dll。
首先,在 Windbg 中加载 sos.dll:
然后使用 !sam 或 !SaveAllModule 将模块提取到特定磁盘位置:
You can use the sos.dll inside windbg directory.
First, load the sos.dll in windbg:
Then use !sam OR !SaveAllModule to extract the modules on specific disk location:
要在不使用 SOS 的情况下提取 DLL,请使用 .writemem 扩展名,如下所示:
使用
lmvm dllname
发现模块起始地址和结束地址
ieframe 的输出示例:
开始结束模块名称
61370000 61fb8000 ieframe
计算长度=结束-开始:
? 61fb8000 - 61370000
输出:
计算表达式:12877823 = 00c48000
然后按如下方式保存 DLL:
.writemem C:\tmp\mydll.dll 61370000 L?00c48000
这不太可能为您提供确切的 DLL,因为它是从磁盘加载的,修复此问题并不简单。
(部分基于本文)
To extract a DLL without using SOS, use the .writemem extension as follows:
discover the module start and end addresses using
lmvm dllname
example output for ieframe:
start end module name
61370000 61fb8000 ieframe
calculate the length = end-start:
? 61fb8000 - 61370000
output:
Evaluate expression: 12877823 = 00c48000
then save the DLL as follows:
.writemem C:\tmp\mydll.dll 61370000 L?00c48000
This is unlikely to give you the exact DLL as it was loaded from disk, fixing this up is non-trivial.
(Partly based on this article)
是的,这是真的。 calc.exe 还将提取其多用户语言界面信息并将其附加到内存中,许多 Windows 程序(如 mspaint、photoviewer 等)也是如此。
Yes, it's true. calc.exe will also pull up its multi user language interface information and attach it in memory, as will a lot of Windows programs like mspaint, photoviewer, etc.