Page 324 - 《软件学报》2021年第10期
P. 324
3296 Journal of Software 软件学报 Vol.32, No.10, October 2021
在该种语义重构方法中,不同于多数 VMI 工具需依赖 TVM 本身或内核源码等得到进程偏移量,VMOffset
可屏蔽 TVM 内核版本的差异性,实现在 TVM 外部对 TVM 中进程偏移量的自动获取,并基于此完成 TVM 进程
级语义的重构.VMOffset 基于公式(1)及公式(2)设计实现:
MemAddr tsA TaskAddr tsA =MemAddr tsB TaskAddr tsB ,A,BProlist (1)
MemberConditionSet,MemberTask_Struct (2)
如公式(1)所示,其中,Prolist 为进程链表,A、B 表示进程链表中的任意进程实例,MemAddr tsA 与 MemAddr tsB
分别表示 A 和 B 进程描述符中某相同成员的地址,TaskAddr tsA 、TaskAddr tsB 则分别为 A、B 进程描述符的起始
地址.由公式(1)可知:对 TVM 进程链表中的任意不同进程实例而言,进程描述符 task_struct 结构体某一成员的
地址相对于进程描述符首地址的偏移量是不变的,即,进程偏移量对各个进程实例而言是相同的.
如公式(2)所示,其中,Task_Struct 为进程描述符,Member 表示进程描述符中的某个成员,ConditionSet 为特定
约束条件的集合.因进程描述符中各个成员均有其特定于自身的意义,因此会满足基于其自身属性的相关约束
条件.如 pid 作为各个进程的进程号,具有标识进程的作用,因此各个进程的 pid 均唯一,即:pid 成员需满足对不同
进程实例而言,其值必须不同的约束条件.
VMOffset 基于上述思想完成 TVM 进程偏移量的自动获取,其总体架构如图 2 所示.
进程/线程 … 开
源
② 创建/消亡 /
Guest user
sysenter 自
研
内核线程 … VMI
② 创建/消亡 应
用
⑤
内核函数 Guest 程
kernel 序
③ 陷入
① 拦截函数调用 ⑥
④
陷入点初始化模块 进程偏移量获取模块 恢复模块
约束条件
VMM and Host Kernel
Fig.2 Overall architecture of VMOffset
图 2 VMOffset 总体架构
图 2 中 VMOffset 各个模块的功能与总体流程如下.
(1) 陷入点初始化模块:该模块在 VMM 中透明修改 TVM 中特定内核函数的指令代码,拦截 TVM 中特定
内核函数调用,以监控 TVM 中进程/线程的创建及消亡事件,使其能够产生 VM-EXIT 陷入至 VMM 中,
以此触发后续获取进程偏移量的相关流程;
(2) 进程偏移量获取模块:该模块基于陷入点,在 VMM 中获取指定监控事件发生后 TVM 的寄存器状态及
内存状态等信息,依照公式(2),结合基于成员自身属性制定的约束条件获取进程偏移量.由公式(1)可
知:对不同进程实例而言,其相同成员的偏移量是不变的.因此,TVM 中不同进程实例因产生特定监控
事件触发 VM-EXIT 陷入 VMM 时,均可执行相同的流程以获取进程偏移量.该模块获取偏移量的进程
结构体成员包括:可表示进程基本信息的 pid、comm,用于遍历进程链表的 tasks,用于管理进程内存信
息的 mm,用于查找进程页表访问进程指定地址内容的 mm.pgd 以及可用于获取进程代码段内容的
mm.start_code 及 mm.end_code;
(3) 恢复模块:因获取偏移量的各个成员属性不同,各自依赖的约束条件也不尽相同,因此,并非某一次操
作即可获取全部所需进程偏移量.故对于每次 VM-EXIT,完成进程偏移量获取模块的相关操作后,恢