著录项信息
专利名称 | 一种API的拦截方法、装置及移动终端 |
申请号 | CN201210252551.8 | 申请日期 | 2012-07-20 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2013-01-02 | 公开/公告号 | CN102855138A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/44 | IPC分类号 | G;0;6;F;9;/;4;4查看分类表>
|
申请人 | 腾讯科技(深圳)有限公司 | 申请人地址 | 广东省深圳市福田区赛格科技园2栋东403室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 腾讯科技(深圳)有限公司 | 当前权利人 | 腾讯科技(深圳)有限公司 |
发明人 | 张立春 |
代理机构 | 北京三高永信知识产权代理有限责任公司 | 代理人 | 滕一斌 |
摘要
本发明公开了一种API的拦截方法、装置及移动终端,属于移动终端领域。所述方法包括:根据API进程的进程标识在系统对应的虚拟机中对所述API进程进行实时监控;当API进程被启动时,根据API进程的进程标识从内存中获取所述API进程对应的虚拟机实例;根据待拦截API的标识信息从所述API进程对应的虚拟机实例中将所述待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,所述第二语言与第一代码相区别;通过第二函数实现对API进程的控制。所述装置包括:监控模块、获取模块和替换模块。本发明能够对应用的功能进行扩展或修改。
一种API的拦截方法、装置及移动终端\n技术领域\n[0001] 本发明涉及移动终端领域,特别涉及一种API(Application Programming Interface,应用程序编程接口)的拦截方法、装置及移动终端。\n背景技术\n[0002] 随着Android(安卓)系统的快速发展,使用Android系统的终端越来越多,Android系统是一个开放源代码系统,可以在使用Android系统终端内安装应用,Android系统为该应用提供运行环境。\n[0003] 目前,厂商在生产使用Android系统的终端时,可以直接在终端内内置应用,用户也可以根据自己的需要在终端内安装其他的应用;这些应用都是由相应的厂商提供,且每个应用在开发完成后,每个应用的功能都固定下来了,不可以对应用的功能进行扩展或进行修改。\n发明内容\n[0004] 为了能够对应用的功能进行扩展或修改,本发明提供了一种拦截函数的方法及装置。所述技术方案如下:\n[0005] 一种应用程序编程接口API的拦截方法,所述方法包括:\n[0006] 根据API进程的进程标识在系统对应的虚拟机中对所述API进程进行实时监控;\n[0007] 当API进程被启动时,根据API进程的进程标识从内存中获取所述API进程对应的虚拟机实例;\n[0008] 根据待拦截API的标识信息从所述API进程对应的虚拟机实例中将所述待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,代码指向地址对应一个存储空间,所述存储空间为终端磁盘中的空间,所述第二API用于实现修改后的步骤;\n[0009] 使所述API进程根据所述第二API的代码指向地址调用实现所述第二API的代码并运行实现所述第二API的代码;\n[0010] 通过第二函数实现对API进程的控制。\n[0011] 所述根据API进程的进程标识在系统对应的虚拟机中对所述API进程进行实时监控,包括:\n[0012] 监控系统对应的虚拟机开始运行所述API进程的进程标识对应的API进程时,则监控出所述API进程被启动。\n[0013] 所述待拦截的API的标识信息至少包括所述待拦截的API所属类的类标识和所述待拦截的API的函数标识。\n[0014] 所述根据待拦截API的标识信息从所述API进程对应的虚拟机实例中将所述待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,包括:\n[0015] 根据所述类标识,从所述API进程对应的虚拟机实例中获取所述待拦截的第一API所属的类对应的类结构体;\n[0016] 根据所述待拦截的第一API的函数标识,从所述类结构体中获取所述待拦截的第一API对应的函数结构体;\n[0017] 将所述函数结构体中存储的所述待拦截的第一API的代码指向地址替换为已存储的第二API的代码指向地址。\n[0018] 所述第二计算机语言为C语言或C++语言。\n[0019] 一种应用程序编程接口API的拦截装置,所述装置包括:\n[0020] 监控模块,用于根据API进程的进程标识在系统对应的虚拟机中对所述API进程进行实时监控;\n[0021] 获取模块,用于当API进程被启动时,根据API进程的进程标识从内存中获取所述API进程对应的虚拟机实例;\n[0022] 拦截模块,用于根据待拦截API的标识信息从所述API进程对应的虚拟机实例中将所述待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,其中,代码指向地址对应一个存储空间,所述存储空间为终端磁盘中的空间,所述第二API用于实现修改后的步骤;使所述API进程根据所述第二API的代码指向地址调用实现所述第二API的代码并运行实现所述第二API的代码;\n[0023] 通过第二函数实现对API进程的控制。\n[0024] 所述监控模块,具体用于监控系统对应的虚拟机开始运行所述API进程的进程标识对应的API进程时,则监控出所述API进程被启动。\n[0025] 所述待拦截的API的标识信息至少包括所述待拦截的API所属类的类标识和所述待拦截的API的函数标识。\n[0026] 所述拦截模块包括:\n[0027] 第一获取单元,用于根据所述类标识,从所述API进程对应的虚拟机实例中获取所述待拦截的第一API所属的类对应的类结构体;\n[0028] 第二获取单元,用于根据所述待拦截的第一API的函数标识,从所述类结构体中获取所述待拦截的第一API对应的函数结构体;\n[0029] 替换单元,用于将所述函数结构体中存储的所述待拦截的第一API的代码指向地址替换为已存储的第二API的代码指向地址。\n[0030] 一种移动终端,其特征在于,包括所述的装置。\n[0031] 在本发明实施例中,根据API进程的进程标识在系统对应的虚拟机中对API进程进行实时监控;如果监控出API进程被启动,则根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;根据待拦截第一API的标识信息从API进程对应的虚拟机实例中将待拦截的函数的代码指向地址替换为已存储的第二API对应的代码指向地址,实现拦截API。\n附图说明\n[0032] 图1是本发明实施例1提供的一种API的拦截方法流程图;\n[0033] 图2是本发明实施例2提供的一种API的拦截方法流程图;\n[0034] 图3是本发明实施例3提供的第一种API的拦截装置结构示意图;\n[0035] 图4是本发明实施例4提供的第二种API的拦截装置结构示意图。\n具体实施方式\n[0036] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。\n[0037] 其中,在Android系统中运行的应用包括一个或多个类,每个类包括一个或多个API;该应用实现的功能可以分为多个步骤,每个步骤由一个或多个API来实现。其中,Android系统中的应用都在Android系统对应的虚拟机中运行,当该应用被启动时,Android系统创建用于运行该应用的进程,并在终端的内存中为该进程构建一个虚拟机实例,该虚拟机实例为一个结构体,使用该进程的进程标识来标识该虚拟机实例,该虚拟机实例中至少包括该应用包括的每个类对应的类结构体,还可以包括该应用包括的参数的类型和个数,每个类对应的类结构体分别使用每个类的类标识进行标识,对于任一个类,该类对应的类结构体中至少包括该类包括的每个API对应的函数结构体,每个API对应的函数结构体分别用每个API的函数标识进行标识,对于任一个API,该API对应的函数结构体内至少包括该API对应的代码指向地址,该代码指向地址对应一个存储空间,该存储空间用于存储实现该API的具体代码,且该存储空间为终端磁盘中的空间。\n[0038] 其中,当该进程被启动运行后并需要运行某API时,该进程根据该API所属的类的类标识,从其对应的虚拟机实例中获取该类的对应的类结构体,根据该API的函数标识,从该类对应的类结构中获取该API对应的函数结构体,从该函数结构体中获取该API对应的代码指向地址,根据该代码指向地址调用实现该API的代码,并运行实现该API的代码,如此实现了运行该API。\n[0039] 其中,该应用实现的功能可以分为多个步骤,每个步骤由一个或多个API来实现,当需要对该应用的功能进行修改或需要对该应用的功能进行扩展时,可以通过对该应用包括的某一个或某多个步骤进行修改,来实现对该应用的功能进行修改或扩展;其中,这些步骤都是由相应的API来实现,对实现这些步骤的API进行修改,就可以实现对这些步骤进行修改,为了便于说明将实现这些步骤的API称为待拦截的第一API,第一API为采用第一计算机语言编写的API,第一计算机语言可以为Java语言。\n[0040] 其中,在本实施例中,技术人员可以事先开发出第二API,第二API可以实现修改后的步骤,然后通过本发明的方法来拦截用于运行该应用的进程调用待拦截的第一API,并使用于运行该应用的进程来调用技术人员开发的第二API,如此实现对该应用的功能进行修改或对该应用的功能进行扩展;其中,第二API为采用第二计算机语言编写的API,第二计算机语言为C语言或C++语言等。\n[0041] 其中,需要说明的是,运行在Android系统中的应用包括的类可以为Java类,以及类包括的API可以Java API。\n[0042] 实施例1\n[0043] 如图1所示,本发明实施例提供了一种拦截函数的方法,包括:\n[0044] 步骤101:根据API进程的进程标识在系统对应的虚拟机中对API进程进行实时监控;\n[0045] 步骤102:当API进程被启动时,根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;\n[0046] 步骤103:根据待拦截API的标识信息从API进程对应的虚拟机实例中将待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,第二语言与第一代码相区别;\n[0047] 通过第二函数实现对API进程的控制。\n[0048] 在本发明实施例中,根据API进程的进程标识在系统对应的虚拟机中对API进程进行实时监控;如果监控出API进程被启动,则根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;根据待拦截第一API的标识信息从API进程对应的虚拟机实例中将待拦截的函数的代码指向地址替换为已存储的第二API对应的代码指向地址,实现拦截API。\n[0049] 实施例2\n[0050] 本发明实施例提供了一种拦截函数的方法。\n[0051] 其中,目标应用为需要进行功能扩展或需要进行功能修改的应用,可以通过对目标应用包括的某一个或某多个步骤进行修改来实现对目标应用的功能进行扩展或对目标应用的功能进行修改;其中,用于实现这些步骤的API为待拦截的第一API;且技术人员事先开发出第二API,第二API用于实现修改后的步骤,通过本实施例提供的方法对用于运行目标应用的API进程调用的待拦截的函数进行拦截,使API进程调用技术人员事先开发的第二API,如此实现对目标应用的功能进行扩展或对目标应用的功能进行修改。参见图2,该方法包括:\n[0052] 步骤201:根据API进程的进程标识在Android系统对应的虚拟机中实时对运行目标应用的API进程进行监控,如果监控出API进程被启动时,执行步骤202;\n[0053] 其中,Android系统中的应用都运行在Android系统对应的虚拟机中,当目标应用被启动时,Android系统创建用于运行目标应用的API进程,为API进程构建一个虚拟机实例,该虚拟机实例为一个结构体,且使用API进程的进程标识来标识该虚拟机实例,API进程对应的虚拟机实例中至少包括目标应用包括的每个类对应的类结构体,每类对应的类结构体分别使用每个类的类标识进行标识,对于任一个类,该类对应的类结构体中至少包括该类包括的每个API对应的函数结构体,每个API对应的函数结构体分别用每个API的函数标识进行标识,对于任一个API,该API对应的函数结构体内至少包括该API对应的代码指向地址;然后再启动API进程,将API进程放置在Android系统对应的虚拟机中,由该虚拟机来运行API进程。\n[0054] 其中,技术人员事先配置API进程的进程标识,且API进程的进程标识可以为API进程的名称,API进程的名称可以为目标应用的名称。\n[0055] 其中,本步骤可以具体为:根据事先配置的API进程的进程标识,实时对Android系统对应的虚拟机进行监控,当监控出Android系统对应的虚拟机开始运行API进程的进程标识对应的API进程时,则监控出API进程被启动。\n[0056] 例如,用于通话的应用为Android系统提供的一种应用,用于通话的应用包括两步:第一步,根据被叫号码进行拨号,第二步,连通主叫和被叫;第一步可以由用于实现拨号的API来实现,第二步可以由用于连通通话的API来实现;另外,需要说明的是:用于通话的应用包括一个用于通话的类,用于通话的类包括用于实现拨号的API和用于连通通话的API。\n[0057] 假设在本实施例中,需要对用于通话的应用实现的功能进行扩展,使用户在使用用于通话的应用进行拨打被叫号码时,可以显示被叫所在的地理位置,所以用于通话的应用为目标应用,需要对目标应用中包括的第一步进行修改,以及待拦截的第一API为实现第一步的用于实现拨号的API;其中,技术人员事先开发出一个第二API,第二API用于实现修改后的第一步,即第二API可以实现在拨打被叫号码时,显示被叫所在的地理位置。\n[0058] 其中,在Android系统中当目标应用被启动时,Android系统创建一个用于运行目标应用的API进程,在终端的内存中为该API进程构建一个如表1所示的虚拟机实例,使用API进程的进程标识ProcessID1来标识该虚拟机实例,该虚拟机实例中包括用于通话的类对应的类结构体,使用用于通话的类的类标识ClassID1来标识该类结构体,该类结构体中包括用于实现拨号的API对应的函数结构体和用于连通通话的API对应的函数结构体,使用用于实现拨号的API的函数标识FunctionID1来标识用于实现拨号的API对应的函数结构体,且该函数结构体中包括用于实现拨号的API对应的代码指向地址为Address1,使用用于连通通话的API的函数标识FunctionID2来标识用于连通通话的API对应的函数结构体,且该函数结构体中包括用于连通通话的API对应的代码指向地址为Address2。\n[0059] 表1\n[0060] \n[0061] 其中,技术人员事先开发出一个第二API,第二API的代码指向地址为Address11。\n相应地,根据API进程的进程标识ProcessID1实时对Android系统对应的虚拟机进行监控,当监控出虚拟机中开始运行API进程时,则判断出API进程被启动运行。\n[0062] 步骤202:根据API进程的进程标识在终端的内存中获取API进程对应的虚拟机实例;\n[0063] 例如,根据API进程的进程标识ProcessID1,从终端的内存中获取如表1所示的API进程对应的虚拟机实例。\n[0064] 步骤203:根据待拦截的第一API的标识信息从API进程对应的虚拟机实例中获取待拦截的第一API对应的代码指向地址,待拦截的第一API的标识信息包括待拦截的第一API所属类的类标识和待拦截的第一API的函数标识;\n[0065] 其中,技术人员事先配置待拦截的第一API的标识信息包括待拦截的第一API所属类的类标识和待拦截的第一API的函数标识。具体地,根据待拦截的第一API所属类的类标识,从API进程对应的虚拟机实例中获取待拦截的第一API所属类对应的类结构体,根据待拦截的第一API的函数标识从获取的类结构体中获取待拦截的第一API对应的函数结构体,从待拦截的第一API对应的函数结构体中获取待拦截的第一API对应的代码指向地址。\n[0066] 例如,在本实施例中,技术人员事先配置待拦截的第一API的标识信息包括待拦截的第一API所属的类的类标识ClassID1,以及待拦截的第一API的函数标识FunctionID1。\n[0067] 根据待拦截的第一API所属的类的类标识ClassID1,从如表1所示的API进程对应的虚拟机实例中获取待拦截的第一API所属的类对应的类结构体,根据待拦截的第一API的函数标识FunctionID1,从待拦截的第一API所属的类对应的类结构体中获取待拦截的第一API对应的函数结构体,从该函数结构体中获取待拦截的第一API对应的代码指向地址为Address1。\n[0068] 步骤204:在API进程对应的虚拟机实例中将待拦截的第一API的代码指向地址替换为已存储的第二API的代码指向地址。\n[0069] 其中,当API进程需要运行待拦截的第一API时,根据待拦截的第一API所属的类的类标识和待拦截的第一API的函数标识,从API进程对应的虚拟机实例中获取的代码指向地址为第二API的代码指向地址,如此使得API进程根据第二API的代码指向地址调用实现第二API的代码并运行实现第二API的代码,如此实现了对目标应用的功能进行修改或对目标应用的功能进行扩展。\n[0070] 例如,在如表1所示的API进程对应的虚拟机实例中,将待拦截的第一API的代码指向地址Address1替换为第二API的代码指向地址Address11,得到如表2所示的API进程对应的虚拟机实例。\n[0071] 表2\n[0072] \n[0073] 当API进程需要运行待拦截的第一API时,根据待拦截的第一API所属的类的类标识ClassID1和待拦截的第一API的函数标识FunctionID1,从如表2所示的虚拟机实例中获取的代码指向地址为Address11,如此使得API进程根据代码指向地址Address11调用实现第二API的代码并运行实现第二API的代码,如此实现了在拨打被叫号码时显示被叫所在地理位置。\n[0074] 在本发明实施例中,根据API进程的进程标识在Android系统对应的虚拟机中对API进程进行实时监控;如果监控出API进程被启动,则根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;根据待拦截第一API的标识信息从API进程对应的虚拟机实例中将待拦截的第一API的代码指向地址替换为已存储的第二API对应的代码指向地址,实现拦截所述待拦截的第一API。如此用于运行目标应用的API进程会根据替换后的代码指向地址调用并运行第二API的实现代码,而第二API用于实现目标应用进行修改或扩展的功能,从而实现对目标应用功能进行修改或扩展。\n[0075] 实施例3\n[0076] 如图3所示,本发明实施例提供了一种API的拦截装置,包括:\n[0077] 监控模块301,用于根据API进程的进程标识在系统对应的虚拟机中对API进程进行实时监控;\n[0078] 获取模块302,用于当API进程被启动时,根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;\n[0079] 拦截模块303,用于根据待拦截API的标识信息从API进程对应的虚拟机实例中将待拦截的采用第一计算机语言编写的第一API的代码指向地址替换为已存储的采用第二计算机语言编写的且与第一API相对应的第二API的代码指向地址,第二语言与第一代码相区别;\n[0080] 通过第二函数实现对API进程的控制。\n[0081] 其中,监控模块301,具体用于监控系统对应的虚拟机开始运行API进程的进程标识对应的API进程时,则监控出API进程被启动。\n[0082] 其中,待拦截的API的标识信息至少包括待拦截的API所属类的类标识和待拦截的API的函数标识。\n[0083] 其中,拦截模块303包括:\n[0084] 第一获取单元3031,用于根据该类标识,从API进程对应的虚拟机实例中获取待拦截的第一API所属的类对应的类结构体;\n[0085] 第二获取单元3032,用于根据待拦截的第一API的函数标识,从该类结构体中获取待拦截的第一API对应的函数结构体;\n[0086] 替换单元3033,用于将该函数结构体中存储的待拦截的第一API的代码指向地址替换为已存储的第二API的代码指向地址。\n[0087] 在本发明实施例中,根据API进程的进程标识在Android系统对应的虚拟机中对API进程进行实时监控;如果监控出API进程被启动,则根据API进程的进程标识从内存中获取API进程对应的虚拟机实例;根据待拦截第一API的标识信息从API进程对应的虚拟机实例中将待拦截的第一API的代码指向地址替换为已存储的第二API对应的代码指向地址,实现拦截所述待拦截的第一API。如此用于运行目标应用的API进程会根据替换后的代码指向地址调用并运行第二API的实现代码,而第二API用于实现目标应用进行修改或扩展的功能,从而实现对目标应用功能进行修改或扩展。\n[0088] 实施例4\n[0089] 本发明实施例提供了一种移动终端,包括实施例3所述的装置。\n[0090] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。\n[0091] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
法律信息
- 2020-09-18
专利权的转移
登记生效日: 2020.08.31
专利权人由腾讯科技(深圳)有限公司变更为腾讯科技(深圳)有限公司
地址由518000 广东省深圳市福田区赛格科技园2栋东403室变更为518000 广东省深圳市福田区振兴路赛格科技园2栋东403室
专利权人变更为腾讯云计算(北京)有限责任公司
- 2015-12-09
- 2013-02-20
实质审查的生效
IPC(主分类): G06F 9/44
专利申请号: 201210252551.8
申请日: 2012.07.20
- 2013-01-02
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2005-05-18
|
2003-11-13
| | |
2
| |
2011-08-10
|
2011-04-18
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |