一种对动态加载的应用程序进行监控的方法及装置与流程

文档序号:12734561阅读:331来源:国知局
一种对动态加载的应用程序进行监控的方法及装置与流程

本发明涉及计算机技术领域,特别是涉及一种对动态加载的应用程序进行监控的方法及装置。



背景技术:

Linux系统是一个可定制、裁剪的操作系统,为了灵活使用该操作系统,Linux设置了不同的用户权限,用于控制不同用户对该操作系统上的资源访问权限。安卓系统是运行在Linux内核上的,安卓(Android)与Linux分别有自己的一套严格的安全及权限机制。例如,对于安卓系统来说,最高权限Root可以访问系统的资源、删除和安装应用程序。随着基于安卓系统的软件和应用的逐渐增多,滥用安卓系统权限的软件越来越多,例如,有些恶意软件在获取了安卓系统的ROOT权限后,经常有恶意扣费、获取隐私、联网下载插件等看似正常的行为。然而,权限框架下,安卓系统的安全机制没办法防御类似上述的行为。

为了实现对待监控应用程序进行安全监控,现有技术中常见的做法是:安装监控软件,并为该监控软件获取安卓的ROOT权限,在权限框架下,由监控软件对待监控应用程序进行监控。然而,随着Android系统的不断演进,Root权限越来越难以获得,使得通过开发监控软件来监控待监控应用程序的周期变得越来越长,并且不可控;并且,现有技术中的监控软件无法实现对未安装的待监控应用程序的监控。



技术实现要素:

本发明所要解决的技术问题是:提供一种对动态加载的应用程序进行监控的方法,解决不需要获取最高级别用户权限就可以实现对尚未安装的待监控应用程序监控的问题。

为了解决上述问题,本发明实施例提供了一种对动态加载的应用程序进行监控的方法,包括:

在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;

解析所述安装包的配置文件;

根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;

在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求。

其中,所述预装的宿主应用程序包括免ROOT沙箱程序。

具体实施时,所述根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码包括:解析所述配置文件获得各组件入口;利用反射机制获取各组件发送资源访问请求的类,并注册该类的钩子函数;

其中,所述钩子函数在预设的监控代码中实现,用于当判断所述资源访问请求为受限请求时,重定向所述资源访问请求。

进一步地,所述在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,包括:在所述宿主应用程序内构建各组件的运行环境;在所述运行环境下加载并运行各所述组件。

进一步地,所述在所述宿主应用程序内构建各组件的运行环境包括:构造所述待监控应用程序运行所需的资源环境,以在启动各所述组件时调取相应的资源;构造类加载器,以加载各所述组件中的相应加载类;构造主线程,以使所述执行各所述组件的启动操作;分别为各所述组件构造一个加载安卓安装包对象。

所述在所述运行环境下加载并运行所述各组件进一步包括:若加载的所述组件为活动组件、广播接收者组件或服务组件,则在应用程序管理服务进行查验之前,将所述组件修改为所述宿主应用程序中的对应组件,并在应用程序管理服务根据所述宿主应用程序中的对应组件进行查验通过后,再次加载并调用所述组件;若加载的所述组件为内容提供者组件,则通过反射机制调用所述内容提供者组件。

在本发明的一个实施例中,监控代码监控各组件发出的资源访问请求的 操作具体为:监控代码当根据预设规则判断各组件发送的资源访问请求为受限请求时,重定向所述资源访问请求至安全请求。

在本发明的另一实施例中,所述方法还包括:建立资源访问请求的重定向索引表;

监控代码监控各组件发出的资源访问请求的操作具体为:所述监控代码缓存各组件发出的资源访问请求;分析所述资源访问请求,并根据分析结果更新预先建立的资源访问请求的重定向索引表;当所述监控代码根据预设规则判断各组件发送的资源访问请求为受限请求时,根据所述重定向索引表重定向所述资源访问请求。

相应的,本发明还公开了一种对动态加载的应用程序进行监控的装置,包括:

获取安装包模块,用于在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;

解析配置文件模块,用于解析所述安装包的配置文件;

监控指令植入模块,用于根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;

监控模块,用于在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求。

所述监控指令植入模块进一步包括:

获取组件子模块,用于解析所述配置文件获得各组件入口;

注册监控代码子模块,利用反射机制获取各组件发送资源访问请求的类,并注册该类的钩子函数;

其中,所述钩子函数在预设的监控代码中实现,用于当判断所述资源访问请求为受限请求时,重定向所述资源访问请求。

本发明的实施例通过在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;解析所述安装包的配置文件,并根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;然后在所述宿主应用程序内分别加载并运行注册有监控代 码的各所述组件,由所述监控代码监控各组件发出的资源访问请求,不需要获取ROOT权限,仅需要安装一个宿主应用程序,有效地实现了尚未安装的待监控应用程序的监控。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明对动态加载的应用程序进行监控的方法一个实施例的流程图;

图2是本发明对动态加载的应用程序进行监控的方法另一实施例的流程图;

图3是本发明对动态加载的应用程序进行监控的装置一个实施例的结构示意图;

图4是本发明对动态加载的应用程序进行监控的装置另一实施例的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本实施例提供的所述方法的宿主应用程序是可以安装在安卓设备上应用程序,例如免ROOT沙箱应用程序(以下简称沙箱程序)、或者一个简化虚拟机程序、或者一个程序加载器。本实施例一面ROOT沙箱程序为例进行说明。用户通过免ROOT沙箱程序运行未安装的待监控应用软件,该沙箱程序为未安装的应用程序安装包提供了一个运行的环境,以实现应用程序的 免安装。并且,所述宿主应用程序为所述待监控应用程序创建运行环境。

下面通过具体实施例来进一步说明本发明的对动态加载的应用程序进行监控的方法。如图1所示,所述方法包括:

步骤110,在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;

步骤120,解析所述安装包的配置文件;

步骤130,根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;

步骤140,在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求。

具体实施时,所述预装的宿主应用程序包括免ROOT沙箱程序。

安卓系统应用程序的APK安装包全名称是Android application package,它包含了应用的二进制代码、资源、配置文件等。每一个安装到Android系统上的应用程序都会被编译打包为一个单独的文件,后缀名为.apk。但APK文件其实就是Zip格式,因此上述步骤110中,一方面可以通过解压技术释放所述待监控应用程序安装包的内部文件,另一方面还可通过Apktool之类的工具软件获取其内部文件。

下面简单介绍安卓系统应用程序的安装包的目录结构。

Assets\——该目录存放的是额外资源和配置文件,如txt或html说明文档、字体文件和图片资源等,此类资源文件不能被赋予ID,但可用路径访问。

Lib\——该目录般在armeabi子文件夹中存放一些so文件,例如libnative-audio-jni.so文件等。

Res\——该目录存放的是图片资源和界面的布局文件。drawable和drawable其他分辨率目录存放的是各种不同分辨率的图片资源;layout、menu、xml目录存放的是软件界面的布局文件,包括菜单、窗口、主界面和设置界面等。

resources.arsc——二进制的资源索引表。

META-INF\——该目录存放的就是签名后的证书,用于保护APK包的完整 性和系统的安全。该目录下一般有MANIFEST.MF和以.RSA、.SF结尾的文件,这些文件记录了其它目录文件的证书签名,Android系统在安装APK安装包的时候会逐个检查APK内部各文件是否与本目录记录的证书签名一致,如果不一致,则认为文件已被篡改,拒绝该APK的安装和运行。

AndroidManifest.xml——对本APK所包含的Android应用程序的全局描述文件,如应用的包名、版本号、模块入口等;该文件还记录了所需要的权限、引用的库文件、类等信息。

classes.dex——该文件是Java源码编译后生成的Java字节码文件,是虚拟机可执行文件。

获取待监控应用程序的安装包并解压后,每一个Android项目都包含一个配置文件,名称为AndroidManifest.xml,它存储在项目层次中的最底层。

上述步骤140中,首先,根据所述配置文件获得各组件的入口。配置文件可以定义应用程序及其组件的结构和元数据,它包含了组成应用程序的每一个组件的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的。其中,组件分为四种类型,这四种类型分别为:活动(Activity)组件、广播接收者(Broadcast Receiver)组件、服务Service组件和Content Provider组件。不是所有的应用程序都必须包含所有这四种类型的组件,有的应用程序可能由上述一种组件或多种组件组建。各组件都需要注册才能使用,即每一个组件都需要在配置文件AndroidManifest.xml中进行配置。因此,应用程序安装包的配置文件AndroidManifest.xml中有列出应用程序所包含的所有组件。通过查找AndroidManifest.xml中的组件的入口,提取应用程序可能使用的资源访问接口。

然后,对各所述组件的入口注册预设的监控代码。分析classes.dex文件,查找上述组件如后对应的类,对每一个类注册钩子函数。具体实施时,所述根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码包括:解析所述配置文件获得各组件入口;利用反射机制获取各组件发送资源访问请求的类,并注册该类的钩子函数;其中,所述钩子函数在预 设的监控代码中实现,用于当判断所述资源访问请求为受限请求时,重定向所述资源访问请求。

术语“钩子”涵盖了用于通过拦截在软件组件之间传递的函数调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称为钩子函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们,或者拦截系统调用、或者系统函数行为、函数执行结果等,以监视或修改应用程序或其他组件的功能等等。本实施例采用钩子函数接管所述待监控应用程序的各组件调用资源访问接口的指令,用于监控应用程序的资源访问行为。具体实施时,为资源访问接口类设置钩子函数用于读取获得各组件发送的资源访问请求,并在该资源访问请求为受限资源访问请求时,对所述资源访问请求进行重定向,根据资源访问请求重定向表将首先请求定向至安全请求。其中,受限资源访问请求可以是根据应用程序的权限确定的系统访问请求,也可以是根据配置文件确定的受限访问请求,本发明对此不作限定。

所述钩子函数在预设的监控代码中实现,用于当判断所述资源访问请求为受限请求时,重定向所述资源访问请求。预设的监控代码以库函数的形式设置在宿主应用程序内。

获得了待加载和运行的资源、代码之后,上述步骤140中,在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求。由于待监控应用程序尚未安装,不能直接在系统环境下运行,因此,宿主应用程序需要为其构建一个运行环境,使其得以运行。具体实施时,所述宿主应用程序在自身环境内构建待监控应用程序各组件的运行环境;在所述运行环境下加载并运行各所述组件。

所述在所述宿主应用程序内构建各组件的运行环境进一步包括:构造主线程,以使所述执行各所述组件的启动操作;构造类加载器,以加载各所述组件中的相应加载类;构造所述待监控应用程序运行所需的资源环境,以在启动各所述组件时调取相应的资源;分别为各所述组件构造一个加载安卓安 装包对象。

一个应用程序的运行只有一个主线程ActivityThread,ActivityThread对象描述的是当前正在运行的应用程序线程。因此,本实施例提供的所述方法,需构建出所述待监控应用程序的ActivityThread,以使所述Activity Thread执行各所述组件的启动操作。具体实施时,宿主应用程序可以创建一个线程池,为不同的待监控应用程序分配主线程。所述宿主应用程序也可以创建隶属于自身主线程的子线程,作为所述第三方应用的主线程。

安卓系统通过一个称为Asset Manager资源管理器来读取打包在APK文件里面的资源文件。在构造所述待监控应用程序运行所需的资源环境时,对资源Resources类的构造函数中的成员变量massets进行修改,以在启动各所述组件时通过所述massets来调取相应的资源;和/或对资源管理器Asset Manager中的Asset Path函数进行修改,修改后的所述Asset Path函数指向所述应用程序安装包中的资源文件,以在启动各所述组件时通过所述Asset Manager调取所述Asset Path函数来获取所述资源文件中的对应资源。

其中,Resources类的构造函数定义在文件frameworks/base/core/java/android/content/res/Resources.java中。因为Resources类的构造函数将参数assets所指向的一个AssetManager对象保存在成员变量mAssets中,即mAssets=assets,使得Resources类的构造函数可以通过mAssets来访问应用程序的资源。因此,本实施例可通过对资源类的构造函数中的成员变量massets进行修改,来实现通过massets调取应用程序所需的资源。其中,上述实现方式可采用反射机制来实现。

安卓程序运行时,通过类加载器在指定的路径中查找加载类,因此,在构建各组件的运行环境时,需要将所述应用程序的路径添加到类加载器中的路径列表pathlist中,构造根据所述应用程序路径查找加载类的类加载器。

LoadedApk对象描述的是当前正在启动组件所属的Apk,用来访问应用程序资源的Resources对象是通过调用参数packageInfo所指向的是一个LoadedApk对象的成员函数getResources来创建的。由此可知,为了创建 Resources对象,以提取或访问应用程序资源,本实施例还需分别为应用中的各组件构建一个加载安卓安装包对象loaded APK。分别为各所述组件构造一个加载安卓安装包loadedAPK对象。具体的,本步骤可采用如下方式实现:通过反射机制反射Activity Thread里的packageinfo,以分别为各所述组件构造一个加载安卓安装包loaded APK对象。

在构建了各组件的运行环境之后,宿主应用程序启动为待监控应用程序构造的主线程,由该主线程加载各组件并运行。安卓系统中,对于活动Activity组件、广播接收者Broadcast Receiver组件或服务Service组件,在运行之前需要通过应用程序管理服务PMS的查验,由于本发明中的第三发应用程序尚未安装,因此,第三发应用程序的各组件无法查验通过,为了能够完成组件的加载和运行,需要进行组件替换,即,在查验时,使用宿主应用程序内置的组件替换所述待监控应用程序的相应组件。具体为:若加载的所述组件为活动组件、广播接收者组件或服务组件,则在应用程序管理服务进行查验之前,将所述组件修改为所述宿主应用程序中的对应组件,并在应用程序管理服务根据所述宿主应用程序中的对应组件进行查验通过后,再次加载并调用所述组件;若加载的所述组件为内容提供者组件,则通过反射机制调用所述内容提供者组件。

当所述待监控应用程序在所述宿主应用程序内开始运行后,由通过钩子函数注册在所述待监控应用程序各组件的资源访问接口类的监控代码实时监控所述待监控应用程序发出的资源访问请求。并根据预先设置的受限访问请求判断规则对所述资源访问请求进行分析,当根据预设规则判断各组件发送的资源访问请求为受限请求时,重定向所述资源访问请求至安全请求,例如,将所述资源访问请求重定向到空链接。

本发明实施例通过在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;解析所述安装包的配置文件,并根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;然后在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求,不需要获 取ROOT权限,仅需要安装一个宿主应用程序,有效地实现了尚未安装的待监控应用程序的监控。

在本发明的另一个具体实施例中,如图2所示,所述方法还包括:

步骤100,建立资源访问请求的重定向索引表。优选地,所述资源访问请求重定向表由所述宿主应用程序设置。上述实施例的步骤140中,所述监控代码监控各组件发出的资源访问请求的操作具体为:所述监控代码缓存各组件发出的资源访问请求;分析所述资源访问请求,并根据分析结果更新预先建立的资源访问请求的重定向索引表;当所述监控代码根据预设规则判断各组件发送的资源访问请求为受限请求时,根据所述重定向索引表重定向所述资源访问请求。

其中,资源访问请求的重定向索引表可以作为宿主应用程序的配置文件或者日志文件保存在系统中,可以随时修改。本实施例通过设置资源访问请求的重定向索引表,可以有用户选择受限的资源访问请求,达到对待监控应用程序精准监控的目的。

相应的,本发明实施例还公开了一种对动态加载的应用程序进行监控的装置,如图3所示,包括:

获取安装包模块310,用于在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;

解析配置文件模块320,用于解析所述安装包的配置文件;

监控指令植入模块330,用于根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;

监控模块340,用于在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求。

本实施例提供的所述方法的宿主应用程序是可以安装在安卓设备上应用程序,例如免ROOT沙箱应用程序(以下简称沙箱程序)、或者一个简化虚拟机程序、或者一个程序加载器。本实施例一面ROOT沙箱程序为例进行说明。用户通过免ROOT沙箱程序运行未安装的待监控应用软件,该沙箱程序为未安装的应用程序安装包提供了一个运行的环境,以实现应用程序的 免安装。并且,所述宿主应用程序为所述待监控应用程序创建运行环境。

进一步地,所述监控指令植入模块330进一步包括:

获取组件子模块,用于解析所述配置文件获得各组件入口;

注册监控代码子模块,利用反射机制获取各组件发送资源访问请求的类,并注册该类的钩子函数;

其中,所述钩子函数在预设的监控代码中实现,用于当判断所述资源访问请求为受限请求时,重定向所述资源访问请求。预设的监控代码以库函数的形式设置在宿主应用程序内。

具体实施时,为资源访问接口类设置钩子函数用于读取获得各组件发送的资源访问请求,并在该资源访问请求为受限资源访问请求时,对所述资源访问请求进行重定向,根据资源访问请求重定向表将首先请求定向至安全请求。其中,受限资源访问请求可以是根据应用程序的权限确定的系统访问请求,也可以是根据配置文件确定的受限访问请求,本发明对此不作限定。

所述监控模块340进一步包括:组件调用子模块和监控执行子模块。其中,组件调用子模块,用于在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,进一步包括:在所述宿主应用程序内构建各组件的运行环境;在所述运行环境下加载并运行各所述组件。监控执行子模块,进一步用于由监控代码监控各组件发出的资源访问请求。

进一步地,所述在所述宿主应用程序内构建各组件的运行环境包括:

构造所述待监控应用程序运行所需的资源环境,以在启动各所述组件时调取相应的资源;

构造类加载器,以加载各所述组件中的相应加载类;

构造主线程,以使所述执行各所述组件的启动操作;

分别为各所述组件构造一个加载安卓安装包对象。

所述在所述运行环境下加载并运行所述各组件进一步包括:若加载的所述组件为活动组件、广播接收者组件或服务组件,则在应用程序管理服务进行查验之前,将所述组件修改为所述宿主应用程序中的对应组件,并在应用程序管理服务根据所述宿主应用程序中的对应组件进行查验通过后,再次加 载并调用所述组件;若加载的所述组件为内容提供者组件,则通过反射机制调用所述内容提供者组件。

具体实施时,所述监控执行子模块中,由监控代码监控各组件发出的资源访问请求,具体为:监控代码当根据预设规则判断各组件发送的资源访问请求为受限请求时,重定向所述资源访问请求至安全请求。

本发明实施例通过在预装的宿主应用程序内检测到启动待监控应用程序的指令后,获取所述待监控应用程序的安装包;解析所述安装包的配置文件,并根据所述配置文件获得各组件的入口,并对各所述组件的入口注册预设的监控代码;然后在所述宿主应用程序内分别加载并运行注册有监控代码的各所述组件,由所述监控代码监控各组件发出的资源访问请求,不需要获取ROOT权限,仅需要安装一个宿主应用程序,有效地实现了尚未安装的待监控应用程序的监控。

在本发明的另一优选实施例中,如图4所示,所述装置还包括:

重定向设置模块300,用于建立资源访问请求的重定向索引表。优选地,所述资源访问请求重定向表由所述宿主应用程序设置。上述监控模块340进一步包括:所述监控代码缓存各组件发出的资源访问请求;分析所述资源访问请求,并根据分析结果更新预先建立的资源访问请求的重定向索引表;当所述监控代码根据预设规则判断各组件发送的资源访问请求为受限请求时,根据所述重定向索引表重定向所述资源访问请求。

其中,资源访问请求的重定向索引表可以作为宿主应用程序的配置文件或者日志文件保存在系统中,可以随时修改。本实施例通过设置资源访问请求的重定向索引表,可以有用户选择受限的资源访问请求,达到对待监控应用程序精准监控的目的。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上对本申请对提供的一种对动态加载的应用程序进行监控的方法和 装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1