【问题标题】:Is it possible to export/dump a DLL from process memory to file?是否可以将 DLL 从进程内存导出/转储到文件?
【发布时间】:2015-07-18 01:59:02
【问题描述】:

首先我知道 1.Is it possible to export a dll definition from my AppDomain? 2.Is it possible to save a dynamic assembly to disk? 3.How can I extract DLL file from memory dump?

但这些似乎都没有特别回答我的问题。

考虑以下场景:C# 应用程序从内存流加载 DLL(因此 DLL 不会直接向用户公开)。是否有明确允许将特定 DLL 以原始形式从内存转储或导出到磁盘的工具?

注意:我希望有人向我展示从 C# 应用程序的内存转储中提取完整 DLL 的完整分步过程。

【问题讨论】:

  • 加载dll的时候是什么格式的?你还有对“Assembly”对象或字节[]的引用吗?
  • 尝试使用 MyAssembly.Location ...这为您提供了一个可以读取的文件路径。我知道这是一个 MemoryStream,但他们可能会在内部创建一个临时文件。
  • @PhilippeParé 用户永远无法访问程序集的路径。我很想知道从进程分配的内存或内存转储中提取加载的 DLL 文件的确切方法。
  • 很抱歉,我认为这是不可能的。加载库后,它会加载符号。我能想到的唯一方法是使用 AssemblyBuilder 创建一个库,但这肯定不会产生你想要的原始文件。至少我不知道有什么办法。对不起!
  • @PhilippeParé 相信我,我真的很想知道这样做是不可能的,但 Hans Passant 先生(一位著名的 SO 用户)在第一条评论中另有说明。内存转储似乎确实包含大量数据,我读过有人能够从中提取 DLL,但我不知道如何正确执行。

标签: c# dll dump


【解决方案1】:

带有托管调试扩展的 WinDbg 能够做到这一点。 首先,下载WinDbg(googlemicrosoft debugging tools for windows,它们不是独立下载,而是其他套件的一部分)。

下一部分是安装psscor2 扩展(来自https://www.microsoft.com/en-us/download/details.aspx?id=1073)并将其解压到WinDbg 所在的文件夹。

接下来,运行您的程序并将 WinDbg 附加到它(它在菜单中)。输入以下命令:

  1. .load psscor2
  2. !SaveAllModules c:\modules\

找到您想要并享受的模块。

【讨论】:

  • 我已经在我的计算机上的一个随机 .NET 应用程序上测试了该解决方案,结果符合我的预期。但是,该应用程序可能没有使用Assembly.Load(byte[]),但我认为这应该不是问题。您感兴趣的程序集是否至少使用!DumpDomain 命令列出?
  • 我试过了,我得到了这个错误:0:021>!DumpDomain 找不到运行时 DLL (mscorwks.dll),0x80004005 扩展命令需要 mscorwks.dll 才能有事可做。
  • 好吧,!DumpDomain 适合我。尝试在!DumpDomain 之前运行.loadby sos mscorwks
  • 我切换到 32 位模式:0:019> !wow64exts.sw 尝试切换到 32 位模式:0:019:x86> .loadby sos clr 调用 LoadLibrary(sos) 失败,Win32错误 0n2 “系统找不到指定的文件。”和 0:019:x86> .loadby sos mscorwks Unable to find module 'mscorwks' Still not working..
  • 您运行的是 32 位还是 64 位版本的 WinDbg?尝试与您的 CLR 匹配的那个。对不起,我不知道 WinDbg/CLR 调试有困难。 + 我在 32 位机器上运行。
猜你喜欢
  • 2012-06-08
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
相关资源
最近更新 更多