一种函数调用的方法、装置及终端与流程

文档序号:16086844发布日期:2018-11-27 22:32阅读:232来源:国知局

本发明属于应用开发技术领域,尤其涉及一种函数调用的方法、装置及终端。



背景技术:

随着科学技术的不断发展,电子技术也得到了飞速的发展,终端的操作系统也在不断发展、改进。

以安卓操作系统android p为例,为了提高操作系统的稳定性,引入了新的机制,即应用程序引用非SDK接口时受限,非SDK接口对应的应用程序接口(API,Application Programming Interface)函数是系统的私有API,一般不允许或者禁止开发者调用,进而影响了绝大部分的应用程序的功能。



技术实现要素:

鉴于上述问题,本发明提出了一种函数调用的方法、装置及系统,用于解决现有技术中在android p操作系统中应用程序在调用非SDK接口时受限,不能调用系统的私有API函数,导致应用程序功能受到影响的技术问题。

第一方面,本发明实施例提供一种函数调用的方法,所述方法包括:

获取系统应用层中设置的运行时结构体标记;

校验所述运行时结构体标记是否存在标记值;

若存在,则调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;

其中,所述目标成员变量的属性值用于控制所述系统是否开启限制所述目标应用程序访问非SDK接口的机制。

可选的,在所述获取系统的应用层中设置的运行时结构体标记之前,还包括:

在系统的应用层中设置所述运行时结构体标记;

其中,所述在系统的应用层中设置所述运行时结构体标记,包括:为所述目标应用程序创建一个新进程;检测所述目标应用程序是否为非系统应用程序;若所述目标应用程序为非系统应用程序,则在为所述新进程布局参数环境时,在所述系统的应用层中设置所述运行时结构体标记。

可选的,所述校验所述运行时结构体标记是否存在标记值,包括:

将所述运行时结构体标记传送至所述系统的本地库层;

在所述本地库层中校验所述运行时结构体标记是否存在标记值。

可选的,所述调用修改函数将目标成员变量的属性值修改为预设的值,包括:

确定所述运行时结构体中目标成员变量的实际地址;

基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

可选的,所述获取所述运行时结构体中目标成员变量的实际地址,包括:

对所述系统的虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取所述目标桥梁函数的反汇编代码;所述目标桥梁函数中包含有所述目标成员变量的初始化调用地址;

基于所述目标成员变量的初始化调用地址,在所述目标桥梁函数的反汇编代码中查找所述目标成员变量的汇编代码;

根据所述目标成员变量的汇编代码确定所述目标成员变量在所述libart.so中的偏移值;

获取所述运行时结构体的对象值;

基于所述目标成员变量在所述libart.so中的偏移值以及所述运行时结构体的对象值确定所述目标成员变量的实际地址。

可选的,所述获取所述运行时结构体的对象值,包括:

调用系统中的结构体对象值获取函数获取所述运行时结构体的对象值。

可选的,所述获取所述运行时结构体的对象值,还包括:

获取所述libart.so中的全局偏移表;

从所述全局偏移表中确定所述运行时结构体的对象值。

可选的,所述调用修改函数将所述运行时结构体的目标成员变量的属性值修改为预设的值,包括:

基于所述目标成员变量的实际地址,查找到所述目标成员变量;

将所述预设的值赋值给所述目标成员变量的属性值。

第二方面,本发明实施例还提供一种函数调用的装置,所述装置包括:

第一获取单元,用于获取系统应用层中设置的运行时结构体标记;

第一校验单元,用于校验所述运行时结构体标记是否存在标记值;

第一修改单元,用于存在所述标记值时,调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;

其中,所述目标成员变量的属性值用于控制所述系统是否开启限制所述目标应用程序访问非SDK接口的机制。

可选的,所述系统还包括:第一设置单元,在所述获取系统的应用层中设置的运行时结构体标记之前,所述第一设置单元用于在系统的应用层中设置所述运行时结构体标记;其中,

所述第一设置单元包括:

创建单元,用于为所述为目标应用程序创建一个新进程;

检测单元,在为所述新进程布局参数环境时,用于检测所述目标应用程序是否为非系统应用程序;

第二设置单元,用于在所述目标应用程序为非系统应用程序时,则在为所述新进程布局参数环境时,在所述系统的应用层中设置所述运行时结构体标记。

可选的,所述第一校验单元包括:

传送单元,用于将所述运行时结构体标记传送至所述系统的本地库层;

第二校验单元,用于在所述本地库层中校验所述运行时结构体标记是否存在标记值。

可选的,所述第一修改单元具体包括:

第一确定单元,用于确定所述运行时结构体中目标成员变量的实际地址;

第二修改单元,用于基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

可选的,所述第一确定单元包括:

反汇编单元,用于对虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取所述目标桥梁函数的反汇编代码;所述目标桥梁函数中包含有所述目标成员变量的初始化调用地址;

查找单元,基于所述目标成员变量的初始化调用地址,在所述目标桥梁函数的反汇编代码中查找所述目标成员变量的汇编代码;

第二确定单元,用于根据所述目标成员变量的汇编代码确定所述目标成员变量在所述libart.so中的偏移值;

第二获取单元,用于获取所述运行时结构体的对象值;

第三确定单元,用于基于所述目标成员变量在所述libart.so中的偏移值以及所述运行时结构体的对象值确定所述目标成员变量的实际地址。

可选的,所述第二获取单元具体用于:

调用系统中的结构体对象值获取函数获取述运行时结构体的对象值。

可选的,所述第二获取单元具体还用于:

获取所述libart.so中全局偏移表;

从所述全局偏移表中确定所述运行时结构体的对象值。

可选的,所述第一修改单元具体用于:

基于所述目标成员变量的实际地址,查找到所述目标成员变量;

将所述预设的值赋值给所述目标成员变量的属性值。

第三方面,本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一项所述方法的步骤。

第三方面,本发明实施例还提供一种函数调用的终端,包括:

至少一个处理器;以及

与所述处理器通信连接的至少一个存储器,其中,所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如上述任一项所述方法的步骤。

本申请实施例中提供的技术方案,至少具有如下技术效果或优点:

本发明实施例提供一种函数调用的方法、装置及终端,方法包括:获取系统应用层中设置的运行时结构体标记;校验所述运行时结构体标记是否存在标记值;若存在,则调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;如此,对目标成员变量的属性值进行修改后,可以关闭用于限制目标应用程序访问非SDK接口的机制,系统进而允许目标应用程序调用系统的私有API函数,确保了目标应用程序的正常功能。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了本发明实施例提供的函数调用的方法流程示意图;

图2示出了本发明实施例提供的函数调用装置结构示意图;

图3示出了本发明实施例提供的第一设置单元的结构示意图;

图4示出了本发明实施例提供的第一校验单元的结构示意图;

图5示出了本发明实施例提供的第一修改单元的结构示意图;

图6示出了本发明实施例提供的第一确定单元的结构示意图;

图7示出了本发明实施例提供的终端结构示意图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。

实施例一

本发明实施例提供了一种函数调用的方法,如图1所示,所述方法包括:

S110,获取系统应用层中设置的运行时结构体标记;

大部分目标应用程序在进行正常处理逻辑时,需访问并调用系统中某些私有API函数,那么为了保持系统的稳定性,系统会在运行时runtime内部设置一个限制目标应用程序访问非SDK接口的机制,以限制目标应用程序调用私有API函数;其中,应用程序一般包括系统自带的应用程序及非系统应用程序,本实施例中的目标应用程序为非系统应用程序,也可理解为第三方应用程序;Runtime类封装了运行时的环境,每个应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。

那么本实施例中为了确保目标应用程序的正常功能,首先需要获取系统应用层中设置的运行时runtime结构体标记,以使得可以根据runtime结构体标记设置runtime结构体中目标成员变量的属性值,目标成员变量的属性值用于控制系统是否开启限制目标应用程序访问非SDK接口的机制。本实施例中目标成员变量为do_hidden_api_checks。

这里,在所述获取系统的应用层中设置的运行时结构体标记之前,还包括:在系统的应用层中设置所述运行时结构体标记;其中,因每个应用程序在启动之前都需要调用ActivityManagerService的startProcessLocked接口为之创建一个新进程,该新进程用于承载应用程序上运行的各种组件,大多数情况下,一个应用程序运行在一个新进程中,每个新进程具有独立的资源空间。

因此,新进程创建时,在系统的应用层(APP层)为新进程布局参数环境之前会检测目标应用程序是否为非系统应用程序;若目标应用程序为非系统应用程序,在为新进程布局参数环境时,则在系统APP层中设置runtime结构体标记。其中,本实施例中的runtime结构体标记的标记值为ENABLE_HIDDEN_API_CHECKS。具体的代码实现如下:

Step 1.ActivityManagerService.startProcessLocked

runtimeFlags:ENABLE_HIDDEN_API_CHECKS

这样就在APP层设置好了runtime结构体标记。

进一步地,参数环境布局好之后,可以进入新进程的具体创建点,利用Zygote进程分叉fork出一个新进程(step4~7),代码实现如下:

Step 2.Process.start进入新进程创建点

Step 3.Process.startViaZygote初始化运行时库

Step 4.Process.zygoteSendAndGetPid

Step 5.ZygoteInit.runSelectLoopMode

Step 6.ZygoteConnection.runOnce

Step 7.Zygote.forkAndSpecialize

S111,校验所述运行时结构体标记是否存在标记值;

在APP层获取到设置好的runtime结构体标记后,需要在本地库Native层校验runtime结构体标记是否存在标记值ENABLE_HIDDEN_API_CHECKS。

这里,系统架构主要分为四层:APP层、应用框架层、本地库Native层及内核层;APP层是由Java代码写的,运行在虚拟机中,应用框架层是由本地库Native层包装成为了一个Java本地接口(JNI,Java Native Interface),JNI接口在应用层和Native层之间起了一个桥梁的作用,虚拟机在执行应用层的Java类的过程中,如果Java类需要与Native层中的C/C++组件沟通时,虚拟机会载入C/C++组件,然后让Java函数顺利的调用到C/C++组件的函数。

因此APP层获取到runtime结构体标记后,可以通过JNI接口将运行时结构体标记传送至系统的本地库Native层。

上述步骤中,Step7.Zygote.forkAndSpecialize执行完毕之后就进入了Native层。

将runtime结构体标记传送至系统的Native层后,就可以在Native层校验runtime结构体标记是否存在标记值ENABLE_HIDDEN_API_CHECKS,若存在,则说明目标应用程序为非系统应用程序,需要调用修改函数对runtime结构体重目标成员变量的属性值进行修改。

这里,在Native层校验runtime结构体标记是否存在标记值的代码如下:

Step8.nativeForkAndSpecialize==>

com_android_internal_os_Zygote_nativeForkAndSpecialize

Step 9.ForkAndSpecializeCommon

Step 10.callPostForkChildHooks

Step 11.ZygoteHooks.postForkChild

Step12.ZygoteHooks.nativePostForkChild

==>ZygoteHooks_nativePostForkChild

S112,调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值;

作为可选的实施例之一,调用修改函数将目标成员变量的属性值修改为预设的值,包括:

确定所述运行时结构体中目标成员变量的实际地址;

基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

获取runtime结构体中目标成员变量的实际地址的具体实现如下:

利用反汇编工件IDA对系统的虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取目标桥梁函数的反汇编代码;目标桥梁函数中包含有目标成员变量的初始化调用地址,目标桥梁函数可以包括多种类型的函数,本实施例中的目标桥梁函数是校验函数ShouldBlockAccessToMember,校验函数用于对目标应用程序的调用进行校验。

作为一种可选的实施例,获取目标桥梁函数的反汇编代码,包括:基于目标桥梁函数的名称,在虚拟机本地库libart.so中查找目标桥梁函数的符号名称;根据符号名称确定目标桥梁函数的虚拟地址;获取虚拟机本地库libart.so的基址;根据目标桥梁函数的虚拟地址及虚拟机本地库libart.so的基址确定目标桥梁函数的实际地址;根据目标桥梁函数的实际地址获取目标桥梁函数的反汇编代码。这里,直接将目标桥梁函数的虚拟地址与libart.so的基址进行相加可得到目标桥梁函数的实际地址。

这里,因符号表中记载有每个函数的符号名称,及对应的数据类型、作用域以及内存地址等信息,因此根据符号名称确定目标桥梁函数的虚拟地址,包括:

对虚拟机本地库libart.so中目标桥梁函数的文件格式进行解析,获取虚拟机本地库libart.so的符号表;在符号表中,根据目标桥梁函数的符号名称即可查找到目标桥梁函数的虚拟地址。

获取到目标桥梁函数的反汇编代码后,基于目标成员变量的初始化调用地址,在目标桥梁函数的反汇编代码中查找目标成员变量的汇编代码;根据目标成员变量的汇编代码确定目标成员变量在libart.so中的偏移值。

比如,本实施例中查找到目标成员变量的汇编代码为:LDRB.W R0,[R6,#0x347],那么目标成员变量在libart.so中的偏移值就为0x347。

然后再获取runtime结构体的对象值;这里,可以调用系统中的结构体对象值获取函数Runtime::Current()获取runtime结构体的对象值;也可以获取libart.so中的全局偏移表;从全局偏移表中确定runtime结构体的对象值。一般来说,全局偏移表中的第一项为runtime结构体的对象值。

获取到runtime结构体的对象值及目标成员变量在libart.so中的偏移值后,可以基于目标成员变量在libart.so中的偏移值以及runtime结构体的对象值确定目标成员变量的实际地址。其中,目标成员变量的实际地址是目标成员变量在libart.so中的偏移值直接加上runtime结构体的对象值的结果。

获取到目标成员变量的实际地址后,可以基于实际地址,调用修改函数Runtime::SetHiddenApiChecksEnabled将目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许目标应用程序访问非SDK接口,调用系统的私有API函数;其中,本实施例中预设的值为false。

这样,目标应用程序在调用系统私有API函数时,系统调用检测函数Runtime::AreHiddenApiChecksEnabled检测do_hidden_api_checks_的属性值时,因do_hidden_api_checks_的属性值为false,那么就会关闭用于限制目标应用程序访问非SDK接口的机制,目标应用程序就可以顺利地调用到API函数。

对于本发明的实施例,具体的应用场景可以如下所示,但不限于此:当手机卫士需要监听浏览器的访问敏感隐私行为的进程时,就需要监听浏览器中用于访问隐私行为的API函数,获取API函数的操作数据,那么通过上述方法,手机卫士可以顺利地访问到浏览器中用于访问隐私行为的API函数,并获取到API函数的操作数据,进而可以根据预设的安全规则对这些操作数据进行分析,判断出目标进程的访问是否为恶意访问。

基于同样的发明构思,本发明还提供了一种函数调用的装置,详见实施例二。

实施例二

本实施例提供一种函数调用的装置,如图2所示,所述装置包括:第一获取单元21、第一校验单元22、第一修改单元23;其中,

大部分目标应用程序在进行正常处理逻辑时,需访问并调用系统中某些私有API函数,那么为了保持系统的稳定性,系统会在runtime内部设置一个限制目标应用程序访问非SDK接口的机制,以限制目标应用程序调用私有API函数;其中,应用程序一般包括系统自带的应用程序及非系统应用程序,本实施例中的目标应用程序为非系统应用程序,也可理解为第三方应用程序。Runtime类封装了运行时的环境,每个应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。

那么本实施例中为了确保目标应用程序的正常功能,第一获取单元21需要获取系统应用层中设置的runtime结构体标记;以使得可以根据runtime结构体标记设置runtime结构体中目标成员变量的属性值,目标成员变量的属性值用于控制系统是否开启限制目标应用程序访问非SDK接口的机制。本实施例中目标成员变量为do_hidden_api_checks。

这里,参见图2,装置还包括:第一设置单元24,在所述获取系统的应用层中设置的运行时结构体标记之前,第一设置单元24用于:在系统的应用层中设置所述运行时结构体标记。

具体地,参见图3,第一设置单元21包括:创建单元31、检测单元32及第二设置单元33;

因每个应用程序在启动之前创建单元31都需要调用ActivityManagerService的startProcessLocked接口为之创建一个新进程,该新进程用于承载应用程序上运行的各种组件,大多数情况下,一个应用程序运行在一个新进程中,每个新进程具有独立的资源空间。

因此,新进程创建时,需要在系统的(APP层为新进程布局参数环境,这时检测单元32会检测目标应用程序是否为非系统应用程序;若目标应用程序为非系统应用程序,在为新进程布局参数环境时,第二设置单元33则在系统APP层中设置runtime结构体标记。其中,本实施例中的runtime结构体标记的标记值为ENABLE_HIDDEN_API_CHECKS。具体的代码实现如下:

Step 1.ActivityManagerService.startProcessLocked

runtimeFlags:ENABLE_HIDDEN_API_CHECKS

这样就在APP层设置好了runtime结构体标记。

进一步地,参数环境布局好之后,可以进入新进程的具体创建点,利用Zygote进程fork出一个新进程(step4~7),代码实现如下:

Step 2.Process.start进入新进程创建点

Step 3.Process.startViaZygote初始化运行时库

Step 4.Process.zygoteSendAndGetPid

Step 5.ZygoteInit.runSelectLoopMode

Step 6.ZygoteConnection.runOnce

Step 7.Zygote.forkAndSpecialize

第一获取单元21在APP层获取到设置好的runtime结构体标记后,第一校验单元22用于在Native层校验runtime结构体标记是否存在标记值ENABLE_HIDDEN_API_CHECKS。

具体地,参见图4,第一校验单元22包括:传送单元41及第二校验单元42;传送单元41用于将运行时结构体标记传送至所述系统的本地库层。

这里,系统架构主要分为四层:APP层、应用框架层、本地库Native层及内核层;APP层是由Java代码写的,运行在虚拟机中,应用框架层是由本地库Native层包装成为了一个Java本地接口(JNI,Java Native Interface),JNI接口在应用层和Native层之间起了一个桥梁的作用,虚拟机在执行应用层的Java类的过程中,如果Java类需要与Native层中的C/C++组件沟通时,虚拟机会载入C/C++组件,然后让Java函数顺利的调用到C/C++组件的函数。那么传送单元41可以通过JNI接口将运行时结构体标记传送至系统的本地库层。

将runtime结构体标记传送至系统的Native层后,第二校验单元42就可以在所述本地库层中校验运行时结构体标记是否存在标记值ENABLE_HIDDEN_API_CHECKS,若存在,则说明目标应用程序为非系统应用程序,那么第一修改单元23需要调用修改函数对runtime结构体重目标成员变量的属性值进行修改。

这里,第一校验单元22在Native层校验runtime结构体标记是否存在标记值的代码如下:

Step8.nativeForkAndSpecialize==>

com_android_internal_os_Zygote_nativeForkAndSpecialize

Step 9.ForkAndSpecializeCommon

Step 10.callPostForkChildHooks

Step 11.ZygoteHooks.postForkChild

Step12.ZygoteHooks.nativePostForkChild

==>ZygoteHooks_nativePostForkChild

作为一种可选的实施例,如图5所示,第一修改单元23包括:第一确定单元51及第二修改单元52;其中,

第一确定单元51用于确定所述运行时结构体中目标成员变量的实际地址;

第二修改单元52用于基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

这里,参见图6,第一确定单元51包括:反汇编单元61、查找单元62、第二确定单元63、第二获取单元64及第三确定单元65;其中

反汇编单元61用于利用反汇编工件IDA对系统的虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取目标桥梁函数的反汇编代码;目标桥梁函数中包含有目标成员变量的初始化调用地址,目标桥梁函数可以包括多种类型的函数,本实施例中的目标桥梁函数是校验函数ShouldBlockAccessToMember,校验函数用于对目标应用程序的调用进行校验。

作为可选的实施例之一,反汇编单元61具体用于:基于目标桥梁函数的名称,在虚拟机本地库libart.so中查找目标桥梁函数的符号名称;根据符号名称确定目标桥梁函数的虚拟地址;获取虚拟机本地库libart.so的基址;根据目标桥梁函数的虚拟地址及虚拟机本地库libart.so的基址确定目标桥梁函数的实际地址;根据目标桥梁函数的实际地址获取目标桥梁函数的反汇编代码。这里,直接将目标桥梁函数的虚拟地址与libart.so的基址进行相加可得到目标桥梁函数的实际地址。

这里,因符号表中记载有每个函数的符号名称,及对应的数据类型、作用域以及内存地址等信息,反汇编单元61可以对虚拟机本地库libart.so中目标桥梁函数的文件格式进行解析,获取虚拟机本地库libart.so的符号表;在符号表中,根据目标桥梁函数的符号名称即可查找到目标桥梁函数的虚拟地址。

在获取到目标桥梁函数的反汇编代码后,查找单元62可以基于目标成员变量的初始化调用地址,在目标桥梁函数的反汇编代码中查找目标成员变量的汇编代码;

然后第二确定单元63可以根据目标成员变量的汇编代码确定目标成员变量在libart.so中的偏移值。比如,本实施例中查找到目标成员变量的汇编代码为:LDRB.W R0,[R6,#0x347],那么目标成员变量在libart.so中的偏移值就为0x347。

第二获取单元64再获取runtime结构体的对象值;这里,第二获取单元64可以调用系统中的结构体对象值获取函数Runtime::Current()获取runtime结构体的对象值;也可以获取libart.so中的全局偏移表;从全局偏移表中确定runtime结构体的对象值。一般来说,全局偏移表中的第一项为runtime结构体的对象值。

获取到runtime结构体的对象值及目标成员变量在libart.so中的偏移值后,第三确定单元65可以基于目标成员变量在libart.so中的偏移值以及runtime结构体的对象值确定目标成员变量的实际地址。其中,目标成员变量的实际地址是目标成员变量在libart.so中的偏移值直接加上runtime结构体的对象值的结果。

获取到目标成员变量的实际地址后,第二修改单元52用于基于实际地址,调用修改函数Runtime::SetHiddenApiChecksEnabled将目标成员变量的属性值修改为预设的值,以使得用于限制所述目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,调用系统的私有API函数;其中,本实施例中预设的值为false。

这样,目标应用程序在调用系统私有API函数时,系统调用检测函数Runtime::AreHiddenApiChecksEnabled检测do_hidden_api_checks_的属性值时,因do_hidden_api_checks_的属性值为false,那么就会关闭用于限制目标应用程序访问非SDK接口的机制,目标应用程序就可以顺利地调用到API函数。

对于本发明的实施例,具体的应用场景可以如下所示,但不限于此:当手机卫士需要监听浏览器的访问敏感隐私行为的进程时,就需要监听浏览器中用于访问隐私行为的API函数,获取API函数的操作数据,那么通过上述方法,手机卫士可以顺利地访问到浏览器中用于访问隐私行为的API函数,并获取到API函数的操作数据,进而可以根据预设的安全规则对这些操作数据进行分析,判断出目标进程的访问是否为恶意访问。

本申请实施例中提供的技术方案,至少具有如下技术效果或优点:

本发明实施例提供一种函数调用的方法、装置及终端,方法包括:获取系统应用层中设置的运行时结构体标记;校验所述运行时结构体标记是否存在标记值;若存在,则调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;其中,所述目标成员变量的属性值用于控制所述系统是否开启限制目标应用程序访问非SDK接口的机制;如此,对目标成员变量的属性值进行修改后,可以关闭用于限制目标应用程序访问非SDK接口的机制,系统进而允许目标应用程序调用系统私有的API函数,确保了目标应用程序的正常功能。

本发明同时还提供了一种移动终端,如图5所示,为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该终端可以为包括手机、平板电脑、PDA(Personal Digital Assistant,个人数字助理)、POS(Point of Sales,销售终端)、车载电脑等任意终端设备,以终端为手机为例:

图5示出的是与本发明实施例提供的终端相关的手机的部分结构的框图。参考图5,手机包括:射频(Radio Frequency,RF)电路31、存储器132、输入单元33、显示单元34、传感器35、音频电路36、无线保真(wireless-fidelity,Wi-Fi)模块37、处理器38、以及电源39等部件。本领域技术人员可以理解,图3中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

下面结合图6对手机的各个构成部件进行具体的介绍:

RF电路31可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器38处理;另外,将设计上行的数据发送给基站。通常,RF电路31包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(Low Noise Amplifier,LNA)、双工器等。此外,RF电路31还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(Global System of Mobile communication,GSM)、通用分组无线服务(General Packet Radio Service,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。

存储器32可用于存储软件程序以及模块,处理器38通过运行存储在存储器32的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。存储器32可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器32可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。

输入单元33可用于接收输入的数字或字符信息,以及产生与手机的用户设置以及功能控制有关的键信号输入。具体地,输入单元33可包括触控面板331以及其他输入设备332。触控面板331,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板331上或在触控面板331附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板331可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器38,并能接收处理器38发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板331。除了触控面板331,输入单元33还可以包括其他输入设备332。具体地,其他输入设备332可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。

显示单元34可用于显示由用户输入的信息或提供给用户的信息以及手机的各种菜单。显示单元34可包括显示面板341,可选的,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(Organic Light-Emitting Diode,OLED)等形式来配置显示面板341。进一步的,触控面板331可覆盖显示面板341,当触控面板331检测到在其上或附近的触摸操作后,传送给处理器38以确定触摸事件的类型,随后处理器38根据触摸事件的类型在显示面板341上提供相应的视觉输出。虽然在图3中,触控面板331与显示面板341是作为两个独立的部件来实现手机的输入和输入功能,但是在某些实施例中,可以将触控面板331与显示面板341集成而实现手机的输入和输出功能。

手机还可包括至少一种传感器35,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板341的亮度,接近传感器可在手机移动到耳边时,关闭显示面板341和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。

音频电路36、扬声器361,传声器362可提供用户与手机之间的音频接口。音频电路36可将接收到的音频数据转换后的电信号,传输到扬声器361,由扬声器361转换为声音信号输出;另一方面,传声器362将收集的声音信号转换为电信号,由音频电路360接收后转换为音频数据,再将音频数据输出处理器38处理后,经RF电路31以发送给比如另一手机,或者将音频数据输出至存储器32以便进一步处理。

WiFi属于短距离无线传输技术,手机通过WiFi模块37可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图3示出了WiFi模块37,但是可以理解的是,其并不属于手机的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。

处理器38是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器32内的软件程序和/或模块,以及调用存储在存储器32内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器38可包括一个或多个处理单元;优选的,处理器38可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器38中。

手机还包括给各个部件供电的电源39(比如电池),优选的,电源可以通过电源管理系统与处理器38逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。

尽管未示出,手机还可以包括摄像头、蓝牙模块等,在此不再赘述。

在本发明实施例中,该终端所包括的处理器38还具有以下功能:获取目标进程对应的链接程序默认的命名空间,所述链接程序用于加载、链接动态链接库libc.so库中的所有函数,所述libc.so库中包括有待注入的目标功能函数;获取所述命名空间的地址;根据所述命名空间的地址查找所述命名空间的属性参数,将所述属性参数的属性值设置为预设的属性值,以能使得操作系统允许进行跨进程注入的操作;将所述目标功能函数注入所述目标进程中。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的终端、装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

本发明公开了,A1、一种函数调用的方法,所述方法包括:

获取系统应用层中设置的运行时结构体标记;

校验所述运行时结构体标记是否存在标记值;

若存在,则调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;

其中,所述目标成员变量的属性值用于控制所述系统是否开启限制所述目标应用程序访问非SDK接口的机制。

A2、如A1所述的方法,在所述获取系统的应用层中设置的运行时结构体标记之前,还包括:

在系统的应用层中设置所述运行时结构体标记;

其中,所述在系统的应用层中设置所述运行时结构体标记,包括:为所述目标应用程序创建一个新进程;检测所述目标应用程序是否为非系统应用程序;若所述目标应用程序为非系统应用程序,则在为所述新进程布局参数环境时,在所述系统的应用层中设置所述运行时结构体标记。

A3、如A1所述的方法,所述校验所述运行时结构体标记是否存在标记值,包括:

将所述运行时结构体标记传送至所述系统的本地库层;

在所述本地库层中校验所述运行时结构体标记是否存在标记值。

A4、如A1所述的方法,所述调用修改函数将目标成员变量的属性值修改为预设的值,包括:

确定所述运行时结构体中目标成员变量的实际地址;

基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

A5、如A4所述的方法,所述获取所述运行时结构体中目标成员变量的实际地址,包括:

对所述系统的虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取所述目标桥梁函数的反汇编代码;所述目标桥梁函数中包含有所述目标成员变量的初始化调用地址;

基于所述目标成员变量的初始化调用地址,在所述目标桥梁函数的反汇编代码中查找所述目标成员变量的汇编代码;

根据所述目标成员变量的汇编代码确定所述目标成员变量在所述libart.so中的偏移值;

获取所述运行时结构体的对象值;

基于所述目标成员变量在所述libart.so中的偏移值以及所述运行时结构体的对象值确定所述目标成员变量的实际地址。

A6、如A5所述的方法,所述获取所述运行时结构体的对象值,包括:

调用系统中的结构体对象值获取函数获取所述运行时结构体的对象值。

A7、如A5所述的方法,所述获取所述运行时结构体的对象值,还包括:

获取所述libart.so中的全局偏移表;

从所述全局偏移表中确定所述运行时结构体的对象值。

A8、如A1至A7任一项所述的方法,所述调用修改函数将所述运行时结构体的目标成员变量的属性值修改为预设的值,包括:

基于所述目标成员变量的实际地址,查找到所述目标成员变量;

将所述预设的值赋值给所述目标成员变量的属性值。

B9、一种函数调用的装置,所述装置包括:

第一获取单元,用于获取系统应用层中设置的运行时结构体标记;

第一校验单元,用于校验所述运行时结构体标记是否存在标记值;

第一修改单元,用于存在所述标记值时,调用修改函数将运行时结构体中目标成员变量的属性值修改为预设的值,以使得用于限制目标应用程序访问非SDK接口的机制处于关闭状态,从而允许所述目标应用程序访问所述非SDK接口,以调用系统的私有应用程序接口API函数;

其中,所述目标成员变量的属性值用于控制所述系统是否开启限制所述目标应用程序访问非SDK接口的机制。

B10、如B9所述的装置,所述系统还包括:第一设置单元,在所述获取系统的应用层中设置的运行时结构体标记之前,所述第一设置单元用于在系统的应用层中设置所述运行时结构体标记;其中,

所述第一设置单元包括:

创建单元,用于为所述为目标应用程序创建一个新进程;

检测单元,在为所述新进程布局参数环境时,用于检测所述目标应用程序是否为非系统应用程序;

第二设置单元,用于在所述目标应用程序为非系统应用程序时,则在为所述新进程布局参数环境时,在所述系统的应用层中设置所述运行时结构体标记。

B11、如B9所述的装置,所述第一校验单元包括:

传送单元,用于将所述运行时结构体标记传送至所述系统的本地库层;

第二校验单元,用于在所述本地库层中校验所述运行时结构体标记是否存在标记值。

B12、如B9所述的装置,所述第一修改单元具体包括:

第一确定单元,用于确定所述运行时结构体中目标成员变量的实际地址;

第二修改单元,用于基于所述实际地址,调用修改函数将所述目标成员变量的属性值修改为预设的值。

B13、如权B12所述的装置,所述第一确定单元包括:

反汇编单元,用于对虚拟机本地库libart.so进行反汇编,根据目标桥梁函数的名称获取所述目标桥梁函数的反汇编代码;所述目标桥梁函数中包含有所述目标成员变量的初始化调用地址;

查找单元,基于所述目标成员变量的初始化调用地址,在所述目标桥梁函数的反汇编代码中查找所述目标成员变量的汇编代码;

第二确定单元,用于根据所述目标成员变量的汇编代码确定所述目标成员变量在所述libart.so中的偏移值;

第二获取单元,用于获取所述运行时结构体的对象值;

第三确定单元,用于基于所述目标成员变量在所述libart.so中的偏移值以及所述运行时结构体的对象值确定所述目标成员变量的实际地址。

B14、如B13所述的装置,所述第二获取单元具体用于:

调用系统中的结构体对象值获取函数获取述运行时结构体的对象值。

B15、如B13所述的装置,所述第二获取单元具体还用于:

获取所述libart.so中全局偏移表;

从所述全局偏移表中确定所述运行时结构体的对象值。

B16、如B9至B15任一项所述的装置,所述第一修改单元具体用于:

基于所述目标成员变量的实际地址,查找到所述目标成员变量;

将所述预设的值赋值给所述目标成员变量的属性值。

B17、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现B1至B8任一项所述方法的步骤。

B18、一种函数调用的终端,包括:

至少一个处理器;以及

与所述处理器通信连接的至少一个存储器,其中,所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如B1至B8任一项所述方法的步骤。

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