Page 326 - 《软件学报》2021年第10期
P. 326
3298 Journal of Software 软件学报 Vol.32, No.10, October 2021
寄存器指定地址开始到达被调用函数,被调用函数首先通过“pushl%ebp;movl%esp,%ebp”保存调用函数的栈帧
信息,便于被调用函数执行完毕后还原调用函数栈帧信息.因此,为维护函数栈帧,以 call 方式调用的函数的开头
位置均为三字节的“pushl%ebp;movl%esp,%ebp”指令.由 Intel 手册可知:可陷入敏感指令 VMCALL 机器码为
“.byte 0x0f,0x01,0xc1”,长度也为三字节.基于此,VMOffset 通过指令替换来感知 TVM 的内核函数调用行为.为
了让不同的内核功能单元更好地协同工作,Linux 内核编译过程中会生成 System.map 文件存放内核符号表,其
中包含所有的全局内核项(函数及变量)的地址,可在表中查找符号名得到对应的符号地址.VMOffset 参考开源
项目 OpenCIT [25] ,在 TVM 外部挂载 TVM 镜像得到其内核符号表,随后从内核符号表中读取内核函数 do_fork()
及 release_task()的入口地址,传至陷入点初始化模块.如图 3 所示,该模块在 TVM 启动之前,在 VMM 层将上述
内核函数起始三字节的函数栈帧维护指令替换为 VMCALL 指令,该操作对 TVM 透明,无需在 TVM 中添加代
理模块.此后,TVM 中发生进程/线程创建及消亡的事件时,就会因 VMCALL 指令陷入至 VMM 中,VMM 中完成
获取进程偏移量的处理流程之后,模拟 TVM 中函数栈帧维护行为,之后返回 TVM 继续执行.待所需进程偏移量
全部获取完毕后,VMOffset 恢复对内核函数的修改,使其不再陷入,减少了对目标虚拟机的影响.
2.2 基于迭代的进程偏移量获取方法
VMOffset 拦截 TVM 中内核函数 do_fork()及 release_task()的调用事件后,以 TVM 的寄存器状态、内存状
态信息及相关约束条件为依据,基于迭代的方法进行进程偏移量的获取.首先定义相关实体如下.
XF Candi_init ={xf|xf 为初始状态下成员 X 的偏移量候选项};
XF Candi_prev ={xf|xf 为执行偏移量获取流程前成员 X 的偏移量候选项};
XF Candi_not ={xf|xf 为陷入时刻内存状态不满足成员 X 约束条件的偏移量候选项};
XF Candi_after ={xf|xf 为执行偏移量获取流程后成员 X 的偏移量候选项}.
根据上述定义,可知执行一次偏移量获取流程后,有:XF Candi_after =XF Candi_prev XF Candi_not .
基于上述定义及 VMOffset 设计思想,图 4 以伪代码的方式给出了 VMOffset 获取进程结构体某特定成员偏
移量的算法过程,其中部分变量及函数的说明见表 1.
Algorithm. get_member_offset.
Input: vcpu.esp, specific_size;
Output: member offset.
Phase-1: Get initial candi_offset_list
1. for candi_offset=0; candi_offset≤len(struct task_struct) do
2. candi_offset_list←list_add(candi_offset_list,candi_offset);
3. candi_offset←candi_offset+specific_size;
4. end for
5. do Phase-2: Filtrate to get the correct member_offset
6. ts_addr←get_ts_addr(vcpu.esp);
7. for each candi_offset in candi_offset_list do
8. offset_content←read_addr(ts_addr+candi_offset);
9. if check_condition(offset_content)=false then
10. candi_offset_list←list_del(candi_offset_list,candi_offset);
11. end for
12. while count_num(candi_offset_list)=1;
13. member_offset←get_member_from_list(candi_offset_list);
Fig.4 Process of acquiring process offset
图 4 进程偏移量获取过程