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

时间:2009-08-18 22:35:32

标签: c++ memory process

我无法找到合理的方法将另一个进程的内存转储到文件中。

经过广泛搜索,我已经能够在CodeProject上找到一篇很棒的文章,它有*我想要的大部分功能: Performing a hex dump of another process's memory.这很好地解决了权限问题,并奠定了良好的基础。

但是,使用此实用程序,我发现即使是一个小的进程,例如干净的Notepad.exe或Calc.exe实例,也可以生成大小超过24MB的转储文件,而进程本身在内存中运行不到20KB根据TaskManager。

这篇文章让我相信,也许它也会在共享内存中丢弃东西,可能还有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的* whole *内容来获取进程的运行内存。

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

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

注意:这适用于控制台实用程序,因此类似于CodeProject文章中的GUI元素并不重要。

2 个答案:

答案 0 :(得分:3)

你基本上要求用户进程minidump。 Windows Debug Helper库有一个现成的函数MiniDumpWriteDump

从传递给函数的MINIDUMP_TYPE参数可以粗略地控制迷你转储中包含的详细信息量。最基本的MiniDumpNormal只捕获进程中每个线程的调用堆栈。使用其他迷你转储类型,内存量逐渐变得更加详细。

您还可以通过向MiniDumpWriteDump函数提供回调并在回调中设置MINIDUMP_CALLBACK_OUTPUT结构上的标记来精确控制要写入迷你转储的信息量。

结果迷你转储可以read使用Windbg或Visual Studio等调试器,也可以由various functions in the dbghelp.dll库处理。

答案 1 :(得分:1)

不是真正的“如何编程”的答案,但我在寻找可以做到这一点的工具时找到了你的问题,当我遇到PMDump:

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

使用简单易用,并创建正确的转储(我只是尝试了一些程序)。