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

Kev*_*enK 5 c++ memory process

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

经过广泛的搜索,我已经能够在CodeProject找到一篇很好的文章,它有*我想要的大部分功能: 执行另一个进程内存的十六进制转储.这在解决权限问题方面做得很好,并奠定了良好的基础.

但是,使用此实用程序,我已经看到即使是一个小的进程,例如干净的Notepad.exe或Calc.exe实例,也可以生成大小超过24MB的转储文件,而根据TaskManager,进程本身在内存中运行不到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
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来转储不会导致这种开销的另一个进程的内存,或者可能是对解决此问题的链接文章代码的改进?我想获得实际属于进程本身的内存.我可以转储DLL中实际使用的函数的内存空间,但似乎没有必要转储多个DLL的*whole*内容来获取进程的运行内存.

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

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

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

Rem*_*anu 3

您基本上是在请求用户进程小型转储。Windows 调试帮助程序库为此提供了一个现成的函数,MiniDumpWriteDump.

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

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

生成的小型转储可以使用 Windbg 或 Visual Studio 等调试器读取,也可以由dbghelp.dll库中的各种函数进行处理。