Libvmi概况
LibVMI是一个C库,它提供了对正在运行中的底层虚拟机的运行细节进行监视的功能,监视的功能是由观察内存细节,陷入硬件事件和读取CPU寄存器来完成的。这种方式被称作虚拟机自省(virtual machine introspection)。
Libvmi原理
libvmi所提供的种种功能中,最主要的是内存自省功能,内存自省能允许用户从dom0监控(也就是读取内存数据)以及控制(也就是改写内存数据)操作系统。
用libvmi获取linux内核符号表
上图是通过libvmi获取内核符号的流程,主要有以下过程组成:
1. 应用程序请求查看内核符号。
2. libvmi通过系统的System.map获取内核符号的虚拟地址。
3. 找到虚拟地址所对应的内核页目录,并获取对应的页表。
4. 通过页表找到正确的数据页。
5. 数据页被返回给libvmi。
6. libvmi将数据返回给vmi应用程序。
用libvmi获取linux内核符号表的源码分析
首先来分析example下的map-symbol.c程序,这个程序可以在内存中找到指定的内核符号,并将内核符号所在的内存页打印出来。在分析源码的时候,我们尽可能减少无关紧要的代码,而只保留关键部分的代码进行分析。
/*map-symbol.c*/
#define PAGE_SIZE 1 << 12
int main(int argc, char **argv){
/*创建一个vmi的实例*/
vmi_instance_t vmi;
……