使用!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
,出现如下图反馈断点命中。
之后再输入命令就能找到地址。具体使用
- !ndx.address
直接输出默认进程所有的VMA信息
- !ndx.address AMV地址(请以输入0x开头的十六进制地址)
可以从上图中的信息复制一个想要具体查看的VMA地址,显示其更详细的信息
- !ndx.address -s
按照文件名字排序输出所有VMA信息(所需时间根据VMA数量而定,有可能耗费一分钟以上的时间)
- !ndx.address -m
输出默认进程的mm_struct结构体的详细信息
比如其中的start_brk,brk 和start_stack就记录着堆栈相关信息。
作者:YuQing 创建时间:2022-07-27 09:06
最后编辑:YuQing 更新时间:2024-10-10 17:15
最后编辑:YuQing 更新时间:2024-10-10 17:15