【问题标题】:How to create binary/hex dump of another process's memory?如何创建另一个进程内存的二进制/十六进制转储?
【发布时间】:2009-08-18 22:35:31
【问题描述】:

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

经过大量搜索,我在 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 的*整个*内容来获取进程的运行内存。

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

提前感谢您的建议和指导,不胜感激。

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

【问题讨论】:

    标签: c++ memory process


    【解决方案1】:

    您基本上是在要求用户进程小型转储。 Windows Debug Helper 库为此提供了现成的函数MiniDumpWriteDump

    通过传入函数的MINIDUMP_TYPE 参数可以粗略地控制迷你转储中包含的详细信息的数量。最基本的MiniDumpNormal,只会捕获进程中每个线程的调用栈。使用其他小型转储类型,内存量会越来越详细。

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

    使用 Windbg 或 Visual Studio 等调试器生成的小型转储可以是 read,也可以由 various functions in the dbghelp.dll 库处理。

    【讨论】:

      【解决方案2】:

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

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

      它使用起来非常简单,并且可以创建正确的转储(我只是用一些程序尝试过)。

      【讨论】:

      • 感谢您的链接。我只希望链接包含 source =(
      • 好吧,也许你可以联系作者。如果您发现他们的程序有用,大多数编写免费软件的人都愿意提供帮助和合作。
      猜你喜欢
      • 2014-10-30
      • 2014-01-07
      • 2012-04-08
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多