CN106502703A - 一种函数调用方法和装置 - Google Patents
一种函数调用方法和装置 Download PDFInfo
- Publication number
- CN106502703A CN106502703A CN201610970407.6A CN201610970407A CN106502703A CN 106502703 A CN106502703 A CN 106502703A CN 201610970407 A CN201610970407 A CN 201610970407A CN 106502703 A CN106502703 A CN 106502703A
- Authority
- CN
- China
- Prior art keywords
- function
- attribute information
- call
- antiderivative
- methods described
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/22—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种函数调用方法和装置;本发明实施例采用创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以提高终端系统的安全性。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种函数调用方法和装置。
背景技术
ART模式英文全称为Android runtime,是谷歌Android 4.4系统新增的一种应用运行模式。ART模式中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。
目前,android(安卓)系统在ART模式下的函数替换操作方案即hook(钩子)方案主要包括以xpose为代表的方案。xpose方案虽然能够比较好的hook以及回调到原函数,但是在实际操作中需要使用xpose提供的libart.so文件替换系统已有的libart.so文件,这样就需要对终端进行root,使得用户获取系统的超级用户权限。然而,对终端进行root,会降低终端系统的安全性。
发明内容
本发明实施例提供一种函数调用方法和装置,可以提高终端系统的安全性。
本发明实施例提供一种函数调用方法,包括:
创建空的方法对象;
将原函数的调用属性信息备份至所述方法对象中;
将所述原函数的调用属性信息替换为目标函数的调用属性信息;
在调用原函数时根据所述目标函数的调用属性信息跳转至执行目标函数;
在回调原函数时根据所述方法对象中的调用属性信息回调所述原函数。
相应的,本发明实施例还提供一种函数调用装置,包括:
备份单元,用于将原函数的调用属性信息备份至所述方法对象中;
替换单元,用于将所述原函数的调用属性信息替换为目标函数的调用属性信息;
调用单元,用于在调用原函数时根据所述目标函数的调用属性信息跳转至执行目标函数;
回调单元,用于在回调原函数时根据所述方法对象中的调用属性信息回调所述原函数。
本发明实施例采用创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以在非root模式下不用替换libart.so文件即可实现对原函数的替换操作以及回调,其无需对终端进行root,因此,相对于现有技术而言,提高终端系统的安全性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1a是本发明实施例提供的函数调用方法的流程图;
图1b是本发明实施例提供的一种系统的java层和native层的结构示意图;
图1c是本发明实施例提供的另一种系统的java层和native层的结构示意图;
图1d是本发明实施例提供的OAT文件的结构示意图;
图1e是本发明实施例提供的OAT文件中查找本地机器指令的示意图;
图2a是本发明实施例提供的函数调用方法的另一流程图;
图2b是本发明实施例提供的一种代码示意图;
图2c是本发明实施例提供的另一种代码示意图;
图3是本发明实施例提供的函数调用装置的结构示意图;
图4是本发明实施例提供的终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种函数调用方法和装置。以下分别进行详细说明。
实施例一、
本实施例将从函数调用装置的角度进行描述,该函数调用装置具体可以集成在终端等设备中,该终端具体可以为手机、笔记本电脑或平板电脑等设备。
一种函数调用方法,包括:创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数。
如图1a所示,一种函数调用方法,具体流程可以如下:
101、创建空的方法对象。
该方法对象用于存储待替换的原函数的调用属性信息,以便实现对原函数的回调,其可以为一个ArtMethod对象,在本实施例中称为方法对象。
比如,在ART模式下,可以创建空的ArtMethod对象,该ArtMethod对象用于保存待替换的原函数的调用属性信息,该方法对象即为ArtMethod对象。
在运行时,每一个方法属性或者函数调用属性信息均是用一个Method对象保存的,因此,需要存储原函数的调用属性信息或者ArtMethod对象调用属性信息,就需要创建一个Method对象,ArtMethod是Method对象中的一个属性。
其中,创建方法对象的方式可有多种,比如,可以调用系统提供的方法构造函数来创建ArtMethod对象。也即步骤“创建空的方法对象”可以包括:调用系统提供的方法构造函数,然后,根据该方法构造函数创建空的方法对象。
考虑到在实际应用中,不同版本的系统中的方法构造函数的类型不一样,一些系统中的方法构造函数为公用函数,一些系统中的方法构造函数为私有函数;比如,5.0、5.1系统Method的构造函数是公用的,android6.0以上的系统Method的构造函数加入保护机制,且将构造函数设置为私有的。因此,对于公用的方法构造函数可以直接调用,而对于私有的构造函数可以对其属性进行修改,使其变为公用函数,这样可以保证可以创建方法对象,以便提高函数调用方案的灵活性和适用性。也即步骤“创建空的方法对象”可以包括:
对系统提供的方法构造函数的属性进行修改,以使得该方法构造函数为公用函数;
调用该方法构造函数,并根据该方法构造函数创建空的方法对象。
比如,方法构造函数的属性可以包括:用于表示该函数为公用函数或者私有函数的类型属性,此时,可以对该类型属性进行修改,如,将表示该函数为私有函数的类型属性修改为表示该函数为公用函数的类型属性。
本实施例中,对于公用的构造函数(如5.0和5.1安卓系统的构造函数),可以直接在java层(即应用层)调用创建空的ArtMethod对象;对于私有的构造函数(如6.0安卓系统的构造函数)需要从本地(native)层来修改该函数的属性,然后,在native层调用该构造函数创建空的ArtMethod对象。
102、将原函数的调用属性信息备份至该方法对象中。
其中,函数的调用属性信息为用于调用该函数的属性信息,可以包括调用地址属性、函数类型或者其他属性信息。也即该原函数的调用属性信息可以包括:原函数的调用地址属性、函数类型等其他属性,该调用地址属性存储有原函数的调用地址信息(即入口地址信息)。比如,该地址属性可以为entry_point_from_quick_compiled_code_,其是函数或者ArtMehod对象的属性,保存了code_offset(代码偏移位置)_地址和参数base之和,也即为真实执行的二进制代码的地址。
以方法对象在OAT文件内为例,该参数base描述的是OAT文件的OAT头在内存的位置,而参数code_offset描述的是类方法的本地机器指令相对OAT头的偏移位置。将这两者相加,就可以得到一个类方法的本地机器指令在内存的位置。
具体地,步骤“将原函数的调用属性信息备份至该方法对象中”可以包括:对原函数的调用属性信息进行拷贝,并将拷贝的调用属性信息保存至方法对象中。
由于不同版本的系统java层和和Native层之间的ArtMethod结构对应关系不同,以5.0和5.1、6.0系统为例,参考图1b和图1c,可以看出对于5.0和5.1系统存在java层ArtMethod结构和Native层的ArtMethod结构对应;而6.0系统却没有,在相关的AbstractMethod结构中,6.0系统只是存储了native层ArtMethod对象的地址。
也即,在系统本地层创建空的方法对象的情况下,步骤“将原函数的调用属性信息备份至该方法对象中”可以包括:
将该原函数的调用属性信息备份至系统本地层的该方法对象;
将该方法对象对应的指针信息保存在该应用层。
比如,在将方法构造函数的属性修改为公用属性后,可以根据方法构造函数在native层上创建一个ArtMethod对象,并将原函数的调用属性信息备份至ArtMethod对象,然后,返回该ArtMethod对象的指针,将该指针保存在java层的Method内关于ArtMethod对象指针中。
可选地,为了在回调时能够避免非private(私有)类型的函数调用会走虚函数查找逻辑,导致无法正常回调到原函数;因此,本实施例还可以对原函数的调用属性信息进行修改,使得原函数的属性包含私有类型,这样在回调时就不会走虚函数查找逻辑,确保可以正常回调到原函数。也即步骤“将原函数的调用属性信息备份至该方法对象中”可以包括:
对该原函数的调用属性信息进行修改,以使得该原函数的属性包含私有类型;
将修改后的调用属性信息备份至该方法对象。
比如,将修改后的调用属性信息备份至java层或者native层上的ArtMethod对象中,对于在native层备份还需要返回ArtMethod对象的指针,并保存在java层。
在java中有两种函数类型:虚函数和直接函数,其中直接函数包含当前类的构造函数、private属性的函数、静态函数;虚函数为非直接函数的其他函数,例如public类型、protect类型的函数等。
对于直接函数会直接使用当前函数的指针,而对于虚函数会根据对应的虚函数的序号取到对应的函数对象信息。
比如,在android的InvokeMethod(反射机制)中,若判断回调的函数为非直接函数(如在FindeVirtualMethodForVirtualOrInterface中会判断是否为直接函数),若是非直接函数,则会根据对应的虚函数的序号取到对应的函数对象信息。
为了加快函数回调的速度,本实施例中会将备份的调用属性信息存储在一个Map对中,其中key为原函数的函数名,value为该备份函数调用属性信息的method对象。可以通过函数找到对应的函数的method对象,然后执行invoke反射调用就可以实现原函数的调用了。
103、将该原函数的调用属性信息替换为目标函数的调用属性信息。
其中,原函数的调用属性信息可以包括:原函数的调用地址信息即入口地址信息;此时,可以将原函数的调用地址信息替换为目标函数的调用地址信息。
实际应用中,函数的调用地址信息保持在其地址属性中,比如,该地址属性可以为entry_point_from_quick_compiled_code_,其是函数或者ArtMehod对象的属性,保存了code_offset(代码偏移位置)_地址和参数base,也就是code_offset和base地址相加即为真实执行的二进制代码的地址。
那么,此时,可将原函数的地址属性替换为目标函数的地址属性,即可以实现将原函数的调用地址信息替换为目标函数的调用地址信息。
参考图1d和图1e,下面对atr模式下函数调用地址做具体分析:
首先透过art文件结构上分析可知,每个art文件都是存储为elf文件结构,而相较于传统的elf文件结构,该文件会多出两个section,分别是oat data section和oat execsection。其中每个art结构真实运行的二进制代码存储在oat exec section中,而oatdata section用于存储原始dex文件的一些解析后的索引信息。这里主要的是每一个dex文件都包含多个class结构的指针,通过这些class的指针可以找到对应的class结构。在class结构中又会包含多个Method方法的结构,在每一个Method方法结构中存在一个叫做code_offeset_和begin的属性,该属性的地址之和就会指向到oat exec section中真实二进制执行代码逻辑片段。
具体地,参考图1e,方法调用过程可以为:首先是根据类签名信息从包含在OAT文件里面的DEX文件中查找目标Class的编号,然后再根据这个编号找到在OAT文件中找到对应的OatClass。接下来再根据方法签名从包含在OAT文件里面的DEX文件中查找目标方法的编号,然后再根据这个编号在前面找到的OatClass中找到对应的OatMethod。有了这个OatMethod之后,我们就根据它的成员变量begin_和code_offset_找到目标类方法的本地机器指令了。
因此,需要替换函数的调用地址就是要替换运行中参数code_offset和begin的代码存储值之和。而其中entry_point_from_quick_compiled_code_是ArtMehod对象中的属性,保存了该函数code_offset和begin地址的地址之和,也就是真实执行的二进制地址,所以替换函数的调用地址,在运行时就是替换ArtMethod的地址属性entry_point_from_quick_compiled_code的地址值,在原函数和目标函数的begin一致的情况下,可以将地址属性中原函数的code_offse替换为目标函数code_offset的地址值。
应当注意是:对于静态函数和private函数的特殊处理。因为静态函数在调用的时候需要用到目标method_index_属性做函数检测。另外由于非直接类型的函数在调用时候会需要用到原dex_method_index_去检测匹配函数原型,所以这里只能对private类型的函数赋值修改原有dex_method_index。
104、在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数。
由于已经将原函数的调用属性信息替换为目标函数的调用属性信息,因此,在调用原函数时,可以根据该原函数当前的调用属性信息(此时即为目标函数的调用属性信息)跳转至执行目标函数。
具体地,接收原函数的调用指令,根据该调用指令获取目标函数的调用属性信息,然后,根据该调用属性信息跳转至执行目标函数。
比如,将原函数A的调用地址信息替换为目标函数C的调用地址信息,此时,在调用原函数A时获取目标函数C的调用地址信息,然后,根据目标函数C的调用地址信息跳转至执行目标函数C。
在替换ArtMethod的地址属性entry_point_from_quick_compiled_code的情况下,在调用原函数时,通过调用函数entry_point_from_quick_compiled_code获取待执行函数的地址值,由于已经替换成了目标函数的地址值,那么此时函数entry_point_from_quick_compiled_code获取待执行函数的地址值即为目标函数的地址值,然后,根据该地址值跳转至执行目标函数的代码。
105、在回调原函数时根据该方法对象中的调用属性信息回调该原函数。
具体地,在回调原函数时可以根据(invoke)反射调用机制和该方法对象中的调用属性信息回调该原函数。
在native层创建方法对象的情况下,可以在回调原函数时根据该应用层中的指针信息查找对应的方法对象,根据查找到的方法对象内的调用属性信息回调该原函数。比如,可以根据反射调用机制和应用层中的指针信息查找对应的方法对象,根据查找到的方法对象内的调用属性信息回调该原函数。
实际应用中,采用反射调用机制,会在回调原函数时先判断待回调的原函数是否为直接函数(如通过FindeVirtualMethodForVirtualOrInterface判断),若是,则直接根据该应用层中的指针信息查找对应的方法对象,然后根据查找到的方法对象内的调用属性信息回调该原函数。若未非直接函数即为虚函数,根据对应的虚函数的序号获取对应的函数对象信息。
由上可知,本发明实施例采用创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以在非root模式下不用替换libart.so文件即可实现对原函数的替换操作以及回调,其无需对终端进行root,因此,相对于现有技术而言,提高终端系统的安全性以及函数替换、回调的效率。
实施例二、
根据实施例一所描述的方法,以下将举例作进一步详细说明。
在本实施例中,将以该函数调用装置集成在终端,为例进行说明。
如图2a所示,一种函数调用方法,具体流程可以如下:
201、终端调用系统提供的方法构造函数。
例如,对于android5.0和5.1系统可以直接调用方法构造函数来创建空的ArtMethod对象。
由于android5.0和5.1系统,其方法构造函数为公用函数,因此,可以直接在java层调用构造函数创建一个Method。
又例如,对于6.0及以上的系统,方法构造函数加入保护机制,且将构造函数设置为私有的,即其方法构造函数为私有函数,因此,不能直接调用;此时,可以先对方法构造函数的属性进行修改,然后再调用;也即步骤“终端调用系统提供的方法构造函数”可以包括:
终端对系统提供的方法构造函数的属性进行修改,以使得该方法构造函数为公用函数,调用该方法构造函数。
202、终端根据方法构成函数创建空的ArtMethod对象。
例如,参考图1b和图1c,对于android5.0和5.1系统,存在java层ArtMethod结构和Native层的ArtMethod结构对应,因此可以直接根据方法构成函数在java层创建空的ArtMethod对象。
参考图1b和图1c,对于6.0及以上的系统java层ArtMethod结构和Native层的ArtMethod结构不对应,相关的AbstractMethod结构中,6.0及以上的系统只是存储了native层ArtMethod对象的地址,因此,对于6.0及以上的系统需要在native层备份创建相关的ArtMethod结构。
也即终端可以根据方法构成函数在native层创建空的ArtMethod对象,并将ArtMethod对象的指针信息保存在java层对应的Method的结构中。
203、终端对原函数的调用属性信息进行修改,以使得原函数的属性包含私有类型。
其中,原函数的调用属性信息可以包括:地址属性、函数类型等其他属性,该地址属性存储有原函数的调用地址信息(即入口地址信息)。比如,该地址属性可以为entry_point_from_quick_compiled_code_,其是函数或者ArtMehod对象的属性,保存了code_offset(代码偏移位置)_地址和参数base之和,也即为真实执行的二进制代码的地址。
可选地,为了在回调时能够避免非private(私有)类型的函数调用会走虚函数查找逻辑,导致无法正常回调到原函数;因此,本实施例还可以对原函数的调用属性信息进行修改,使得原函数的属性包含私有类型,这样在回调时就不会走虚函数查找逻辑,确保可以正常回调到原函数。
204、终端将修改后的调用属性信息备份至该ArtMethod对象中。
对于android5.0和5.1系统,可以直接将调用属性信息备份至java层上的ArtMethod对象中。参考图2b,对于android5.0和5.1系统可以直接调用构造函数,在java层创建ArtMethod对象,然后,修改原函数属性,将原函数的调用属性信息备份至ArtMethod对象。
对于6.0及以上的系统,在根据方法构成函数在native层创建空的ArtMethod对象之后,将调用属性信息备份至该在native层上的ArtMethod对象中,然后并将ArtMethod对象的指针信息保存在java层对应的Method的结构中。
参考图2c,对于6.0及以上的系统可以在native层修改构造函数的属性使其变为私有函数,然后,在native层创建空的ArtMethod对象,将调用属性信息备份至该在native层上的ArtMethod对象中,并返回ArtMethod对象的指针信息,接着将该指针保存在java层对应的Method的结构中。
为了加快函数回调的速度,本实施例中会将备份的调用属性信息存储在一个Map对中,其中key为原函数的函数名,value为该备份函数调用属性信息的method对象。可以通过函数找到对应的函数的method对象,然后执行invoke反射调用就可以实现原函数的调用了。
205、终端将原函数的调用属性信息替换为目标函数的调用属性信息。
其中,原函数的调用属性信息可以包括:原函数的调用地址信息即入口地址信息;此时,可以将原函数的调用地址信息替换为目标函数的调用地址信息。
实际应用中,函数的调用地址信息保持在其地址属性中,比如,该地址属性可以为entry_point_from_quick_compiled_code_,其是函数或者ArtMehod对象的属性,保存了code_offset(代码偏移位置)_地址和参数base,也就是code_offset和base地址相加即为真实执行的二进制代码的地址。
那么,此时,可将原函数的地址属性替换为目标函数的地址属性,既可以实现将原函数的调用地址信息替换为目标函数的调用地址信息。
206、终端在调用原函数时根据目标函数的调用属性信息跳转至执行目标函数。
具体地,接收原函数的调用指令,根据该调用指令获取目标函数的调用地址,然后,根据该调用地址跳转至执行目标函数。
207、终端在需要回调原函数时根据ArtMethod对象中的调用属性信息回调该原函数。
具体地,在回调原函数时可以根据(invoke)反射调用机制和该方法对象中的调用属性信息回调该原函数。
对于android5.0和5.1系统,在回调原函数时可以直接从java层的ArtMethod对象中获取调用属性信息,然后,根据该调用属性信息回调该原函数。
对于6.0及以上的系统,在回调原函数时可以根据java层中Method对象中指针信息查找native层对应的ArtMethod对象,然后,从该ArtMethod对象获取调用属性信息,根据该调用属性信息回调原函数。
实际应用中,采用反射调用机制,会在回调原函数时先调用FindeVirtualMethodForVirtualOrInterface判断待回调的原函数是否为直接函数若是,则直接根据该java层中的指针信息查找对应的方法对象,然后根据查找到的方法对象内的调用属性信息回调该原函数。若未非直接函数即为虚函数,根据对应的虚函数的序号获取对应的函数对象信息。
由上可知,本发明实施例采用终端调用方法构造函数,然后,根据该方法构造函数创建空的方法对象,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以在非root模式下不用替换libart.so文件即可实现对原函数的替换操作以及回调,其无需对终端进行root,因此,相对于现有技术而言,提高终端系统的安全性以及函数替换、回调的效率。
实施例三、
为了更好地实施上述方法,本发明实施例还提供一种函数调用装置,如图3所示,该函数调用装置可以包括创建单元301备份单元302、替换单元303、调用单元304和回调单元305,如下:
(1)创建单元301;
创建单元301,用于创建单元。
比如,在ART模式下,创建单元301可以创建空的ArtMethod对象,该的ArtMethod对象用于保存待替换的原函数的调用属性信息,该方法对象即为ArtMethod对象。
可选地,为了提高函数调用装置的应用性以及灵活性,该创建单元301可以包括:
属性修改子单元,用于对系统提供的方法构造函数的属性进行修改,以使得该方法构造函数为公用函数;
创建子单元,用于调用该方法构造函数,并根据该方法构造函数创建空的方法对象。
可选地,该创建单元301具体用于:在系统本地层或者应用层(如java层)创建空的方法对象。(2)备份单元302;
备份单元302,用于将原函数的调用属性信息备份至该方法对象中。
具体地,备份单元302可以将原函数的调用属性信息拷贝一份保存至方法对象中。
在创建单元301在系统本地层创建空的方法对象时,备份单元302,具体可以用于:将该原函数的调用属性信息备份至系统本地层的该方法对象,将该方法对象对应的指针信息保存在该应用层。
又比如,为了能够确保能够回调原函数,该备份单元302可以包括:
修改子单元,用于对该原函数的调用属性信息进行修改,以使得该原函数的属性包含私有类型;
备份子单元,用于将修改后的调用属性信息备份至该方法对象。(3)替换单元303;
替换单元303,用于将该原函数的调用属性信息替换为目标函数的调用属性信息。
比如,该原函数的调用属性信息包括:原函数的调用地址信息;该替换单元303,具体可以用于将原函数的调用地址信息替换为目标函数的调用地址信息。替换单元303可将原函数的地址属性替换为目标函数的地址属性,既可以实现将原函数的调用地址信息替换为目标函数的调用地址信息。
(4)调用单元304;
调用单元304,用于在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数。
调用单元304,用于接收原函数的调用指令,根据该调用指令获取原函数的调用属性信息,然后,根据该调用属性信息跳转至执行目标函数。
比如,将原函数A的调用地址信息替换为目标函数C的调用地址信息,此时,在调用原函数A时获取目标函数C的调用地址信息,然后,根据目标函数C的调用地址信息跳转至执行目标函数C。
(5)回调单元305;
回调单元305,用于在回调原函数时根据该方法对象中的调用属性信息回调该原函数。
具体地,回调单元305用于在回调原函数时可以根据(invoke)反射调用机制和该方法对象中的调用属性信息回调该原函数。
实际应用中,回调单元305采用反射调用机制,会在回调原函数时先判断待回调的原函数是否为直接函数(如通过FindeVirtualMethodForVirtualOrInterface判断),若是,则直接根据该应用层中的指针信息查找对应的方法对象,然后根据查找到的方法对象内的调用属性信息回调该原函数。若未非直接函数即为虚函数,根据对应的虚函数的序号获取对应的函数对象信息。具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
该函数调用装置具体可以集成在终端等设备中,该终端具体可以为手机或平板电脑等设备。
由上可知,本发明实施例采用创建单元301创建空的方法对象,然后,由备份单元302将原函数的调用属性信息备份至该方法对象中,由替换单元303将该原函数的调用属性信息替换为目标函数的调用属性信息,由调用单元304在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,由回调单元305在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以在非root模式下不用替换libart.so文件即可实现对原函数的替换操作以及回调,其无需对终端进行root,因此,相对于现有技术而言,提高终端系统的安全性以及函数替换、回调的效率。
实施例四、
此外,本发明实施例还提供一种终端,如图4所示,该终端可以包括射频(RF,RadioFrequency)电路401、包括有一个或一个以上计算机可读存储介质的存储器402、输入单元403、显示单元404、传感器405、音频电路406、无线保真(WiFi,Wireless Fidelity)模块407、包括有一个或者一个以上处理核心的处理器408、以及电源409等部件。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路401可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器408处理;另外,将涉及上行的数据发送给基站。通常,RF电路401包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM,Subscriber Identity Module)卡、收发信机、耦合器、低噪声放大器(LNA,Low Noise Amplifier)、双工器等。此外,RF电路401还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(GSM,Global System of Mobile communication)、通用分组无线服务(GPRS,GeneralPacket Radio Service)、码分多址(CDMA,Code Division Multiple Access)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)、长期演进(LTE,Long TermEvolution)、电子邮件、短消息服务(SMS,Short Messaging Service)等。
存储器402可用于存储软件程序以及模块,处理器408通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器408和输入单元403对存储器402的访问。
输入单元403可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元403可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器408,并能接收处理器408发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元403还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元404可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元404可包括显示面板,可选的,可以采用液晶显示器(LCD,Liquid Crystal Display)、有机发光二极管(OLED,Organic Light-Emitting Diode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器408以确定触摸事件的类型,随后处理器408根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图4中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面与显示面板集成而实现输入和输出功能。
终端还可包括至少一种传感器405,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路406、扬声器,传声器可提供用户与终端之间的音频接口。音频电路406可将接收到的音频数据转换后的电信号,传输到扬声器,由扬声器转换为声音信号输出;另一方面,传声器将收集的声音信号转换为电信号,由音频电路406接收后转换为音频数据,再将音频数据输出处理器408处理后,经RF电路401以发送给比如另一终端,或者将音频数据输出至存储器402以便进一步处理。音频电路406还可能包括耳塞插孔,以提供外设耳机与终端的通信。
WiFi属于短距离无线传输技术,终端通过WiFi模块407可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图4示出了WiFi模块407,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器408是终端的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行终端的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器408可包括一个或多个处理核心;优选的,处理器408可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器408中。
终端还包括给各个部件供电的电源409(比如电池),优选的,电源可以通过电源管理系统与处理器408逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源409还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器408会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器408来运行存储在存储器402中的应用程序,从而实现各种功能:
创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数。
其中,该处理器408可以具体执行如下操作:
对系统提供的方法构造函数的属性进行修改,以使得所述方法构造函数为公用函数;
调用所述方法构造函数,并根据所述方法构造函数创建空的方法对象。
该处理器408可以具体执行如下操作:
在系统本地层创建空的方法对象,将所述原函数的调用属性信息备份至系统本地层的所述方法对象,将所述方法对象对应的指针信息保存在所述应用层。
该处理器408可以具体执行如下操作:
根据所述应用层中的指针信息查找对应的方法对象;
根据查找到的方法对象内的调用属性信息回调所述原函数。
上述操作具体可参见前面的方法实施例,在此不再赘述。
由上可知,本发明实施例终端采用创建空的方法对象,然后,将原函数的调用属性信息备份至该方法对象中,将该原函数的调用属性信息替换为目标函数的调用属性信息,在调用原函数时根据该目标函数的调用属性信息跳转至执行目标函数,在回调原函数时根据该方法对象中的调用属性信息回调该原函数;该方案可以在非root模式下不用替换libart.so文件即可实现对原函数的替换操作以及回调,其无需对终端进行root,因此,相对于现有技术而言,提高终端系统的安全性以及函数替换、回调的效率。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,RandomAccess Memory)、磁盘或光盘等。
以上对本发明实施例所提供的一种函数调用方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (12)
1.一种函数调用方法其特征在于,包括:
创建空的方法对象;
将原函数的调用属性信息备份至所述方法对象中;
将所述原函数的调用属性信息替换为目标函数的调用属性信息;
在调用原函数时根据所述目标函数的调用属性信息跳转至执行目标函数;
在回调原函数时根据所述方法对象中的调用属性信息回调所述原函数。
2.如权利要求1所述的函数调用方法,其特征在于,所述创建空的方法对象,包括:
对系统提供的方法构造函数的属性进行修改,以使得所述方法构造函数为公用函数;
调用所述方法构造函数,并根据所述方法构造函数创建空的方法对象。
3.如权利要求1所述的函数调用方法,其特征在于,
所述创建空的方法对象,包括:在系统本地层创建空的方法对象;
所述将原函数的调用属性信息备份至所述方法对象中,包括:
将所述原函数的调用属性信息备份至系统本地层的所述方法对象;
将所述方法对象对应的指针信息保存在所述应用层。
4.如权利要求3所述的函数调用方法,其特征在于,在回调原函数时根据所述方法对象中的调用属性信息回调所述原函数,包括:
根据所述应用层中的指针信息查找对应的方法对象;
根据查找到的方法对象内的调用属性信息回调所述原函数。
5.如权利要求1所述的函数调用方法,其特征在于,将原函数的调用属性信息备份至所述方法对象中,包括:
对所述原函数的调用属性信息进行修改,以使得所述原函数的属性包含私有类型;
将修改后的调用属性信息备份至所述方法对象。
6.如权利要求1所述的函数调用方法,其特征在于,所述原函数的调用属性信息包括:原函数的调用地址信息;
所述将所述原函数的调用属性信息替换为目标函数的调用属性信息,包括:
将原函数的调用地址信息替换为目标函数的调用地址信息。
7.一种函数调用装置,其特征在于,包括:
创建单元,用于创建单元;
备份单元,用于将原函数的调用属性信息备份至所述方法对象中;
替换单元,用于将所述原函数的调用属性信息替换为目标函数的调用属性信息;
调用单元,用于在调用原函数时根据所述目标函数的调用属性信息跳转至执行目标函数;
回调单元,用于在回调原函数时根据所述方法对象中的调用属性信息回调所述原函数。
8.如权利要求7所述的函数调用装置,其特征在于,创建单元包括:
属性修改子单元,用于对系统提供的方法构造函数的属性进行修改,以使得所述方法构造函数为公用函数;
创建子单元,用于调用所述方法构造函数,并根据所述方法构造函数创建空的方法对象。
9.如权利要求7所述的函数调用装置,其特征在于,所述创建单元具体用于:在系统本地层创建空的方法对象;
所述备份单元,具体用于:将所述原函数的调用属性信息备份至系统本地层的所述方法对象,将所述方法对象对应的指针信息保存在所述应用层。
10.如权利要求9所述的函数调用装置,其特征在于,所述回调单元,具体用于:
根据所述应用层中的指针信息查找对应的方法对象;
根据查找到的方法对象内的调用属性信息回调所述原函数。
11.如权利要求7所述的函数调用装置,其特征在于,所述备份单元,具体用于:
修改子单元,用于对所述原函数的调用属性信息进行修改,以使得所述原函数的属性包含私有类型;
备份子单元,用于将修改后的调用属性信息备份至所述方法对象。
12.如权利要求7所述的函数调用装置,其特征在于,所述原函数的调用属性信息包括:原函数的调用地址信息;
所述替换单元,具体用于将原函数的调用地址信息替换为目标函数的调用地址信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610970407.6A CN106502703B (zh) | 2016-10-27 | 2016-10-27 | 一种函数调用方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610970407.6A CN106502703B (zh) | 2016-10-27 | 2016-10-27 | 一种函数调用方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106502703A true CN106502703A (zh) | 2017-03-15 |
CN106502703B CN106502703B (zh) | 2020-07-03 |
Family
ID=58322849
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610970407.6A Active CN106502703B (zh) | 2016-10-27 | 2016-10-27 | 一种函数调用方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106502703B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107423093A (zh) * | 2017-07-21 | 2017-12-01 | 珠海市魅族科技有限公司 | 控制方法及装置、计算机装置和计算机可读存储介质 |
CN107832096A (zh) * | 2017-09-29 | 2018-03-23 | 五八有限公司 | 统一资源定位符配置方法及终端 |
CN108021357A (zh) * | 2017-11-20 | 2018-05-11 | 北京奇虎科技有限公司 | 程序调用的优化方法及装置 |
CN108830268A (zh) * | 2018-05-28 | 2018-11-16 | 北京小米移动软件有限公司 | 内容获取方法、装置、终端及存储介质 |
CN108959070A (zh) * | 2018-06-13 | 2018-12-07 | 珠海金山网络游戏科技有限公司 | 一种基于代码对象的Python钩子函数方法和装置 |
CN109753799A (zh) * | 2018-12-14 | 2019-05-14 | 厦门安胜网络科技有限公司 | 一种Android应用程序防篡改的方法、系统及计算机存储介质 |
CN110046497A (zh) * | 2018-01-16 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 一种函数挂钩实现方法、装置和存储介质 |
CN111352629A (zh) * | 2018-12-24 | 2020-06-30 | 北京奇虎科技有限公司 | 一种程序调用的优化方法及装置 |
CN111510457A (zh) * | 2020-04-20 | 2020-08-07 | 同盾(广州)科技有限公司 | 函数攻击的检测方法、装置、电子设备及可读介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102831344A (zh) * | 2012-07-27 | 2012-12-19 | 北京奇虎科技有限公司 | 一种进程的处理方法和装置 |
CN105335200A (zh) * | 2015-11-24 | 2016-02-17 | 小米科技有限责任公司 | 系统升级方法及装置 |
-
2016
- 2016-10-27 CN CN201610970407.6A patent/CN106502703B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102831344A (zh) * | 2012-07-27 | 2012-12-19 | 北京奇虎科技有限公司 | 一种进程的处理方法和装置 |
CN105335200A (zh) * | 2015-11-24 | 2016-02-17 | 小米科技有限责任公司 | 系统升级方法及装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107423093A (zh) * | 2017-07-21 | 2017-12-01 | 珠海市魅族科技有限公司 | 控制方法及装置、计算机装置和计算机可读存储介质 |
CN107832096A (zh) * | 2017-09-29 | 2018-03-23 | 五八有限公司 | 统一资源定位符配置方法及终端 |
CN108021357A (zh) * | 2017-11-20 | 2018-05-11 | 北京奇虎科技有限公司 | 程序调用的优化方法及装置 |
CN110046497A (zh) * | 2018-01-16 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 一种函数挂钩实现方法、装置和存储介质 |
CN108830268A (zh) * | 2018-05-28 | 2018-11-16 | 北京小米移动软件有限公司 | 内容获取方法、装置、终端及存储介质 |
CN108959070A (zh) * | 2018-06-13 | 2018-12-07 | 珠海金山网络游戏科技有限公司 | 一种基于代码对象的Python钩子函数方法和装置 |
CN108959070B (zh) * | 2018-06-13 | 2022-05-10 | 珠海金山网络游戏科技有限公司 | 一种基于代码对象的Python钩子函数方法和装置 |
CN109753799A (zh) * | 2018-12-14 | 2019-05-14 | 厦门安胜网络科技有限公司 | 一种Android应用程序防篡改的方法、系统及计算机存储介质 |
CN109753799B (zh) * | 2018-12-14 | 2021-01-15 | 厦门安胜网络科技有限公司 | 一种Android应用程序防篡改的方法、系统及计算机存储介质 |
CN111352629A (zh) * | 2018-12-24 | 2020-06-30 | 北京奇虎科技有限公司 | 一种程序调用的优化方法及装置 |
CN111510457A (zh) * | 2020-04-20 | 2020-08-07 | 同盾(广州)科技有限公司 | 函数攻击的检测方法、装置、电子设备及可读介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106502703B (zh) | 2020-07-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106502703A (zh) | 一种函数调用方法和装置 | |
CN103942113B (zh) | 系统重启原因的检测方法、装置及终端设备 | |
CN104951212B (zh) | 一种移动终端的桌面数据处理方法、装置和系统 | |
CN103389863B (zh) | 一种显示控制方法和装置 | |
CN103677899B (zh) | 安装应用程序的方法及设备 | |
CN104519485A (zh) | 一种终端之间的通信方法、装置和系统 | |
CN103631580B (zh) | 一种生成主题图标的方法和装置 | |
CN105022616A (zh) | 一种生成网页页面的方法及装置 | |
CN106570358A (zh) | 应用的权限设置方法和装置 | |
CN104301315A (zh) | 一种限制信息访问的方法和装置 | |
CN111095199B (zh) | 一种加载应用的方法及终端设备 | |
CN106484518A (zh) | 一种多开应用的显示方法、装置及终端 | |
CN107040610A (zh) | 数据同步方法、装置、存储介质、终端以及服务器 | |
CN106775833A (zh) | 设备驱动程序加载方法、终端及系统 | |
CN106713608A (zh) | 应用的功能状态修改方法、装置及终端 | |
CN106547844A (zh) | 一种用户界面的处理方法和装置 | |
CN106529332B (zh) | 一种移动终端的权限控制方法、装置及移动终端 | |
CN106529312A (zh) | 一种移动终端的权限控制方法、装置及移动终端 | |
CN108920220A (zh) | 一种函数调用的方法、装置及终端 | |
CN111966491B (zh) | 统计占用内存的方法及终端设备 | |
CN105955597A (zh) | 信息显示方法及装置 | |
US20160308879A1 (en) | Application-Based Service Providing Method, Apparatus, and System | |
CN104699501A (zh) | 一种运行应用程序的方法及装置 | |
CN106681884B (zh) | 一种系统调用的监控方法和装置 | |
CN103631592B (zh) | 一种显示资源的配置、调用方法、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |