如何使用 Windbg 转储特定的内存部分?

How can I dump a specific section of memory with Windbg?

我正在调试内核应用程序并想转储特定的内存部分。我想在特定点中断后将 driver(意味着它的 PE header 及其所有部分)复制到转储文件中。我曾尝试使用常规内存转储并删除不相关的部分,但奇怪的是,内核转储似乎将 PE 文件分开,将它们的部分分散在一个巨大的 300mb 转储中,这对我来说基本上毫无用处。有没有一种方法可以使用 Windbg 转储一段内存,或者可能编写一个可以添加此类功能的扩展?

(本来是评论,但有点太长了)

在完美的世界中,最简单的事情就是 lmvm <driver_name>(请参阅 lm command), look at the base and end of the driver mapping and then do a .writemem 映射范围。

唉,一些驱动程序部分是可丢弃的(它们在控制流到达入口时被映射,但通常在 DriverEntry 执行后将被取消映射),而其他部分将在期间被系统调出(写入磁盘)驱动程序的生命(并在页面错误的情况下映射回来)。此外,如果 (iirc) .writemem 无法读取内存范围的一部分,则它会完全失败。

最好的办法是在入口点转储驱动程序(我认为 Windows 不会延迟加载驱动程序部分)。

从技术上讲,您可以遍历所有页面,如果缺少一个页面,您可以尝试 .pagein 缺少的块,但它有时也会失败(无法知道原因)。 ..

.pagein 非常繁琐,因为您要求页面范围,以便调试器可以从磁盘分页到请求的内存中,但您还需要系统 运行 (.pagein 后面需要跟一个 g),这样调试器就可以请求文件系统驱动程序堆栈将页面返回到内存中。在那段时间里,系统 运行s...

如果你在内存转储上这样做,你显然不能 .pagein 所以它不会工作;你需要一个实时系统。