如何使用 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
所以它不会工作;你需要一个实时系统。
我正在调试内核应用程序并想转储特定的内存部分。我想在特定点中断后将 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
所以它不会工作;你需要一个实时系统。