使用!ndx.address 查看进程的虚拟地址空间(VMA)

通过!ndx.address扩展命令观察当前进程空间中的所有虚拟内存区(VMA)列表和详情。

具体原理

获得mmap的头地址后,通过描述进程的mm_struct结构体得到进程所有VMA的链表,获取头地址后遍历。每一个进程都会有唯一的mm_struct结构体,而mm_struct通过vm_are_struct管理虚拟内存空间,一个vm_are_struct(VMA)就代表一段虚拟内存空间。mm_struct结构体相当于多个VMA的合集。
mm_struct结构体:<include\linux\mm_types.h> - 340行左右
vm_area_struct结构体:<include\linux\mm_types.h> - 269行左右

其中一些信息的含义:

  • vm_start和vm_end:此块区域的开始和结束地址
  • vm_next和vm_prev:指向下一个和上一个VMA
  • vm_rb:红黑树节点信息
  • vm_flags:文件属性信息
  • vm_pgoff:偏移量,以PAGE_SIZE为单位
  • vm_file:映射文件信息,可以为空,代表文件匿名映射
  • vm_mm:指向所属的mm_struct,同一进程的所有VMA指向的mm_struct都是相同的。

    使用前准备

    首先需要加载相应的内核文件,输入.sympath 文件全路径,然后再输入.reload即可。如果曾经加载过,直接输入.reload即可。输入lm可以查看加载信息。
    如果此时输入!ndx.address依旧找不到地址,那么请手动设置断点:ba e1 lk!vfs_write
    输入g,出现如下图反馈断点命中。

    之后再输入命令就能找到地址。

    具体使用

  1. !ndx.address
    直接输出默认进程所有的VMA信息

  1. !ndx.address AMV地址(请以输入0x开头的十六进制地址)
    可以从上图中的信息复制一个想要具体查看的VMA地址,显示其更详细的信息

  1. !ndx.address -s
    按照文件名字排序输出所有VMA信息(所需时间根据VMA数量而定,有可能耗费一分钟以上的时间)

  1. !ndx.address -m
    输出默认进程的mm_struct结构体的详细信息


比如其中的start_brk,brk 和start_stack就记录着堆栈相关信息。

作者:YuQing  创建时间:2022-07-27 09:06
最后编辑:YuQing  更新时间:2024-04-26 11:16