程序的监控方法及其防御方法以及相关装置
技术领域
本发明涉及计算机软件安全技术领域,具体而言,本发明涉及一种程序的监控方法及相关装置,以及一种程序的防御方法及相关装置。
背景技术
Android系统中的安全防御技术,通过以公知的方式向进程注入代码,劫持进程函数,以此类手段来实现对进程的监控和响应,现有技术主要是针对Android 4.4之前的版本中的Dalvik虚拟机技术而实现这种安全防御目的的。自Android 4.4之后,Android逐渐采用ART虚拟机代替Dalvik,这两者在技术上体现出一些差异。
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器码,这一机制称为Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
由于Dalvik与ART两种模式存在以上的区别,表现到内存空间,前者存在虚拟空间和真实空间之分,后者只有混合空间。因此,在ART模式下,企图通过传统的安全防御技术,来实现对程序进程所调用的函数的监控,将变得更加困难,尤其是对ART模式下的进程所施加的一些监控操作,将会改进其内存栈的结构,在栈上留下痕迹,导致内存访问出错。
更为关键的是,ART的垃圾回收机制也不同于Dalvik,前者只在虚拟空间回收内存垃圾,而后者在混合环境下的真实空间回收垃圾,如果未能考虑这一因素,无论是实现监控技术本身的内存数据,还是被监控进程自身的数据,在资源紧张时,均容易被ART的垃圾回收机制不当回收,导致进程崩溃。特别地,当Android 5.0版本之后,采用紧凑型内存回收机制,会对内存对象进行移动,如果未能跟踪这一变动,同样也会导致内存访问异常。
发明内容
本发明的目的旨在解决上述至少一个问题,提供一种程序的监控方法及相关装置,用于监控Android 5.0版本的应用程序函数;相应的,还提供一种程序的防御方法及相关装置。
本发明提供一种程序的监控方法,包括以下步骤:
定位目标函数所执行的机器码;
写入跳转指令对目标函数进行挂钩;
分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收;
是否继续处理hook后的目标函数;
若不处理,则跳回目标函数的挂钩处;
若处理则不跳回,对目标函数执行相应处理。
具体的,所述挂钩操作采用inline hook的方式。
具体的,所述跳转指令具体为ARM指令。
具体的,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调用Java函数和Java函数调用Native函数两种情况。
一种程序的监控装置,其特征在于,包括:
挂钩模块:用于定位目标函数所执行的机器码;
跳转模块:用于写入跳转指令对目标函数进行挂钩;
分发模块:用于分发hook函数给已注册的Java回调函数,并防止创建的临时变量被垃圾回收机制回收;
判断模块:用于判断是否处理hook后的目标函数;
跳回模块:用于跳回目标函数的挂钩处;
处理模块:用于对目标函数执行相应处理操作。
具体的,所述挂钩模块采用inline hook的方式。
具体的,所述跳转模块执行的跳转指令为ARM指令。
具体的,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调用Java函数和Java函数调用Native函数两种情况。
一种程序的防御方法,包括以下步骤:
向系统的服务进程注入so文件;
监控系统中应用程序的事件行为;
响应服务进程的指令,处理所述应用程序进程的事件行为,其中,所上述监控的步骤采用上述程序的监控方法执行。
一种程序的防御装置,包括:
注入模块:用于向系统的服务进程注入so文件;
监控模块:用于监控系统中应用程序的事件行为;
响应模块:用于响应服务进程的指令,处理所述应用程序进程的事件行为,
其中,所述监控模块用于执行上述程序的监控方法。
相比现有技术,本发明的方案具有以下优点:
1.提供一种程序的监控方法,通过内联hook将ARM指令集的跳转指令写入目标函数的机器码,实现对ART模式下的Android的任意Java函数的hook。
2.本发明提供的一种程序的监控方法中,分发hook函数给已注册的Java回调函数,并防止创建的临时变量被垃圾回收机制回收。对垃圾回收机制的规避,防止临时变量被回收包括两种情况,分别为Java调Java的垃圾回收机制和Java调Native的垃圾回收机制。这样不仅可以避免Java层调Java层时创建的临时变量被标记,不被回收,也可以避免Java层调Native层时创建的临时变量被标记,不被回收。同时,也可以使ART的垃圾回收机制顺利完成垃圾对象内存的回收。
3.提供一种程序的防御方法,通过采用本发明所述一种ART模式下的函数监控方法实现在ART模式下的防御机制,对ART模式下的Android系统Java层函数进行监控,不同于现有技术的只在JNI层通信时对有限的一些目标函数进行拦截的方法,直接在Java层hook可以很容易找到要拦截的目标函数,并且可以实现对任意行为的目标函数进行拦截。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为一种程序的监控方法的流程示意图;
图2为一种程序的监控装置的原理框图;
图3为一种程序的防御方法的流程示意图;
图4为一种程序的防御装置的原理框图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本技术领域技术人员可以理解,这里所使用的“终端”、“终端设备”既包括无线信号接收器的设备,其仅具备无发射能力的无线信号接收器的设备,又包括接收和发射硬件的设备,其具有能够在双向通信链路上,执行双向通信的接收和发射硬件的设备。这种设备可以包括:蜂窝或其他通信设备,其具有单线路显示器或多线路显示器或没有多线路显示器的蜂窝或其他通信设备;PCS(Personal Communications Service,个人通信系统),其可以组合语音、数据处理、传真和/或数据通信能力;PDA(Personal Digital Assistant,个人数字助理),其可以包括射频接收器、寻呼机、互联网/内联网访问、网络浏览器、记事本、日历和/或GPS(Global Positioning System,全球定位系统)接收器;常规膝上型和/或掌上型计算机或其他设备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算机或其他设备。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频播放终端,例如可以是PDA、MID(Mobile Internet Device,移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶盒等设备。
本技术领域技术人员可以理解,这里所使用的远端网络设备,其包括但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云。在此,云由基于云计算(Cloud Computing)的大量计算机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。本发明的实施例中,远端网络设备、终端设备与WNS服务器之间可通过任何通信方式实现通信,包括但不限于,基于3GPP、LTE、WIMAX的移动通信、基于TCP/IP、UDP协议的计算机网络通信以及基于蓝牙、红外传输标准的近距无线传输方式。
Android有三种运行模式,包括:
1、JNI:在开发过程中使用编译器将C/C++等语言直接编译成机器码,运行的时候能够充分利用系统性能,这是最快的;
2、Dalvik:Android L系统之前所有Android版本的运行方式,采用的是字节码,在运行的时候解释执行变成机器能够识别的机器码,这个过程比较缓慢;
3、ART:Android4.4开始推出的新运行环境,在app安装时使用dex2oat工具直接把DEX文件转换为机器码文件,运行的时候以机器码方式运行,可以充分利用系统性能,此外,改进的内存回收机制使得ART运行模式下的内存回收速度只有Dalvik运行时模式下的50%,也能够提升系统运行速度。
Andriod系统架构按照编程语言的不同,可以称为Java层,Native层和Linuxkernel层。Java层的恶意软件或安全软件,都采用Java语言开发,而恶意软件可以通过向系统注册一些事件,在用户不知情的情况下进行偷发短信、窃取通话等行为,而Java层的开发使用的是Andriod SDK,拥有的权限有限,且Java语言不能直接访问内存,使得Java层安全软件的主动防御行为变得困难。
现有技术的监控方法一般只适用于Dalvik模式的Andriod系统,不适用于ART模式的Android5.0,个别监控方法也只能监控ART模式的JNI层,由于JNI层的hook需要找到JNI层的函数,导致hook点很难找,且只能hook一部分函数,不能hook任意行为的函数。本发明提供一种程序的监控方法,不仅可以用于native层的函数hook,还可以实现Java层任意行为函数的hook,具体实施例如下:
S11、定位目标函数所执行的机器码
ART运行时执行的是翻译DEX字节码后得到的机器码指令,所以ART的核心是OAT文件,OAT文件是一种Android私有ELF文件格式,包含从以前Dalvik的DEX文件翻译过来的机器码指令,但是由于ART运行时提供了Java虚拟机接口,而实现Java虚拟机接口不得不依赖于DEX文件,所以OAT文件又包含原始的DEX文件内容。ART运行时内部会用两个不同的术语描述类和方法,其中类描述为Class,类方法描述为Method。
每一个Java函数都对应一个Method结构体,该结构体成员变量包括方法所在的类对象指针、方法的属性、方法在dex文件中的index,方法的机器码指针以及方法native代码的指针等,在Native层调用Java函数得到目标函数的Method结构体,结构体成员变量constvoid*entry_point_from_compiled_code,指向目标函数执行的机器码地址,通过该成员变量记录的地址找到目标函数执行的机器码。由于Android系统的版本差异,该成员变量在结构体Method中的位置不确定,要通过动态探测获取。
S12、写入跳转指令对目标函数进行挂钩
在具体实现中,本发明所述机器码为由ART编译后的二进制码,所述挂钩操作为内联挂钩inline hook操作。针对监控的目标函数的机器码进行内联hook。Inline hook不同于以前通过修改函数的调用地址的普通hook,是直接在目标函数的函数体内修改指令,用一个跳转指令实现挂钩的目的。
ARM为32位指令集,被hook的目标函数被编译为ARM指令集的,写入目标函数跳转指令,使目标函数跳转到自定义的hook函数,具体实施方式如下:
先将自定义的hook函数和被hook的目标函数的地址保存下来;
生成挂钩的代码,具体为12个字节,将自定义的hook函数地址加载入PC寄存器;
将跳转指令写入目标函数的前12个字节。
当要调用被hook的目标函数时,执行跳转指令跳转到自定义的hook函数。
找到目标函数执行的机器码后,采用内联hook(inline hook)方式对其进行挂钩,在其开头的12个字节内写入跳转指令,跳转指令采用arm指令,具体为MOV PC,LR,其中:
当目标函数执行到该指令时就跳转到我们自定义的hook函数中,同时保存目标函数调用的函数上下文,即保存其调用函数的内存地址。
其中PC为当前的地址,LR为要跳转的地址,将LR传给PC,PC寄存器存储下一条要执行的指令地址,指示下一条要执行的指令,即实现跳转。
此外,在写入跳转指令之前要先检查是否可写,如果不可写要改成可写状态;并且要判断目标函数是否已经被hook过,被hook过的函数不再进行hook。
S13、分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收
目前的ART实现了两种垃圾回收(Garbage Collection)技术,一种是Mark-Sweep,另一种是Semi-Space。基本思想是,将所有对象在内存的位置记录在位图A中,从所有对象的根出发,扫描根对象的所有引用,扫描对象的所有引用的引用,一层层通过栈的结构进行逐层遍历,直至叶子节点的对象。并且在扫描的过程中,将涉及到的对象位置记录在位图B中。扫描结束后,对比两张位图A和B,所有A中标记为1,B中标记为0的对象被视为垃圾,并根据位图中的索引检索得到该对象,释放该对象占用的内存。同时,“Large Object Space”(大对象空间)被引入ART垃圾回收机制,用于处理应用程序内存中的大对象,比如图片。这些大的对象会使堆变得碎片化,产生严重问题,而智能的内存分配方案可以减少碎片化程度,使GC的调用频率大幅减少。ART中还有一个moving collector用来压缩活动对象,对内存空间进行整理,使内存空间更加紧凑,从而使得GC的整体性能有巨大提升。
ART垃圾回收机制减轻了以前垃圾回收的很多负担,执行过程中不再需要暂停,而标记过程也通过两次标记尽可能在暂停其他线程之前完成标记,从而使暂停只需在一个简单的检查与校验中完成。
通过inline hook的方式将目标函数的流程引入自定义的hook函数,需要获取目标函数的参数,第一个参数是方法指针;第二个参数可能是第一个参数,也可能是类指针,当为静态方法时就是第一个指针;当为类方法时就是类指针,依次找到目标函数的所有参数,通过这些参数得到函数的方法信息,从而作进一步处理。
Java应用程序在拦截目标函数通过向自定义的hook函数注册一个回调函数,由hook函数进行分发,调用各Java的回调函数,从而把拦截的目标函数信息传递给Java应用程序。在该过程中,当ART出现内存不足的情况时就会进行垃圾回收,或者申请的内存达到一定限度,或者程序主动要求GC时,都会启动垃圾回收线程,释放垃圾对象的内存。
由于hook导致栈帧增长,垃圾回收机制通过栈结构寻找临时变量,并回收未标记的对象,所以需要防止hook后调用的函数的临时变量被回收。本发明主要针对以下两种情况采取相应措施:
1.Java函数调Java函数
Java函数调用栈中的每层栈都对应一个Method指针,即被调用函数的Method结构体,通过该结构体可以计算获得当前层的栈高,并且标记Method结构体中记录的临时变量个数。根据当前层的栈高和栈帧得到上一层被调用函数的Method结构体,并标记其中的临时变量,依此方法继续找下一个函数的调用并依次标记其临时变量,最终标记完所有被压栈的被调用函数的临时变量,从而避免这些临时变量被回收。
2.Java函数调Native函数
如果Java层的函数调用了Native层的函数,则栈是Native层函数的栈,由于Native层的编译器不同于Java层的ART编译器,从而无法知道Native层的函数用了多少栈,此时的栈高也无法知道,也就是说此时的Method指针为空。为了获取栈高,采用链表的方法,ART垃圾回收机制会自动查找结构体ManagerStack,其中的一个成员变量为指针,指向链表的首地址,链表指向下一个Method,再由该Method记录的栈高得到临时变量的个数,并标记这些临时变量,防止被垃圾回收机制回收。
此外,Android5.0的垃圾回收机制有紧凑型内存回收机制,会做内存整理,移动对象的内存,防止过多的内存碎片产生。这就导致当我们创建了一个对象,长时间占用该对象的指针,而该对象被GC做内存整理移动到其他地方,在Native使用该对象时已经被移动了,则该对象的指针所指向的内存对象已经不是该对象了,所以本发明采用如下方法规避此问题:
1.将hook函数创建的Java对象转成JNI对象
将Java类型的对象转成JNI类型的对象,也就是将进行hook时需要保存的hook函数上下调用关系的一个变量转换成JNI对象。
2.将JNI对象传递给ART的接口函数进行解码
ART的接口函数DecodeJObject(jobject obj)可以将JNI对象进行解码,得到Java对象。所述接口函数代码如下:
3.解码后获取JNI对象引用的hook函数创建的原Java对象
JNI对象只是对Java对象的引用,通过解码得到的Java对象才是真正的原Java对象。将解码得到的Java原对象赋给相应的变量。
S14、是否继续处理hook后的目标函数
S15、若不处理,则跳回目标函数的挂钩处
如果通过Java回调函数获取到目标函数的信息后,不对目标函数作任何处理,将之前的hook函数保存的被hook的目标函数的跳转地址写回PC寄存器,则目标函数会继续执行被覆盖的原代码。同时,将已标记的hook函数的临时变量转换成为未标记状态,由垃圾回收线程自动回收。
S16、若处理则不跳回,对目标函数执行相应处理
相应地,本发明还提供一种程序的监控装置,包括挂钩模块11、跳转模块12、分发模块13、判断模块14、跳回模块15及处理模块16。其中,
挂钩模块11用于定位目标函数所执行的机器码。在Native层调用一些Java函数得到目标函数的Method结构体,结构体有个成员变量,指向目标函数执行的机器码。通过该成员变量记录的地址找到目标函数执行的机器码。
跳转模块12用于写入跳转指令对目标函数进行挂钩。ARM为32位指令集,被hook的目标函数被编译为ARM指令集的,写入目标函数跳转指令,使目标函数跳转到自定义的hook函数,具体实施方式如下:
先将自定义的hook函数和被hook的目标函数的地址保存下来;
生成挂钩的代码,具体为12个字节,将自定义的hook函数地址加载入PC寄存器;
将跳转指令写入目标函数的前12个字节。
当要调用被hook的目标函数时,执行跳转指令跳转到自定义的hook函数。
找到目标函数执行的机器码后,采用内联hook(inline hook)方式对其进行挂钩,在其开头的12个字节内写入跳转指令,跳转指令采用arm指令,具体为MOV PC,LR,其中;
当目标函数执行到该指令时就跳转到我们自定义的hook函数中,同时保存目标函数调用的函数上下文,即保存其调用函数的内存地址。
其中PC为当前的地址,LR为要跳转的地址,将LR传给PC,PC寄存器存储下一条要执行的指令地址,指示下一条要执行的指令,即实现跳转。
此外,在写入跳转指令之前要先检查是否可写,如果不可写要改成可写状态;并且要判断目标函数是否已经被hook过,被hook过的函数不再进行hook。
分发模块13用于分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收。具体过程为:
通过inline hook的方式将目标函数的流程引入自定义的hook函数,需要获取目标函数的参数,第一个参数是方法指针;第二个参数可能是第一个参数,也可能是类指针,当为静态方法时就是第一个指针;当为类方法时就是类指针,依次找到目标函数的所有参数,通过这些参数得到函数的方法信息,从而作进一步处理。
Java应用程序在拦截目标函数通过向自定义的hook函数注册一个回调函数,由hook函数进行分发,调用各Java的回调函数,从而把拦截的目标函数信息传递给Java应用程序。在该过程中,当ART出现内存不足的情况时就会进行垃圾回收,此时启动垃圾回收线程,释放垃圾对象的内存。
由于hook导致栈帧增长,垃圾回收机制通过栈结构寻找临时变量,并回收未标记的对象,所以需要防止hook后调用的函数的临时变量被回收。本发明主要针对以下两种情况采取相应措施:
1.Java函数调Java函数
Java函数的每层栈都对应一个Method指针,该指针中记录该层的栈高,根据记录的栈高可知临时变量的个数,标记这些临时变量,从而避免这些临时变量被回收。
2.Java函数调Native函数
如果Java层的函数调用了Native层的函数,则栈是Native层函数的栈,由于Native层的编译器不同于Java层的ART编译器,从而无法知道Native层的函数用了多少栈,此时的栈高也无法知道,也就是说此时的Method指针为空。为了获取栈高,采用链表的方法,ART垃圾回收机制会自动查找结构体ManagerStack,其中的一个成员变量为指针,指向链表的首地址,链表指向下一个Method,再由该Method记录的栈高得到临时变量的个数,并标记这些临时变量,防止被垃圾回收机制回收。
判断模块14用于确定是否处理hook后的目标函数。
跳回模块15用于跳回目标函数的挂钩处。如果通过Java回调函数获取到目标函数的信息后,不对目标函数作任何处理,将之前的hook()函数保存的被hook的目标函数的跳转地址写回PC寄存器,则目标函数会继续执行被覆盖的原代码。同时,将已标记的hook函数的临时变量转换成未标记状态,由垃圾回收线程自动回收。
处理模块16用于对目标函数执行相应处理。
本发明提供一种程序的防御方法,具体实施方式为:
S11、向系统的服务进程注入so文件
so注入就是从一个进程向另一个进程注入一个so文件,通过该so文件实现函数的拦截功能。具体操作过程为:
步骤1:ptrace_attach到目标进程,让目标进程发生ptrace_syscall时停止;
步骤2:ptrace_getregs保存目标进程的上下文,即目标进程的寄存器状态;
步骤3:ptrace_setregs改写目标进程的PC寄存器,使得它指向函数mmap的地址;
步骤4:ptrace_cont让目标进程恢复执行,此时会执行函数mmap;
步骤5:ptrace_getregs获得目标进程的R0寄存器值,即为函数mmap的返回值,指向目标进程地址空间分配的一块内存;
步骤6:ptrace_poketext往目标进程分配地址写入要注入的代码。
步骤7:ptrace_setregs改写目标进程的PC寄存器,使得它指向上述注入代码的起始地址;
步骤8:ptrace_detach目标进程,目标进程恢复执行后,就会执行注入;
S12、监控系统中应用程序的事件行为
当监控到系统中应用程序的某些事件行为,如读取联系人、发送短信、读取照片等时间行为时,对其进行拦截,提取应用程序特征信息,例如UID、包名等信息。
本实施例所述监控过程是基于ART模式的Android系统,具体监控步骤由上述ART模式下的函数监控方法执行,通过hook应用程序的相应事件行为对应的函数,获取其特征信息。在此过程中,由于ART虚拟机的编译器不同于Linux内核的编译器,所以要同时做好内存管理,以免影响ART虚拟机中的GC机制。
S13、响应服务进程的指令,处理所述应用程序进程的事件行为
基于上述步骤获取的特征信息,从本地或远程已知设置数据(例如存储于本地的或远程的数据库中)中检验该特征信息所对应的应用程序的事件行为是否应被限制或被禁止,当其为应被限制或应被禁止的应用程序时,由系统服务进程发出指令,监控模块响应并对其进行处理。该已知设置数据可以存储各个UID与是否被限制或被禁止的信息之间的映射关系。这一处理过程,能够提供更安全有效的监控效果,通过配置所述的已知设置数据,尤其在该已知设置数据能够得到及时的远程的更新时,可以借助这类数据来及时阻止移动终端的恶意应用程序的运行。
相应地,本发明还提供一种程序的防御装置,包括注入模块11、监控模块12、响应模块13。其中,
注入模块11用于向系统的服务进程注入so文件,具体操作过程为:
步骤1:ptrace_attach到目标进程,让目标进程发生ptrace_syscall时停止;
步骤2:ptrace_getregs保存目标进程的上下文,即目标进程的寄存器状态;
步骤3:ptrace_setregs改写目标进程的PC寄存器,使得它指向函数mmap的地址;
步骤4:ptrace_cont让目标进程恢复执行,此时会执行函数mmap;
步骤5:ptrace_getregs获得目标进程的R0寄存器值,即为函数mmap的返回值,指向目标进程地址空间分配的一块内存;
步骤6:ptrace_poketext往目标进程分配地址写入要注入的代码。
步骤7:ptrace_setregs改写目标进程的PC寄存器,使得它指向上述注入代码的起始地址;
步骤8:ptrace_detach目标进程,目标进程恢复执行后,就会执行注入;
监控模块12用于监控系统中应用程序的事件行为。当监控到系统中应用程序的某些事件行为,如读取联系人、发送短信、读取照片等时间行为时,对其进行拦截,提取应用程序特征信息,例如UID、包名等信息。
本实施例所述监控过程是基于ART模式的Android系统,具体监控步骤由上述ART模式下的函数监控方法执行,通过hook应用程序相应的事件行为对应的函数,获取其特征信息。在此过程中,由于ART虚拟机的编译器不同于Linux内核的编译器,所以要同时做好内存管理,以免影响ART虚拟机中的GC机制。
响应模块13用于响应服务进程的指令,处理所述应用程序进程的事件行为。基于上述步骤获取的特征信息,从本地或远程已知设置数据(例如存储于本地的或远程的数据库中)中检验该特征信息所对应的应用程序的事件行为是否应被限制或被禁止,当其为应被限制或应被禁止的应用程序时,由系统服务进程发出指令,监控模块响应并对其进行处理。该已知设置数据可以存储各个UID与是否被限制或被禁止的信息之间的映射关系。这一处理过程,能够提供更安全有效的监控效果,通过配置所述的已知设置数据,尤其在该已知设置数据能够得到及时的远程的更新时,可以借助这类数据来及时阻止移动终端的恶意应用程序的运行。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。