首页 > 系统相关 >windbg下看系统非分页内存

windbg下看系统非分页内存

时间:2022-11-07 21:39:59浏览次数:44  
标签:MMFREE windbg POOL MmNonPagedPoolFreeListHead 内存 ENTRY nt 非分 页面


    这篇文章实在是闲的无聊才写的,因为快过年了...文章基于xpsp3

    先看看和非分页内存相关的全局变量,也好有个大局观:

kd> x nt!MmNonPaged*
805517d8 nt!MmNonPagedPoolEnd = <no type information>
8055af84 nt!MmNonPagedPoolEnd0 = <no type information>
8055af80 nt!MmNonPagedPoolExpansionStart = <no type information>
8055fb20 nt!MmNonPagedSystemStart = <no type information>
8055af60 nt!MmNonPagedPoolFreeListHead = <no type information>
8055ae38 nt!MmNonPagedPoolStart = <no type information>

kd> dd nt!MmNonPagedPoolStart L1
8055ae38 8164b000
kd> dd nt!MmNonPagedPoolEnd0 L1
8055af84 86800000

    x nt!MmNonPaged*列出了可能和非分页内存池相关的全局变量。在这篇文章里,主要涉及3个变量:


nt!MmNonPagedPoolEnd0:保存基本NonPagedd内存池的结束地址


nt!MmNonPagedSystemStart:保存基本NonPagedd内存池的开始地址


nt!MmNonPagedPoolFreeListHead:空闲Nonpaged页面队列头数组;xp下该数组有4个元素,每个数组元素都是_LIST_ENTRY结构。MmNonPagedPoolFreeListHead[0]中的节点包含1个页面;MmNonPagedPoolFreeListHead[1]中的节点保存了2个页面,以此类推。

    来看下这几个队列的使用情况:

kd> dd nt!MmNonPagedPoolFreeListHead L8 ;下面的[]是我自己加的,用于分割各个_LIST_ENTRY结构
8055af60 [8055af60 8055af60] [86674000 863e9000]
8055af70 [86071000 86071000] [863ec000 8164b000]

    从dd的结果可以看出,现在数组元素0和2是空队列,里面的空闲页面已被瓜分完。也就是单页面和3页面的Nonpaged内存池已用完。现在我们知道Nonpaged内存池的使用情况,再来看看各个空闲页面链表中的节点。既然MmNonPagedPoolFreeListHead[0]和MmNonPagedPoolFreeListHead[2]已经告罄,我们就来看看剩下的两个链表:

kd> dt nt!*MMFREE*
ntoskrnl!_MMFREE_POOL_ENTRY
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY
+0x000 List : _LIST_ENTRY
+0x008 Size : Uint4B
+0x00c Signature : Uint4B
+0x010 Owner : Ptr32 _MMFREE_POOL_ENTRY

    上面的结构是空闲页面队列中各个节点的类型。以MmNonPagedPoolFreeListHead[1]中的节点为例,每个节点中包含2个连续的页面,每个页面的起始位置被用作ntoskrnl!_MMFREE_POOL_ENTRY结构。再继续下去前,先让我介绍一下各个域的作用:

1.只有节点中的第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域会被加入到MmNonPagedPoolFreeListHead[1]所在的空闲页面链表中,第二个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域不起作用;
2.由于节点中的两个页面的地址是连续的,因此,在MmNonPagedPoolFreeListHead[1]中定位到第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域,再加上PAGE_SIZE,就可以获得后续页面。至于ntoskrnl!_MMFREE_POOL_ENTRY!Size的作用,则用于反应节点中有多少个页面;
3.除了节点中第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!Owner域指向本页面的ntoskrnl!_MMFREE_POOL_ENTRY以外,节点中的其他页面的Owner域都指向第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY。

    了解了这个背景后,看下MmNonPagedPoolFreeListHead[1]中的节点的值:

kd> dt _LIST_ENTRY 8055af60+8 ;MmNonPagedPoolFreeListHead[1]的地址
nt!_LIST_ENTRY
[ 0x86674000 - 0x863e9000 ]
+0x000 Flink : 0x86674000 _LIST_ENTRY [ 0x863c8000 - 0x8055af68 ] ;内存0x86674000处有一个_MMFREE_POOL_ENTRY类型的节点
+0x004 Blink : 0x863e9000 _LIST_ENTRY [ 0x8055af68 - 0x86197000 ]
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY 0x86674000
+0x000 List : _LIST_ENTRY [ 0x863c8000 - 0x8055af68 ]
+0x008 Size : 2 ;节点中有2个页面
+0x00c Signature : 2
+0x010 Owner : 0x86674000 _MMFREE_POOL_ENTRY ;Owner指向自己
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY 0x86674000+0x1000 ;节点中的第二个页面
+0x000 List : _LIST_ENTRY [ 0x44524352 - 0x90028 ]
+0x008 Size : 0x35e41f0
+0x00c Signature : 0
+0x010 Owner : 0x86674000 _MMFREE_POOL_ENTRY ;owner指向前一个页面的_MMFREE_POOL_ENTRY结构

    Windows就是基于这样的结构,对Nonpaged内存池进行管理的~




标签:MMFREE,windbg,POOL,MmNonPagedPoolFreeListHead,内存,ENTRY,nt,非分,页面
From: https://blog.51cto.com/u_13927568/5831379

相关文章

  • xp sp3关闭PAE(物理内存扩展)
      这几天调试系统PTE区域,在获取nt!MmFirstFreeSystemPte指向的元素时,总无法获得正确的空闲pte值。反汇编nt!MiInitializeSystemPtes函数时发现这样的代码:80544e358d3c......
  • 搜索驱动程序分配的内存和查看KEVENT状态
    问题的提出:(类似windbg~*kb命令)的调用栈不就行了。没错,对于应用程序而言,这样做十有八九已经定位了。但是,对于驱动程序而言,它运行的上下文可能并不固定在某一进程,回溯内核......
  • 用windbg为无效页面建立页面映射
       前几天和同事扯淡,说调试驱动时访问无效内存会蓝屏,好麻烦,应该让windbg自动建立一个有效的页面,这样就不用蓝屏重启了。虽然说这是扯淡,但仔细想想貌似也不是不可能实现......
  • windbg调试服务程序
       相比通过输出日志来跟踪程序运行状态,我更倾向使用调试器。虽然我早知调试服务很麻烦,总不会比调试驱动还麻烦吧?基于这个想法,我尝试了在win7上使用windbg调试服务并记......
  • windbg中通过文件句柄查找设备(!handle/!fileobj/!devobj命令)
      有时,在驱动程序中会调用ZwCreateFile获得设备句柄,然后保存在设备扩展区域中供其他例程使用。由于驱动程序经常被动调用----执行的上下文可能不是同一个线程----会获得......
  • windbg调试窗口过程WindowProc(winxp 32bit)
      ollydbg在调试窗口程序方面做得很便捷,虽然windbg在这方面不如od,但通过命令的组合也能达到类似的效果。我借winxp的calc.exe为例来谈谈如何用windbg调试窗口过程。 ......
  • windbg中所谓的上下文
      <软件调试>30.7节简要的提到了windbg调试上下文的概念:如会话/进程/寄存器等上下文。为了深入了解背后的含义,我翻开windbg帮助文档,发现其对进程/寄存器上下文的解释最......
  • Redis优化神技:如何用更少内存,保存更多数据
      今天跟大家分享一些优化神技,当你面试或者工作中你遇到如下问题,那就使出今天学到的绝招,一招定乾坤! 如何用更少的内存保存更多的数据? 我们应该从Redis是如何......
  • C指针之二:c的动态内存管理
    参考书籍《深入理解c指针》原书作者:RichardReese华盛顿州塔尔顿州立大学副教授篇首语指针为什么强大?因为能够追踪动态分配的内存,通过指针来管理这部分内存是很多操作的基......
  • C指针之一:指针和内存
    参考书籍《深入理解c指针》原书作者:RichardReese华盛顿州塔尔顿州立大学副教授如果想在C/C++道路上走的更远,那么必须非常熟悉指针1、关于指针大小的谣言,指针到底多大?指......