法律状态公告日
法律状态信息
法律状态
2019-01-15
授权
授权
2016-09-07
实质审查的生效 IPC(主分类):G06F9/455 申请日:20160302
实质审查的生效
2016-08-10
公开
公开
技术领域
本发明涉及的是一种在虚拟机管理器中动态无侵的应用进程函数调用监控方法,能够监控任何一个用户进程中任何一个函数的调用。监控行为是可以动态设置的,只有在管理者需要的时候才在被监控的应用程序的被调用函数中插入函数调用触发器,函数调用触发器插入后一旦需要被监控的函数被调用,则函数调用触发器触发异常、陷入虚拟机管理器;在应用程序中的函数不需要被监控时,这个函数的代码保持原样。因此,该监控方法是动态的和无侵的,属于计算机应用技术领域。
背景技术
现有的监控方法有的采用对注册的函数指针表进行修改,使得函数被调用的时候能跳转到监控函数处进行监控,这样的方法对没有注册的函数就无法监控;有的监控方法采用在函数调用处插入监控代码,这样的方法难以实现动态地进行配置,对应用程序要进行修改、编译等,不是无侵的。
在软件行为监控、软件测试中需要一种动态无侵的函数调用监控方法,本发明正是提供了这样一种方法。
发明内容
本发明提出的是一种在虚拟机管理器中动态无侵的应用进程函数调用监控方法,可在任何一个被监控函数的入口处开始寻找一个7字节或者9字节的位置,在这个位置根据这个位置原来的代码的情况选择长度分别为7字节
和9字节两种函数调用触发代码之一进行插入。
本发明的技术解决方案:在虚拟机管理器中动态无侵的应用进程函数调用监控方法,其特征是包括函数调用触发器插入算法、触发器代码的构造,在需要监控的时候,从被监控的应用程序的函数的入口地址开始处根据函数调用触发器插入算法选择的位置插入函数调用触发器代码,不需要监控时可以恢复原样,具有动态性和无侵性。
本发明的优点:
1)虚拟化机制用于触发器中的某些代码在具有硬件虚拟化机制的CPU上一定可以产生异常进而陷入虚拟机管理器中,不会被旁路;
2)动态无侵的监控方法可以只在管理者需要的时候才在被监控的应用程序的被调用函数中插入函数调用触发器。在应用程序中的函数不需要被监控时,这个函数的代码可以恢复到原样;
3)插入函数调用触发器后,一旦需要被监控的函数被调用,则触发器触发异常、陷入虚拟机管理器;在虚拟机管理器中进行分析与控制,具有更高的安全性;
4)函数调用触发器插入位置的选择是在被监控的函数的开始的一段代码中选择若干可以的被覆盖字节用于插入函数调用触发器,并且在虚拟机管理器中准确地模拟运行这些被覆盖的代码;
5)触发器代码的构造包括通常的产生陷入虚拟机管理器的代码和相关寄存器保存与恢复。这样可以保持应用程序的功能不收到任何影响,实现了无侵性;
6)可在任何一个被监控函数的入口处开始寻找一个7字节或者9字节的位置,在这个位置根据这个位置原来的代码的情况选择长度分别为7字节
和9字节两种函数调用触发代码之一进行插入。
具体实施方式
在虚拟机管理器中动态无侵的应用进程函数调用监控方法,包括函数调用触发器插入算法、触发器代码的构造,在需要监控的时候,从被监控的应用程序的函数的入口地址开始处根据函数调用触发器插入算法选择的位置插入函数调用触发器代码,不需要监控时可以恢复原样,具有动态性和无侵性。
在需要监控的时候,从被监控的应用程序的函数的入口地址开始处根据函数调用触发器插入算法选择的位置插入函数调用触发器代码,不需要监控时可以恢复原样,具有动态性和无侵性。
所述的函数调用触发器代码如下:
(1)如果在被监控的函数的入口代码到函数调用触发器代码插入点之前寄存器eax没有被改写,则触发器代码codeA为:
mov eax, constant;
cpuid
(2)在被监控的函数的入口代码到函数调用触发器代码插入点之前寄存器eax被改写,触发器代码codeB如下,其中register是从触发器插入点开始没有被改写过的一个通用寄存器:
mov register, eax
mov eax, constant
cpuid
mov eax, register 。
所述的函数调用触发器插入算法:
1)令插入点位置a=0,下一条被检查指令位置 b=0,检查通过的指令长度L=0,状态s=0,插入点之前被改写过的通用寄存器集合RW=∅,在插入点之前没有被该写过可以用来保存eax原来的值的通用寄存器集合R={ eax, ebx, ecx, edx, esi, edi };
2)在b处读取一条指令,设指令的长度为k,指令中的作为源操作数的通用寄存器的集合为rr,作为目的操作数的通用寄存器的集合为rw;L + k → L, b + k → b, RW ⋃ rw→RW;
3)如果rr ∩ R ≠⌽ 转VI
4)如果 L ≥ 7 并且 eax ∊ R,则令 s=1 转IX;
5)如果 L ≥ 9 则令 s=2 转IX;否则转II;
6)R ( rr ⋃ RW ) → R;
7)如果 R ≠⌽, 则转II;
8)L = 0, a = b, 转II;
9)如果s=1 则报警代码为代码序列codeA;如果s=2 则报警代码为代码序列codeB;报警代码插入位置a。
工作时,函数调用触发代码插入后,一旦这个函数被调用,函数调用触发代码就被执行,继而产生异常陷入虚拟机监控器,在虚拟机监控器中对函数被调用的情况进行分析与控制。同时,在返回前,为被监控的应用进程模拟执行被覆盖的相应的代码,使得应用进程在功能上与未被监控的情况完全一样。函数调用触发代码的插入可以进行动态地管理,在管理者发出监控命令时,执行函数调用触发代码插入算法,插入相应的函数调用触发代码。在管理者发出停止监控命令时,可以撤销插入的函数调用触发代码,被监控的函数的原样。
函数调用触发代码插入算法:
令插入点位置a=0,下一条被检查指令位置 b=0,检查通过的指令长度L=0,状态s=0,插入点之前被改写过的通用寄存器集合RW=∅,在插入点之前没有被该写过可以用来保存eax原来的值的通用寄存器集合R={ eax, ebx, ecx, edx, esi, edi };
在b处读取一条指令,设指令的长度为k,指令中的作为源操作数的通用寄存器的集合为rr,作为目的操作数的通用寄存器的集合为rw;L + k → L, b + k → b, RW ⋃ rw →RW;
如果rr ∩ R ≠ ⌽ 转VI
如果 L ≥ 7 并且 eax ∊ R,则令 s=1 转IX;
如果 L ≥ 9 则令 s=2 转IX;否则转II;
R ( rr ⋃ RW ) → R;
如果 R ≠ ⌽, 则转II;
L = 0, a = b, 转II;
如果s=1 则报警代码为代码序列codeA;如果s=2 则报警代码为代码序列codeB;报警代码插入位置a。
函数调用触发代码codeA:
mov eax, constant;
cupid
函数调用触发代码codeB:
mov register, eax
mov eax, constant
cupid
mov eax, register
机译: 静态绑定函数调用中的动态响应在动态绑定函数调用中而无需安排重组,重组
机译: 动态切换静态绑定的函数调用到动态绑定的函数调用,而无需重新复杂化
机译: 动态切换静态绑定的函数调用到动态绑定的函数调用,而无需重新复杂化