如何创建另一个进程内存的二进制/十六进制转储?

5
我在寻找一种合理的方法将另一个进程的内存转储到文件中遇到了困难。
经过广泛搜索,我找到了CodeProject上的一篇不错的文章,其中包含了我想要的*大部分*功能: 执行另一个进程的内存十六进制转储。 这篇文章很好地解决了权限问题并奠定了良好的基础。
然而,通过使用这个工具,我发现即使是像干净的Notepad.exe或Calc.exe实例这样的小进程,也会生成一个超过24MB大小的转储文件,而根据任务管理器,进程本身在内存中运行时不到20KB。
这篇文章让我相信,它可能还将共享内存中的内容转储出来,可能是DLL空间之类的东西。例如,对Calc.exe进行转储将包括从Kernel32.dll获取的方法名称(以及可能的内存)的部分:
²³´µKERNEL32.dll ActivateActCtx AddAtomA AddAtomW AddConsoleAliasA AddConsoleAliasW AddLocalAlternateComputerNameA AddLocalAlternateComputerNameW AddRefActCtx AddVectoredExceptionHandler AllocConsole AllocateUserPhysicalPages AreFileApisANSI AssignProcessToJobObject AttachConsole BackupRead BackupSeek BackupWrite BaseCheckAppcompatCache BaseCleanupAppcompatCache

有没有更好的方法可以转储另一个进程的内存,而不会导致这种开销,或者改进与链接文章代码相关的问题?我想获取实际属于该进程本身的内存。如果只转储实际在DLL中使用的函数的内存空间,我也可以接受,但是看起来没必要转储多个DLL的*全部*内容来获取进程的运行内存。

我正在寻找一种方法,可以获得30KB进程的30-60KB内存,而不是25MB。或者至少比我目前能够得到的更接近。

提前感谢您的建议和指导,非常感谢。

注意:这是一个控制台实用程序,因此 CodeProject 文章中的 GUI 元素并不重要。

2个回答

3
您基本上是在请求一个用户进程的迷你转储。Windows Debug Helper库有一个现成的函数可以实现这一点,即MiniDumpWriteDump
通过传递给该函数的MINIDUMP_TYPE参数,可以对迷你转储中包含的详细信息进行粗略控制。最基本的MiniDumpNormal仅会捕获进程中每个线程的调用堆栈。其他迷你转储类型中包含的内存量会逐步增加,从而提供更详细的信息。
您还可以通过向MiniDumpWriteDump函数提供回调并在回调中设置MINIDUMP_CALLBACK_OUTPUT结构上的标志来精细控制要写入迷你转储的信息。
生成的迷你转储可以使用Windbg或Visual Studio等调试器进行读取,也可以通过dbghelp.dll库中的各种函数进行处理

1

这并不是一个“如何编程”的答案,但我在寻找一个能够做到这一点的工具时发现了你的问题,当我遇到PMDump时:

http://ntsecurity.nu/toolbox/pmdump/

它非常容易和简单使用,能够创建正确的转储文件(我刚刚试用了一些程序)。


谢谢提供链接。我只是希望链接中包含源代码 =( - KevenK
也许你可以联系作者。大多数编写免费软件的人如果发现你的程序有用,都愿意提供帮助和合作。 - Milan Babuškov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接