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,BProlist  (1)
                                          MemberConditionSet,MemberTask_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,完成进程偏移量获取模块的相关操作后,恢
   319   320   321   322   323   324   325   326   327   328   329