CN107908391B - 程序调用的优化方法及装置 - Google Patents
程序调用的优化方法及装置 Download PDFInfo
- Publication number
- CN107908391B CN107908391B CN201711160146.2A CN201711160146A CN107908391B CN 107908391 B CN107908391 B CN 107908391B CN 201711160146 A CN201711160146 A CN 201711160146A CN 107908391 B CN107908391 B CN 107908391B
- Authority
- CN
- China
- Prior art keywords
- function
- target
- jump
- target function
- primitive
- 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.)
- Active
Links
Images
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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- 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/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- 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/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45562—Creating, deleting, cloning virtual machine instances
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
本发明公开了一种程序调用的优化方法及装置,涉及一种应用开发技术领域,主要目的在于解决现有在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用的问题。主要技术方案:当触发调用目标函数操作时,判断原函数是否执行挂钩操作;若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。主要用于程序调用的优化。
Description
技术领域
本发明涉及一种应用开发技术领域,特别是涉及一种程序调用的优化方法及装置。
背景技术
随着操作系统应用开发技术的快速发展,使用虚拟化技术对操作系统底层进行处理、开发以及成为主流手段。其中,安卓运行时(Android runtime,ART)虚拟机区别于传统的Dalvik虚拟机,使用预编译技术取代Dalvik中的及时编译技术,加快了应用程序的启动和执行。
目前,由于安卓4.4之后的版本中,ART虚拟机在使用函数调用来处理多开应用的业务时,采用本地函数执行及解释函数执行并存的方式,ART虚拟机采用桥接函数来实现本地函数调用解释函数以及解释函数调用本地函数,但是,在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,如Art虚拟机中的native层Method1,调用解释器中的.dex格式的Method2,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用,因此,对程序调用的优化已经成为亟待解决的问题。
发明内容
有鉴于此,本发明提供一种程序调用的优化方法及装置,主要目的在于解决现有在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用的问题。
依据本发明一个方面,提供了一种程序调用的优化方法,包括:
当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
进一步地,所述方法还包括:
若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
进一步地,所述若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
若存在跳转标识,则解析所述目标函数中的参数;
若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数;
通过结合桥接函数使得所述原函数调用所述目标函数。
进一步地,所述方法还包括:
若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
进一步地,所述当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
进一步地,所述若存在跳转标识,则解析所述目标函数中的参数之后,所述方法还包括:
将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
进一步地,所述当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数包括:
根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
进一步地,所述通过预置指向指令跳转至替换函数进行处理之后,所述方法还包括:
将所述转换格式标识进行重置。
依据本发明一个方面,提供了一种程序调用的优化装置,包括:
判断单元,用于当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
处理单元,用于若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
进一步地,所述装置还包括:
调用单元,用于若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
进一步地,所述处理单元包括:
判断模块,用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
解析模块,用于若存在跳转标识,则解析所述目标函数中的参数;
处理模块,用于若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
第一执行模块,用于当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数;
调用模块,用于通过结合桥接函数使得所述原函数调用所述目标函数。
进一步地,所述处理单元还包括:
第二执行模块,用于若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
进一步地,所述判断模块,具体用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
进一步地,所述处理单元还包括:
存储模块,用于将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
进一步地,所述第一执行模块,具体用于根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
进一步地,所述处理单元还包括:
重置模块,用于将所述转换格式标识进行重置。
根据本发明的又一方面,提供了一种存储介质,所述存储介质中存储有至少一可执行指令,所述可执行指令使处理器执行如上述程序调用的优化方法对应的操作。
根据本发明的再一方面,提供了一种终端,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行上述程序调用的优化方法对应的操作。
借由上述技术方案,本发明实施例提供的技术方案至少具有下列优点:
本发明提供了一种程序调用的优化方法及装置,首先当触发调用目标函数操作时,判断原函数是否执行挂钩操作,若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数。与现有在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用相比,本发明实施例通过作为本地函数的原函数在进行挂钩操作时,通过跳转模板结合桥接函数方式将未格式优化的解释函数进行格式优化,从而实现本地函数对解释函数的调用,且无需人为处理转换格式,提高程序调用的优化效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种程序调用的优化方法流程图;
图2示出了本发明实施例提供的另一种程序调用的优化方法流程图;
图3示出了本发明实施例提供的一种跳转模板流程图;
图4示出了本发明实施例提供的一种跳转模板结合桥接函数处理流程图;
图5示出了本发明实施例提供的一种桥接函数处理流程图;
图6示出了本发明实施例提供的一种程序调用的优化装置框图;
图7示出了本发明实施例提供的另一种程序调用的优化装置框图;
图8示出了本发明实施例提供的一种终端示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明实施例提供了一种程序调用的优化方法,如图1所示,所述方法包括:
101、当触发调用目标函数操作时,判断原函数是否执行挂钩操作。
其中,所述挂钩操作即为内联挂钩Inline Hook操作,针对函数的机器码进行内联Hook,机器码为由ART编译后的二进制码。另外,Hook函数为一种钩子函数,是操作系统消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息,钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统,而Inline Hook不同于以前通过修改函数的调用地址的普通Hook,而是直接在函数的函数体内修改指令,用一个跳转指令实现挂钩的目的。
需要说明的是,原函数为ART虚拟机中待调用解释函数的本地函数,目标函数为待被调用的解释函数,位于一个虚拟的解释器中。而挂钩操作即是对ART虚拟机中已经进行格式优化过的本地函数执行挂钩操作,一般的,若原函数需要调用的解释函数已经被格式优化过了,则原函数不会被挂钩,若原函数需要调用的函数未被格式优化,则原函数会被挂钩。其中,原函数可以为执行业务需求的DEX格式的程序,如获取链接地址的DEX格式程序、计时的DEX格式程序等,目标函数可以为根据原函数执行业务需求的ELF格式的程序,如需要获取链接地址对象的ELF格式程序、需要计时的ELF格式程序等,本发明实施例不做具体限定。
102、若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数。
其中,所述跳转模板用于对所述目标函数进行格式优化若原函数执行挂钩操作,则说明待调用的解释函数为未格式优化的函数,所述跳转模板为一个用于将目标函数的格式进行转换的空间内存,所述桥接函数为原函数提供解释模式下的函数调用栈及参数,并调用解释器执行的函数,即目标函数。通过结合桥接函数将解释函数作为目标函数进行格式转换,从而实现本地函数调用的函数为格式优化后的解释函数。
本发明提供了一种程序调用的优化方法,与现有在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用相比,本发明实施例通过作为本地函数的原函数在进行挂钩操作时,通过跳转模板结合桥接函数方式将未格式优化的解释函数进行格式优化,从而实现本地函数对解释函数的调用,且无需人为处理转换,提高程序调用的优化效率。
本发明实施例提供了另一种程序调用的优化方法,如图2所示,所述方法包括:
201、当触发调用目标函数操作时,判断原函数是否执行挂钩操作。
本步骤与图1所示的步骤101方法相同,在此不再赘述。
需要说明的是,ART虚拟机在运行时,内部运行是通过Class的类描述以及Method的类方法描述而执行的。其中,每一个Java函数都会对应一个Method结构体,Method结构体成员变量包括方法所在的类对象指针、方法的属性、方法在dex文件中的index,方法的机器码指针以及方法Native代码的指针等,在Native层调用Java函数得到目标函数的Method结构体。
202、当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识。
由于原函数执行挂钩操作后,即为原函数会通过Inline Hook操作的Hook函数钩取待调用的目标函数,即解释函数,因此,在原函数通过Hook函数钩取目标函数时,可以转化为本地函数调用本地函数的优化。其中,目标函数在进行被钩取之前,目标函数的头字节中配置了用于判断是否进行跳转的标识,即在目标函数被运行之前,需要判断目标函数中是否存在跳转标识,一般的,为了对需要优化的目标函数进行优化,在这些的目标函数中都会配置出跳转标识,以便直接跳转至模板中进行优化操作。
对于本发明实施例,步骤202具体可以为:当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
需要说明的是,为了在目标函数中的指令执行之前就对需要进行格式转换的目标函数进行格式转换,需要在目标函数的头字节中配置用于进行跳转的JMP指令,配置的JMP指令可以占用目标函数中的8个字节。因此,当前的步骤中,直接判断目标函数的头8个字节是否为JMP指令。
针对ART虚拟机中格式之间的转换,需要针对的是本地函数与本地函数之间调用时的优化,因此,本发明实施例中的原函数与目标函数均为本地函数时,才可以进行格式之间的转换。
对于本发明实施例,步骤202之后的步骤203、若存在跳转标识,则解析所述目标函数中的参数。
其中,所述参数为目标函数中是否进行空间转换的参数,对应的空间转换包括了函数之间的Java层到Native层,或者Native层Java层之间的转换,具体的参数包括用于体现函数格式的参数、用于体现函数是否进行转换的参数等,本发明实施例不做具体限定。
需要说明的是,一般的,对于参数的解析,具体可以预先设定一些需要进行转换的转换格式标识,根据转换格式标识与预设转换条件进行匹配,若不一致,则说明需要进行转换。尤其是,在ART虚拟机中的分身应用函数进行调用时,进一步地对待调用的函数确定是否需要进行转换格式。例如,游戏分身应用的DEX格式的获取广告链接地址的程序调用位于ART虚拟机底层中的ELF格式的链接地址程序时,就会出现原函数与目标函数的格式不一致的情况。
进一步地,本发明实施例203之后还可以包括:将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层。
其中,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息,所述预置线程为可以支持全局变量存储的容器,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息等,转换格式包括了Java层到Native层,或者Native层Java层之间的转换,例如,ELF格式与DEX文件等,本发明实施例不做具体限定。所述局部变量为预置线程中用于存储参数的限制局部变量,并且,由于从汇编层跳转至Java层进行调用函数时,会涉及到函数参数类型及空间转换等问题,因此ART虚拟机根据参数传递协议需要从寄存器及栈中解析参数,然后作为格式转换的依据。具体的,可以为将汇编对应的参数,以数组形式顺序存储至预置线程的局部变量中,并根据参数传递顺序及参数类型,将预置线程的局部变量对应的元素转换为对应的数据类型指针,传递至Java层。
204a、若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理。
其中,所述转换格式标识为用于体现是否进行转换格式的参数,对于本发明实施例,一般通过设置转换格式标识为特定的F,若F小于0,则设定为需要进行转换,并通过预置指向指令跳转至替换函数中进行转换处理,替换函数为可以进行格式转换的函数,即在跳转至格式转换的函数时,首先运行替换函数中的转换代码,然后将目标函数的ELF格式的函数转换为DEX格式的函数,然后判断是否进行回调原函数,本发明实施例不做具体限定。预置指向指令为用于将机器指令的替换函数中第一个执行指令的地址赋给PC寄存器中的指令,使得将当前执行的进程跳转至替换函数中,PC寄存器存储下一条要执行的指令地址,指示下一条要执行的指令,即实现跳转。
需要说明的是,由于原函数在调用目标函数时,针对ART虚拟机的运行特点,不同的函数之间的格式转换即可以通过跳转至替换函数进行格式转换。另外,由于各个函数之间通过Hook操作进行调用时,会存在不同的格式转换,因此,预置指向指令可以根据目标函数及原函数,动态配置替换函数的第一个指向指令的地址赋给PC寄存器,从而实现不同格式之间的动态转换。
204b、若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令。
如图3所示,当转换格式标识F大于0时,直接通过第二跳转指令JMP跳转至目标函数中,所述第二跳转指令用于跳转至所述目标函数,且第二跳转指令中动态配置有目标函数中的头8个字节,以便直接执行不需要进行格式转换的目标函数。对于步骤202与步骤203为预先在模板中设定的执行程序,而由于LDR指令与在F大于0时跳转回原函数的步骤是需要根据目标函数及替换函数的地址而变化的,因此,如图3所示,模板中对于的LDR及调回原函数是动态生成。
对于本发明实施例,步骤204a之后的步骤205、当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令。
对于本发明实施例,所述第一跳转指令用于跳转至所述原函数。
由于在执行完替换函数后,会出现需要进行返回原函数执行的格式转换后的目标函数,以及不需要返回原函数执行的格式转换后的目标函数,具体返回原函数执行的判断是根据系统的业务需求来确定,所述业务需求为调用函数的执行目的,包括业务执行的场景,如系统权限、参数过滤,一般的,针对系统权限的函数调用设置为不回调原函数,针对参数过滤的函数调用设置为回调原函数,由于业务需求的逻辑一般会写进函数指令中,因此,具体的判断依据可以根据解析目标函数中的参数进行确定,本发明实施例不做具体限定。第一跳转指令即为可以是当前执行线程跳转至原函数的JMP跳转指令,如图3所示,当替换函数执行完毕后,若原函数的业务需求为参数过滤则利用JMP回调原函数。
对于本发明实施例,步骤205具体可以为:根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
一般的,由于原函数所需要执行的业务需求可以通过函数中的标识来体现,因此,通过数据类型指针来逐一检测原函数中是否存在与业务需求对应的标识,从而确定是否需要进行回调原函数。
进一步地,对于本发明实施例,步骤205之后还包括:将所述转换格式标识进行重置。
为了避免在进行了回调原函数之后,通过如图3所示的跳转模板,再次跳转至替换函数中,形成死循环,因此,需要在执行过一次回调原函数后,将小于0的F重置为大于0的任意数值,以便使得当前执行进程跳转至目标函数中执行目标函数的内容。
对于本发明实施例,步骤205之后的步骤206、通过结合桥接函数使得所述原函数调用所述目标函数。
需要说明的是,由于解释函数需要通过为原函数提供解释模式下的函数调用栈及参数,因此在执行如图4所示其中,Hook替换函数使用跳转模板进行处理,需要结合桥接函数使得原函数调用目标函数,即通过本地函数在跳转模板进行进行Hook替换函数时,通过桥接函数调用解释函数。
对于本发明实施例,与步骤202a并列的步骤202b、若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
如图5所示的,桥接函数处理方式,若本地函数与解释函数均为格式优化过的函数,说明原函数没有被Hook,则通过桥接函数直接进行调用。
本发明提供了另一种程序调用的优化方法,本发明实施例通过作为本地函数的原函数在进行挂钩操作时,根据目标函数中头字节中的JMP指令跳转至跳转模板中进行参数解析,当解析到转换格式标识F小于0时,通过LDR调用替换函数进行格式转换,然后根据参数过滤类的业务需求来判断出进行回调原函数,在回调原函数时,重置转换格式标识,避免了因格式问题而导致的本地函数与解释函数的调用失败,从而实现DEX格式本地函数对ELF格式解释函数调用时的格式转换,无需人为转换,确保调用过程中保持格式的一致性,提高程序调用的优化效率。
进一步的,作为对上述图1所示方法的实现,本发明实施例提供了一种程序调用的优化装置,如图6所示,该装置包括:判断单元31、处理单元32。
判断单元31,用于当触发调用目标函数操作时,判断原函数是否执行挂钩操作;所述判断单元31为程序调用的优化装置执行当触发调用目标函数操作时,判断原函数是否执行挂钩操作的程序模块。
处理单元32,用于若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。所述处理单元32为程序调用的优化装置执行若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数的程序模块。
本发明提供了一种程序调用的优化装置,与现有在函数调用时,会出现已格式优化的本地函数调用未格式优化的解释函数,通过桥接函数进行调用时产生一级一级的栈,使得Hook函数钩取时,已格式优化的本地函数与未格式优化的解释函数无法实现调用相比,本发明实施例通过作为本地函数的原函数在进行挂钩操作时,通过跳转模板结合桥接函数方式将未格式优化的解释函数进行格式优化,从而实现本地函数对解释函数的调用,且无需人为处理转换,提高程序调用的优化效率。
进一步的,作为对上述图2所示方法的实现,本发明实施例提供了另一种程序调用的优化装置,如图7所示,该装置包括:判断单元41、处理单元42、调用单元43。
判断单元41,用于当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
处理单元42,用于若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
进一步地,所述装置还包括:
调用单元43,用于若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
进一步地,所述处理单元42包括:
判断模块4201,用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
解析模块4202,用于若存在跳转标识,则解析所述目标函数中的参数;
处理模块4203,用于若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
第一执行模块4204,用于当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数;
调用模块4205,用于通过结合桥接函数使得所述原函数调用所述目标函数。
进一步地,所述处理单元42还包括:
第二执行模块4206,用于若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
进一步地,所述判断模块4201,具体用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
进一步地,所述处理单元42还包括:
存储模块4207,用于将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
所述第一执行模块4204,具体用于根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
进一步地,所述处理单元42还包括:
重置模块4208,用于将所述转换格式标识进行重置。
本发明提供了另一种程序调用的优化装置,本发明实施例通过作为本地函数的原函数在进行挂钩操作时,根据目标函数中头字节中的JMP指令跳转至跳转模板中进行参数解析,当解析到转换格式标识F小于0时,通过LDR调用替换函数进行格式转换,然后根据参数过滤类的业务需求来判断出进行回调原函数,在回调原函数时,重置转换格式标识,避免了因格式问题而导致的本地函数与解释函数的调用失败,从而实现DEX格式本地函数对ELF格式解释函数调用时的格式转换,无需人为转换,确保调用过程中保持格式的一致性,提高程序调用的优化效率。
根据本发明一个实施例提供了一种存储介质,所述存储介质存储有至少一可执行指令,该计算机可执行指令可执行上述任意方法实施例中的程序调用的优化方法。
图8示出了根据本发明一个实施例提供的一种终端的结构示意图,本发明具体实施例并不对终端的具体实现做限定。
如图8所示,该终端可以包括:处理器(processor)502、通信接口(CommunicationsInterface)504、存储器(memory)506、以及通信总线508。
其中:处理器502、通信接口504、以及存储器506通过通信总线508完成相互间的通信。
通信接口504,用于与其它设备比如客户端或其它服务器等的网元通信。
处理器502,用于执行程序510,具体可以执行上述程序调用的优化方法实施例中的相关步骤。
具体地,程序510可以包括程序代码,该程序代码包括计算机操作指令。
处理器502可能是中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。终端包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器506,用于存放程序510。存储器506可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
程序510具体可以用于使得处理器502执行以下操作:
当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的程序调用的优化方法及装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明的实施例公开了:
A1、一种程序调用的优化方法,包括:
当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
A2、根据A1所述的方法,所述方法还包括:
若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
A3、根据A1或A2所述的方法,所述若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
若存在跳转标识,则解析所述目标函数中的参数;
若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数;
通过结合桥接函数使得所述原函数调用所述目标函数。
A4、根据A3所述的方法,所述方法还包括:
若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
A5、根据A4所述的方法,所述当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
A6、根据A5所述的方法,所述若存在跳转标识,则解析所述目标函数中的参数之后,所述方法还包括:
将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
A7、根据A6所述的方法,所述当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数包括:
根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
A8、根据A3-A7任一项所述的方法,所述通过预置指向指令跳转至替换函数进行处理之后,所述方法还包括:
将所述转换格式标识进行重置。
B9、一种程序调用的优化装置,包括:
判断单元,用于当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
处理单元,用于若所述原函数执行所述挂钩操作,则通过跳转模板以及结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化。
B10、根据B9所述的装置,所述装置还包括:
调用单元,用于若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
B11、根据B9或B10所述的装置,所述处理单元包括:
判断模块,用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
解析模块,用于若存在跳转标识,则解析所述目标函数中的参数;
处理模块,用于若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
第一执行模块,用于当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数;
调用模块,用于通过结合桥接函数使得所述原函数调用所述目标函数。
B12、根据B11所述的装置,所述处理单元还包括:
第二执行模块,用于若所述参数的转换合适标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
B13、根据B12所述的装置,
所述判断模块,具体用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为占用特定字节的JMP指令。
B14、根据B13所述的装置,所述处理单元还包括:
存储模块,用于将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
B15、根据B13所述的装置,
所述第一执行模块,具体用于根据所述数据类型指针检测所述原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
B16、根据B11-B15任一项所述的方法,所述处理单元还包括:
重置模块,用于将所述转换格式标识进行重置。
C17、一种存储介质,所述存储介质中存储有至少一可执行指令,所述可执行指令使处理器执行如A1-A8中任一项所述的程序调用的优化方法对应的操作。
D18、一种终端,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如A1-A8中任一项所述的程序调用的优化方法对应的操作。
Claims (18)
1.一种函数调用的优化方法,其特征在于,包括:
当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
若所述原函数执行所述挂钩操作,则通过跳转模板结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化;
所述跳转模板为一个用于将所述目标函数的格式进行转换的空间内存,所述桥接函数为所述原函数提供解释模式下的函数调用栈及参数。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
3.根据权利要求1或2所述的方法,其特征在于,所述若所述原函数执行所述挂钩操作,则通过跳转模板结合桥接函数调用所述目标函数,包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
若存在跳转标识,则解析所述目标函数中的参数;
若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数,所述业务需求为调用函数的执行目的;
通过结合桥接函数使得所述原函数调用所述目标函数。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
若所述参数的转换格式标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
5.根据权利要求4所述的方法,其特征在于,所述当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识包括:
当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为八个字节的JMP指令。
6.根据权利要求5所述的方法,其特征在于,所述若存在跳转标识,则解析所述目标函数中的参数之后,所述方法还包括:
将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
7.根据权利要求6所述的方法,其特征在于,所述当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数包括:
根据所述数据类型指针检测原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
8.根据权利要求3所述的方法,其特征在于,所述通过预置指向指令跳转至替换函数进行处理之后,所述方法还包括:
将所述转换格式标识进行重置。
9.一种函数调用的优化装置,其特征在于,包括:
判断单元,用于当触发调用目标函数操作时,判断原函数是否执行挂钩操作;
处理单元,用于若所述原函数执行所述挂钩操作,则通过跳转模板结合桥接函数调用所述目标函数,所述跳转模板用于对所述目标函数进行格式优化;
所述跳转模板为一个用于将所述目标函数的格式进行转换的空间内存,所述桥接函数为所述原函数提供解释模式下的函数调用栈及参数。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:
调用单元,用于若所述原函数没有执行钩取操作,则直接通过桥接函数调用所述目标函数。
11.根据权利要求9或10所述的装置,其特征在于,所述处理单元包括:
判断模块,用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中是否存在跳转标识;
解析模块,用于若存在跳转标识,则解析所述目标函数中的参数;
处理模块,用于若所述参数的转换格式标识小于预设转换条件,则通过预置指向指令跳转至替换函数进行处理;
第一执行模块,用于当所述替换函数执行完毕后,根据所述原函数的业务需求判断是否执行第一跳转指令,若所述业务需求确定为执行原函数,则执行所述第一跳转指令,所述第一跳转指令用于跳转至所述原函数,所述业务需求为调用函数的执行目的
调用模块,用于通过结合桥接函数使得所述原函数调用所述目标函数。
12.根据权利要求11所述的装置,其特征在于,所述处理单元还包括:
第二执行模块,用于若所述参数的转换格式标识大于预设转换条件,则执行第二跳转指令,所述第二跳转指令用于跳转至所述目标函数。
13.根据权利要求12所述的装置,其特征在于,
所述判断模块,具体用于当所述原函数通过Hook函数钩取目标函数时,判断所述目标函数中的头字节是否为八个字节的JMP指令。
14.根据权利要求13所述的装置,其特征在于,所述处理单元还包括:
存储模块,用于将解析后的参数存储在预置线程对应的局部变量中,并根据所述参数将所述局部变量中的元素转换为对应的数据类型指针,传递至Java层,所述参数包括转换格式信息、参数传递顺序信息、参数类型信息。
15.根据权利要求14所述的装置,其特征在于,
所述第一执行模块,具体用于根据所述数据类型指针检测原函数业务中是否存在需要执行所述原函数的标识,若存在需要执行所述原函数的标识,则执行所述第一跳转指令。
16.根据权利要求12-15任一项所述的装置,其特征在于,所述处理单元还包括:
重置模块,用于将所述转换格式标识进行重置。
17.一种存储介质,所述存储介质中存储有至少一可执行指令,所述可执行指令使处理器执行如权利要求1-8中任一项所述的函数调用的优化方法对应的操作。
18.一种终端,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如权利要求1-8中任一项所述的函数调用的优化方法对应的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711160146.2A CN107908391B (zh) | 2017-11-20 | 2017-11-20 | 程序调用的优化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711160146.2A CN107908391B (zh) | 2017-11-20 | 2017-11-20 | 程序调用的优化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107908391A CN107908391A (zh) | 2018-04-13 |
CN107908391B true CN107908391B (zh) | 2021-06-04 |
Family
ID=61846556
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711160146.2A Active CN107908391B (zh) | 2017-11-20 | 2017-11-20 | 程序调用的优化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107908391B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111352629B (zh) * | 2018-12-24 | 2024-06-18 | 北京奇虎科技有限公司 | 一种程序调用的优化方法及装置 |
CN112416366A (zh) * | 2019-08-23 | 2021-02-26 | 华为技术有限公司 | 一种Java语言动态挂钩子的方法、装置及设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7716686B1 (en) * | 2006-02-14 | 2010-05-11 | Mcafee, Inc. | System, method and computer program product for interface hooking |
CN104598809A (zh) * | 2015-02-13 | 2015-05-06 | 北京奇虎科技有限公司 | 程序的监控方法及其防御方法以及相关装置 |
CN106033370A (zh) * | 2015-03-16 | 2016-10-19 | 龙芯中科技术有限公司 | 64位Java虚拟机的实现方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9465717B2 (en) * | 2013-03-14 | 2016-10-11 | Riverbed Technology, Inc. | Native code profiler framework |
US9454676B2 (en) * | 2014-06-27 | 2016-09-27 | Intel Corporation | Technologies for preventing hook-skipping attacks using processor virtualization features |
-
2017
- 2017-11-20 CN CN201711160146.2A patent/CN107908391B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7716686B1 (en) * | 2006-02-14 | 2010-05-11 | Mcafee, Inc. | System, method and computer program product for interface hooking |
CN104598809A (zh) * | 2015-02-13 | 2015-05-06 | 北京奇虎科技有限公司 | 程序的监控方法及其防御方法以及相关装置 |
CN106033370A (zh) * | 2015-03-16 | 2016-10-19 | 龙芯中科技术有限公司 | 64位Java虚拟机的实现方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107908391A (zh) | 2018-04-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108021357B (zh) | 程序调用的优化方法及装置 | |
US20190324772A1 (en) | Method and device for processing smart contracts | |
CN110134386B (zh) | 一种程序编辑方法和装置 | |
CN109800005B (zh) | 一种客户端热更新方法及装置 | |
CN108304175B (zh) | 代码文件隔离打包方法及装置 | |
US8701129B2 (en) | Web API server program, web API publication method | |
CN111736913B (zh) | 类加载方法和装置 | |
CN111158756B (zh) | 用于处理信息的方法和装置 | |
WO2017081558A1 (en) | Monitoring and actuation of view controller parameters to reach deep states without manual developer intervention | |
CN107908391B (zh) | 程序调用的优化方法及装置 | |
CN115309562A (zh) | 算子调用系统、算子生成方法,电子设备 | |
CN112269565A (zh) | 基于容器的边缘设备运行方法、装置和系统 | |
CN107861807B (zh) | 程序调用的优化方法及装置 | |
CN111651169B (zh) | 基于web容器的区块链智能合约运行方法及系统 | |
CN106997313B (zh) | 一种应用程序的信号处理方法、系统及终端设备 | |
EP3872630B1 (en) | Request processing method and apparatus, electronic device, and computer storage medium | |
CN110826074A (zh) | 一种应用漏洞检测方法、装置和计算机可读存储介质 | |
WO2024016729A1 (zh) | 调用冲突的可视化方法及装置 | |
CN111596905A (zh) | 生成java对象的方法、装置、存储介质及终端 | |
CN110275710B (zh) | 一种Java本地接口一致性检查方法及系统、存储介质及终端 | |
CN107526706B (zh) | 一种分布式计算平台中的数据处理方法和装置 | |
CN110874214A (zh) | 一种功能调用方法、装置、电子设备和存储介质 | |
CN113010218B (zh) | 插件加载方法、装置、计算设备及计算机存储介质 | |
CN108829502B (zh) | 线程操作的实现方法和装置 | |
CN110442392B (zh) | 一种包隔离方法、装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | 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 |