CN111913741A - 对象拦截方法、装置、介质及电子设备 - Google Patents

对象拦截方法、装置、介质及电子设备 Download PDF

Info

Publication number
CN111913741A
CN111913741A CN202010894451.XA CN202010894451A CN111913741A CN 111913741 A CN111913741 A CN 111913741A CN 202010894451 A CN202010894451 A CN 202010894451A CN 111913741 A CN111913741 A CN 111913741A
Authority
CN
China
Prior art keywords
intercepted
bytecode
interceptable
source code
instruction set
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
Application number
CN202010894451.XA
Other languages
English (en)
Other versions
CN111913741B (zh
Inventor
胡琪
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Netease Zhiqi Technology Co Ltd
Original Assignee
Netease Hangzhou Network Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN202010894451.XA priority Critical patent/CN111913741B/zh
Publication of CN111913741A publication Critical patent/CN111913741A/zh
Application granted granted Critical
Publication of CN111913741B publication Critical patent/CN111913741B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/76Adapting program code to run in a different environment; Porting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本公开的实施例提供了一种对象拦截方法、装置、介质及电子设备,涉及计算机技术领域。该方法包括:获取源代码,并确定源代码中的待拦截对象;在源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;通过预设的项目自动化构建工具将字节码指令集注入到待拦截对象中生成可拦截对象;在源代码的运行期,响应于调用可拦截对象,基于软件开发工具包通过可拦截对象中注入的字节码指令集调用拦截接口,以通过拦截接口实现对可拦截对象的拦截回调。本公开实施例的技术方案能够在对可拦截对象进行拦截回调时,提高源代码的兼容性,提升源代码对应框架的稳定性。

Description

对象拦截方法、装置、介质及电子设备
技术领域
本公开的实施例涉及计算机技术领域,更具体地,本公开的实施例涉及对象拦截方法、对象拦截装置、计算机可读存储介质以及电子设备。
背景技术
本部分旨在为权利要求书中陈述的本公开的实施例提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
随着互联网技术的发展,各种***或者软件的开发越来越得到人们的关注。钩子(Hook)技术是指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作***、应用程序或其他软件组件的行为的各种技术。一般处理被拦截的函数调用、事件、消息的代码,被称为钩子(Hook)。
目前的技术方案中,在对拦截对象进行Hook时,是通过在源代码运行时,修改底层数据结构的字段指向,实现对拦截对象的拦截调用。
发明内容
通过修改底层数据结构的字段指向的Hook方案虽然能够简单、快速地完成拦截对象的拦截回调,但是由于需要修改底层数据结构的字段指向,对底层的依赖较大,因此兼容性较差;其次,对于在编译期只参与编译不参与打包的对象(如***默认的android.jar包中的类)则无法实现拦截回调。
因此在相关技术中,难以达到令人满意的对象拦截方案。
为此,非常需要一种改进的对象拦截方法,以使得能够在简单、快速地完成拦截对象的拦截回调的同时,保证对象拦截的兼容性,提升代码Hook框架的稳定性,并降低配置拦截对象的难度,提升代码开发的效率。
在本上下文中,本公开的实施例期望提供一种对象拦截方法、对象拦截装置、计算机可读存储介质以及电子设备。
在本公开实施例的第一方面中,提供了一种对象拦截方法,包括:
获取源代码,并确定所述源代码中的待拦截对象;
在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;
通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象;
在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
在本公开的一些实施例中,基于前述方案,所述项目自动化构建工具包括配置解析器,所述确定所述源代码中的待拦截对象,包括:
通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,其中,所述待拦截对象包括待拦截的类和/或待拦截的函数方法;以及
根据所述待拦截对象生成待拦截对象列表并将所述待拦截对象列表存储在所述配置解析器中。
在本公开的一些实施例中,基于前述方案,通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,还包括:
获取所述源代码对应的配置文件中包含通配符的配置信息;
通过所述配置解析器解析所述包含通配符的配置信息,以确定所述包含通配符的配置信息对应的待拦截对象。
在本公开的一些实施例中,基于前述方案,所述项目自动化构建工具包括字节码处理引擎,在通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象之前,所述方法还包括:
基于所述字节码处理引擎遍历在编译期的所述源代码,获取所述源代码中的所有字节码文件以基于所述所有字节码文件生成所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述项目自动化构建工具包括字节码注入器,所述通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象,包括:
获取所述配置解析器存储的所述待拦截对象列表;
基于所述字节码处理引擎,根据所述待拦截对象列表在所述所有字节码文件中确定需要进行字节码注入处理的目标字节码文件;其中,所述目标字节码文件包括所述待拦截对象;
通过所述字节码处理引擎将所述目标字节码文件发送到所述字节码注入器,以通过所述字节码注入器将所述字节码指令集注入到所述目标字节码文件中的所述待拦截对象,生成可拦截对象。
在本公开的一些实施例中,基于前述方案,在通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象之后,所述方法还包括:
通过所述字节码处理引擎对包含所述可拦截对象的所述目标字节码文件进行并行编译处理,将所述目标字节码文件转换为所述源代码对应的可执行文件。
在本公开的一些实施例中,基于前述方案,在所述源代码的运行期,响应于调用所述可拦截对象,包括:
在所述源代码的运行期,响应于运行到所述可执行文件,调用所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述字节码指令集包括回调进入接口和回调返回接口,所述基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调,包括:
在执行所述可拦截对象前,基于所述软件开发工具包通过所述回调进入接口获取所述可拦截对象的形参值,并通过所述拦截接口修改所述形参值;
在拦截后的所述可拦截对象返回前,基于所述软件开发工具包通过所述回调返回接口获取修改后的所述形参值,并基于修改后的所述形参值修改所述可拦截对象的返回值,以实现对所述可拦截对象的拦截回调。
在本公开实施例的第二方面中,提供了一种对象拦截装置,包括:
待拦截对象确定模块,用于获取源代码,并确定所述源代码中的待拦截对象;
字节码指令集获取模块,用于在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;
可拦截对象生成模块,用于通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象;
可拦截对象拦截模块,用于在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
在本公开的一些实施例中,基于前述方案,所述待拦截对象确定模块还包括:
待拦截对象确定单元,用于通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,其中,所述待拦截对象包括待拦截的类和/或待拦截的函数方法;以及
待拦截对象存储单元,用于根据所述待拦截对象生成待拦截对象列表并将所述待拦截对象列表存储在所述配置解析器中。
在本公开的一些实施例中,基于前述方案,所述待拦截对象确定单元还被配置为:
获取所述源代码对应的配置文件中包含通配符的配置信息;
通过所述配置解析器解析所述包含通配符的配置信息,以确定所述包含通配符的配置信息对应的待拦截对象。
在本公开的一些实施例中,基于前述方案,所述对象拦截装置还包括字节码文件获取单元,所述字节码文件获取单元被配置为:
基于所述字节码处理引擎遍历在编译期的所述源代码,获取所述源代码中的所有字节码文件以基于所述所有字节码文件生成所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述可拦截对象生成模块还包括:
待拦截对象列表获取单元,用于获取所述配置解析器存储的所述待拦截对象列表;
目标字节码文件确定单元,用于基于所述字节码处理引擎,根据所述待拦截对象列表在所述所有字节码文件中确定需要进行字节码注入处理的目标字节码文件;其中,所述目标字节码文件包括所述待拦截对象;
可拦截对象生成单元,用于通过所述字节码处理引擎将所述目标字节码文件发送到所述字节码注入器,以通过所述字节码注入器将所述字节码指令集注入到所述目标字节码文件中的所述待拦截对象,生成可拦截对象。
在本公开的一些实施例中,基于前述方案,所述对象拦截装置还包括可执行文件转换单元,所述可执行文件转换单元被配置为:
通过所述字节码处理引擎对包含所述可拦截对象的所述目标字节码文件进行并行编译处理,将所述目标字节码文件转换为所述源代码对应的可执行文件。
在本公开的一些实施例中,基于前述方案,所述可拦截对象拦截模块还被配置为:
在所述源代码的运行期,响应于运行到所述可执行文件,调用所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述可拦截对象拦截模块还被配置为:
在执行所述可拦截对象前,基于所述软件开发工具包通过所述回调进入接口获取所述可拦截对象的形参值,并通过所述拦截接口修改所述形参值;
在拦截后的所述可拦截对象返回前,基于所述软件开发工具包通过所述回调返回接口获取修改后的所述形参值,并基于修改后的所述形参值修改所述可拦截对象的返回值,以实现对所述可拦截对象的拦截回调。
在本公开实施例的第三方面中,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述第一方面所述的对象拦截方法。
在本公开实施例的第四方面中,提供了一种电子设备,包括:处理器;以及存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如上述第一方面所述的对象拦截方法。
根据本公开实施例的技术方案,一方面,确定源代码中的待拦截对象,在源代码的编译期,通过将字节码指令集注入到待拦截对象中生成可拦截对象,并在源代码的运行期,通过可拦截对象中注入的字节码指令集调用拦截接口,以通过拦截接口实现对可拦截对象的拦截回调,能够提升对象拦截的兼容性,提升代码对应的框架的稳定性;另一方面,通过在编译期注入字节码指令集,能够实现对只参与编译而不参与打包的待拦截对象的拦截回调,提高拦截回调的适用范围,以实现对任意对象的拦截回调;再一方面,结合预设的项目自动化构建工具以及软件开发工具包实现对拦截对象的配置,提高配置拦截对象的灵活性,降低操作难度,提升源代码的开发效率。
附图说明
通过参考附图阅读下文的详细描述,本公开示例性实施例的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施例,其中:
图1示意性示出了根据本公开的一些实施例的示例性应用场景的***架构的示意框图;
图2示意性地示出了根据本公开的一些实施例的对象拦截方法的流程示意图;
图3示意性地示出了根据本公开的一些实施例的对象拦截框架的结构示意图;
图4示意性地示出了根据本公开的一些实施例的确定源代码中的待拦截对象的流程示意图;
图5示意性地示出了根据本公开的一些实施例的基于得到的字节码文件生成可拦截对象的流程示意图;
图6示意性地示出了根据本公开的一些实施例的实现对可拦截对象的拦截回调的流程示意图;
图7示意性地示出了根据本公开的一些实施例的注入字节码指令集的流程示意图;
图8示意性地示出了根据本公开的一些实施例的对象拦截装置的示意框图;
图9示意性地示出了根据本公开的示例实施例的存储介质的示意图;以及
图10示意性地示出了根据发明的示例实施例的电子设备的方框图。
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施例来描述本公开的原理和精神。应当理解,给出这些实施例仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本公开的实施例可以实现为一种***、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本公开的实施例,提出了一种对象拦截方法、对象拦截装置、介质和电子设备。
在本文中,需要理解的是,所涉及的术语,比如编译期(Compile time)是指程序设计中,编译器在编译源代码时的行为,用来与运行期(Run time)进行区分;字节码(Bytecode)是指已经经过编译,与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码,字节码的作用一般是为了实现特定软件运行和软件环境,与硬件环境无关,比较典型的代表为Java字节码;Android Studio是谷歌官方推出的一个Android集成开发环境工具;Jar(Java Archive,Java归档)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库;AAR(Android Archive)是一个Android库项目的二进制归档文件。文件扩展名是.aar,但文件本身是一个简单zip文件,里面可能会包含有Jar包;面向切面编程(AspectOriented Programming,AOP),是指通过预编译方式或运行期间动态代理实现程序功能的统一维护的一种技术,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。此外,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本公开的若干代表性实施例,详细阐释本公开的原理和精神。
发明概述
本发明人发现,相关的技术方案中,在对拦截对象进行拦截回调时,一般是通过Hook框架将拦截对象运行时的数据结构直接进行替换,例如,将Java方法对应的Native层方法运行时数据结构Method(Dalvik虚拟机运行时)或数据结构ArtMehod(Art虚拟机运行时)进行替换。
举例而言,以Dalvik虚拟机为例,Java层的每一个函数在Dalvik虚拟机中都对应一个Method数据结构。在Native层先找到待Hook的Java层函数对应的Method对象,修改其字段accessFlags的值以将该方法变为Native方法,使得该方法的执行遵循JNI函数(JavaNative Interface,Java本地接口)执行流程。然后将其对应的Method数据结构中nativeFunc指向了自定义的一个Native方法hookedMethodCallback,这样对该Java层方法的调用就转为了调用hookedMethodCallback,接着在hookedMethodCallback方法中回调框架自身在Java层定义的Hook接口,这样就达到了在调用某个方法时先执行Hook框架自身定义的接口的目的。
但是,该方案是通过修改Android中Java层方法在Native层运行时对应数据结构的nativeFunc字段的指向,对底层依赖比较大,因此兼容性较差,尤其是在Art虚拟机运行时的情况下。
基于上述内容,本公开的基本思想在于,获取源代码,确定源代码中的待拦截对象,在源代码的编译期,通过将字节码指令集注入到待拦截对象中生成可拦截对象,并在源代码的运行期,通过可拦截对象中注入的字节码指令集调用拦截接口,以通过拦截接口实现对可拦截对象的拦截回调,从而能够提升对象拦截的兼容性,提升代码对应的框架的稳定性;其次,在编译期注入字节码指令集,能够实现对只参与编译而不参与打包的待拦截对象的拦截回调,提高拦截回调的适用范围,以实现对任意对象的拦截回调;此外,结合预设的项目自动化构建工具以及软件开发工具包实现对拦截对象的配置,提高配置拦截对象的灵活性,降低操作难度,提升源代码的开发效率。
在介绍了本公开的基本原理之后,下面具体介绍本公开的各种非限制性实施例。
应用场景总览
首先参考图1,图1示出了可以应用本公开实施例的一种对象拦截方法及装置的示例性应用场景的***架构的示意框图。
如图1所示,***架构100可以包括终端设备101、102、103中的一个或多个,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路等等。终端设备101、102、103可以是具有显示屏和光学扫描装置的各种电子设备,包括但不限于连接有便携扫描仪器的台式计算机或者便携式计算机、智能手机和电子扫描笔等等。应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。
本公开实施例所提供的对象拦截方法一般由终端设备101、102、103执行,相应地,对象拦截装置一般设置于终端设备101、102、103中。但本领域技术人员容易理解的是,本公开实施例所提供的对象拦截方法也可以由服务器105执行,相应的,对象拦截装置也可以设置于服务器105中,本示例性实施例中对此不做特殊限定。
应该理解的是,图1所示的应用场景仅是本公开的实施例可以在其中得以实现的一个示例。本公开实施例的适用范围不受到该应用场景任何方面的限制。
示例性方法
下面结合图1的应用场景,参考图2来描述根据本公开示例性实施例的对象拦截方法。需要注意的是,上述应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施例在此方面不受任何限制。相反,本公开的实施例可以应用于适用的任何场景。
本公开首先提供了一种对象拦截方法,该方法执行主体可以是终端设备,也可以是服务器,本公开对此不做特殊限定,本示例实施例中以终端设备执行该方法为例进行说明。
参照图2所示,在步骤S210中,获取源代码,并确定所述源代码中的待拦截对象。
在示例实施例中,源代码(Source Coding)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令,例如,本公开中的源代码可以是安卓(Android)***框架对应的源代码,也可以是IOS(IPhone Operation System)***框架对应的源代码,当然,还可以是其他需要配置拦截对象的源代码,本示例实施例对此不做特殊限定。
待拦截对象可以是指获取的源代码中需要配置拦截的对象,例如,待拦截对象可以是安卓***框架中的类(如在Java中,类的定义是<class><类名>),也可以是安卓***框架中的方法(函数),当然,待拦截对象还可以是其他源代码中需要配置拦截的对象,本示例实施对此不做特殊限定。
在步骤S220中,在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集。
在示例实施例中,编译期是指程序设计中,通过编译器在对源代码进行编译生成计算机可以执行的文件的过程,用于与源代码的运行期进行区分。字节码指令集是指已经经过编译,与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码,字节码的作用一般是为了实现特定软件运行和软件环境,与硬件环境无关,比较典型的代表为Java字节码。
字节码指令集注入操作可以是指对待拦截对象执行字节码指令集注入指令的触发操作,例如,字节码指令集注入操作可以是通过构建字节码指令集注入框架实现字节码注入的触发操作,也可以是通过控制相关字节码注入插件的开关实现字节码注入的触发操作,当然,还可以是其他能够实现对待拦截对象执行字节码指令集注入指令的触发操作,本示例实施例对此不做特殊限定。
软件工具开发包(Software Development Kit,SDK)是指为特定的软件包、软件框架、硬件平台、操作***等建立应用软件时的开发工具的集合,广义上可以理解为辅助开发某一类功能的相关文档、范例和工具的集合。
预设的软件开发工具包可以是指预先设置的、用于提供待拦截(Hook/Intercept)对象的注解标志(Annotation,可以理解为源代码中的特殊标记,可以在编译,类加载,运行时被读取,并执行相应的处理;通过注解标志,开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息),拦截接口的注册,以及拦截接口的回调的软件工具开发包。
在获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集之前,可以通过预设的软件开发工具包对拦截接口进行注册。
在步骤S230中,通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象。
在示例实施例中,预设的项目自动化构建工具可以是指预先设置的、能够将拦截接口对应的字节码指令集注入到待拦截对象中的项目自动化构建工具,例如,预设的项目自动化构建工具可以是Gradle工具,也可以是Maven工具,当然,还可以是其他能够将拦截接口对应的字节码指令集注入到待拦截对象中的项目自动化构建工具,例如,预设的项目自动化构建工具还可以是Ant,本示例实施例对此不做特殊限定。
可拦截对象可以是指将拦截接口对应的字节码指令集注入到待拦截对象中生成的对象,在源代码的运行期,能够基于可拦截对象中注入的字节码指令集实现对可拦截对象的拦截回调。
在步骤S240中,在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
在示例实施例中,运行期是指将在编译期进行编译后的文件交给计算机的内存中执行的过程,在运行期执行源代码对应的文件时,响应于运行到调用可拦截对象的部分,则可以通过在编译期基于软件开发工具包注入到可拦截对象中的字节码指令集调用拦截接口,进而通过该拦截接口实现对可拦截对象的拦截回调。
根据图2示例实施例的技术方案,一方面,确定源代码中的待拦截对象,在源代码的编译期,通过将字节码指令集注入到待拦截对象中生成可拦截对象,并在源代码的运行期,通过可拦截对象中注入的字节码指令集调用拦截接口,以通过拦截接口实现对可拦截对象的拦截回调,能够提升对象拦截的兼容性,提升代码对应的框架的稳定性;另一方面,通过在编译期注入字节码指令集,能够实现对只参与编译而不参与打包的待拦截对象的拦截回调,提高拦截回调的适用范围,以实现对任意对象的拦截回调;再一方面,结合预设的项目自动化构建工具以及软件开发工具包实现对拦截对象的配置,提高配置拦截对象的灵活性,降低操作难度,提升源代码的开发效率。
图3示意性地示出了根据本公开的一些实施例的对象拦截框架的结构示意图。
参考图3所示,示例实施例中实现对象拦截方法的整体框架设计可以包括运行期的软件开发工具包(Runtime SDK)301以及编译期的项目自动化构建工具(CompilePlugin)302。
其中,运行期的软件开发工具包301可以包括拦截回调方法Hook303以及拦截回调方法Intercept 304,主要用于提供待Hook或者待Intercept方法的注解标志,Hook或者Intercept方法的注册,以及Hook或者Intercept回调接口的回调等功能。
编译期的项目自动化构建工具302(如Gradle)的核心功能模块主要包括:配置解析器305、字节码处理引擎306以及字节码注入器307。配置解析器305主要用于解析开发人员通过项目自动化构建工具302配置的配置文件,配置文件中包含待拦截对象;字节码处理引擎306主要负责遍历项目中所有的字节码文件以及项目依赖的所有的第三方SDK,并将处理后的内容输出到下一个Transform节点指定的位置;字节码注入器307主要负责读取字节码处理引擎306遍历的每一个字节码文件的内容,直接从字节码指令层面修改其内容,在每一个待拦截对象的起始位置和待拦截对象执行返回指令之前***Runtime SDK中定义的Hook或Intercept接口的调用逻辑,然后生成新的字节码文件的二进制内容。
在本公开的一个示例实施例中,可以通过图4中的步骤确定源代码中的待拦截对象:
参考图4所示,步骤S410,通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象;
步骤S420,根据所述待拦截对象生成待拦截对象列表并将所述待拦截对象列表存储在所述配置解析器中。
其中,配置文件可以是指开发人员预先通过项目自动化构建工具指定的待拦截对象,例如,配置文件可以包括开发人员预先通过项目自动化构建工具指定的待Hook的类和/或待Hook的函数方法,本示例实施例对此不做特殊限定。开发人员可以通过预先配置的配置文件告知项目自动化构建工具中的配置解析器需要进行处理的类和/或函数方法,以便于对这些类和方法以字节码注入的方式注入Hook逻辑。
举例而言,假设开发人员在项目自动化构建工具Gradle中配置了以下内容:
Figure BDA0002657980120000131
Figure BDA0002657980120000141
这段代码表明,开发人员希望对类名为“tech.xxx.droidaop.Sample”的类中的“int getNumber(int i)”和“String getDeviceId(Context context)”函数方法***Hook逻辑操作,这样当字节码处理引擎扫描到“Sample”类时,将会对该类的“int getNumber(int i)”和“String getDeviceId(Context context)”这两个函数方法调用字节码注入器进行Hook逻辑的注入。
进而,待拦截对象列表可以是指配置解析器从配置文件中提取出的所有待拦截对象对应的集合,在得到待拦截对象列表之后可以先存储在配置解析器中,并在字节码处理引擎对源代码文件进行处理时,将待拦截对象列表发送给字节码处理引擎,以使字节码处理引擎调用字节码注入器对待拦截对象列表中的待拦截对象进行字节码注入处理。
优选的,可以获取所述源代码对应的配置文件中包含通配符的配置信息;并通过所述配置解析器解析所述包含通配符的配置信息,以确定所述包含通配符的配置信息对应的待拦截对象。
其中,通配符可以是指能够在不知道真正字符时代替一个或者多个真正字符的模糊搜索字符,例如,通配符“*”可以替代零个、单个或多个字符,如果正在查找以AEW开头的一个文件,但不记得文件名其余部分,可以输入“AEW*”,则能够查找到以AEW开头的所有文件类型的文件,如AEWT.txt、AEWU.EXE、AEWI.dll等;通配符“?”可以替代一个字符,如果输入“love?”,则能够查找到以love开头的一个字符结尾文件类型的文件,如lovey、lovei等,要缩小范围可以输入love?.doc,查找以love开头的一个字符结尾文件类型并.doc为扩展名的文件如lovey.doc、loveh.doc。当然,此处仅是示意性举例说明,并不应对本示例实施例造成任何特殊限定。
包含通配符的配置信息可以是指开发人员在配置待拦截对象时,结合通配符配置的一系列待拦截对象对应的信息,通过在配置解析器中设置支持使用通配符等方式设置的模糊匹配规则的解析,能够有效提升开发人员的配置待拦截对象的效率,降低开发人员的记忆负担,同时避免相关待拦截对象的遗漏,提升配置的配置文件的准确性。
在本公开的一个示例实施例中,在通过预设的项目自动化构建工具将字节码指令集注入到待拦截对象中生成可拦截对象之前,可以通过以下步骤获取字节码文件:
基于所述字节码处理引擎遍历在编译期的所述源代码,获取所述源代码中的所有字节码文件以基于所述所有字节码文件生成所述可拦截对象。
其中,字节码文件(.class文件)可以是指源代码经过编译器预处理过得到的一种文件,是Java的执行文件存在形式,Java源代码(.java)要先编译成与平台无关的字节码文件,然后字节码文件再解释成机器码运行,解释是通过Java虚拟机来执行的。
进一步的,可以通过图5中的步骤基于得到的字节码文件生成可拦截对象:
参考图5所示,步骤S510,获取所述配置解析器存储的所述待拦截对象列表;
步骤S520,基于所述字节码处理引擎,根据所述待拦截对象列表在所述所有字节码文件中确定需要进行字节码注入处理的目标字节码文件;
步骤S530,通过所述字节码处理引擎将所述目标字节码文件发送到所述字节码注入器,以通过所述字节码注入器将所述字节码指令集注入到所述目标字节码文件中的所述待拦截对象,生成可拦截对象。
其中,目标字节码文件可以是指根据待拦截对象列表确定的包含待拦截对象的字节码文件。在确定目标字节码文件之后,字节码处理引擎通过调用字节码注入器模块对目标字节码文件中的待拦截对象执行字节码注入操作。
进而,通过字节码注入器将字节码指令集注入到目标字节码文件中的待拦截对象,生成可拦截对象。在源代码的运行期,就能够基于可拦截对象中注入的字节码指令集实现对可拦截对象的拦截回调。
字节码注入器负责读取字节码处理引擎遍历的每一个目标字节码文件的内容,直接从字节码指令层面修改其内容,在每一个待拦截对象的起始位置和待拦截对象执行返回指令之前***运行期的软件开发工具包Runtime SDK中定义的Hook接口或Intercept接口的调用逻辑,然后生成新的目标字节码文件的二进制内容。
举例而言,以前面举例的Sample类的getDeviceId方法为例,该方法原始实现如下:
public static String getDeviceId(Context context){
return Secure.getString(context.getContentResolver(),name:"android_id");
}
对该方法进行字节码注入操作以***调用Hook逻辑之后,会在该方法的起始位置***notifyEnterMethod函数调用,在该函数中会去调用运行期的软件开发工具包RuntimeSDK中的onMethodEnter方法;在return语句前会***notifyMethodReturn函数调用,在该函数中会去调用运行期的软件开发工具包Runtime SDK的onMethodReturn方法,则此时原函数逻辑变为如下结构:
Figure BDA0002657980120000161
即在原始方法的入口处***通知进入该方法的回调,并在该方法中调用运行期的软件开发工具包Runtime SDK中定义的方法进入回调接口,以达到在回调中使用或修改原函数形参值的目的。在原始方法返回前***通知该方法返回的回调,并在该方法中调用Runtime SDK中定义的方法返回回调接口,在该回调接口中可修改原函数返回值。
在本公开的一个示例实施例中,在通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象之后,可以通过以下步骤生成可执行文件:
通过所述字节码处理引擎对包含所述可拦截对象的所述目标字节码文件进行并行编译处理,将所述目标字节码文件转换为所述源代码对应的可执行文件。
其中,可执行文件可以是指字节码处理引擎中的编译器将目标字节码文件编译成可以执行的文件,例如,可执行文件可以是Dalvik虚拟机可执行的DEX文件(DalvikExecutable File),也可以是Java虚拟机可执行的Jar文件(Java Archive),本示例实施例对此不做特殊限定。
在通过字节码处理引擎中的编译器对包含可拦截对象的目标字节码文件进行编译处理,可以通过并行编译处理以提高编译的效率,也可以通过增量编译以提高编译的效率,本示例实施例不以此为限。
由于在Android项目构建可执行文件(如DEX文件)过程中,Android集成开发环境工具(Android Studio)首先会使用javac编译器将源代码编译为字节码文件(class文件),然后通过字节码处理引擎中的编译器(如dx.jar或者d8.jar)将字节码文件转换为可执行文件。其中,由于在将源代码编译为字节码文件的过程中是通过顺序执行多个的Transform节点来完成不同节点的编译任务,每个Transform节点都可以对class文件进行处理然后传递给下一个Transform节点,因此,可以通过自定义的Transform节点来干预class字节码的流动。本公开中的字节码处理引擎即可相当于自定义的多个通用Transform节点,具体的,字节码处理引擎中的第一Transform节点负责遍历项目中所有的字节码文件以及项目依赖的所有的第三方SDK,包括Jar包和AAR包,并将处理后的内容输出到第二Transform节点;然后第二Transform节点根据待拦截对象列表确定目标字节码文件,并将目标字节码文件传输到指定的位置(即字节码注入器);第三Transform节点接收字节码注入器处理后的字节码文件并传递后续剩余的多个Transform节点,以通过编译器以及剩余的多个Transform节点将字节码文件转换为可执行文件(如Jar格式或者Dex格式的文件)。字节码处理引擎中的Transform节点可以支持增量编译以及并发编译,提高编译速度。
在源代码的运行期,在运行到可执行文件时,由于可执行文件中包含可拦截对象,因此此时会拦截调用该可拦截对象。
进一步的,可以通过图6中的步骤实现对可拦截对象的拦截回调:
参考图6所示,步骤S610,在执行所述可拦截对象前,基于所述软件开发工具包通过所述回调进入接口获取所述可拦截对象的形参值,并通过所述拦截接口修改所述形参值;
步骤S620,在拦截后的所述可拦截对象返回前,基于所述软件开发工具包通过所述回调返回接口获取修改后的所述形参值,并基于修改后的所述形参值修改所述可拦截对象的返回值,以实现对所述可拦截对象的拦截回调。
举例而言,以前面列举的Hook“tech.xxx.droidaop.Sample”类的获取设备Id的函数getDeviceId为例,开发人员调用运行期的软件开发工具包Runtime SDK的findAndHookMethod接口和intercept接口即可完成对编译期间***的Hook逻辑的回调监听。
当程序运行时,执行到Sample类的getDeviceId函数时,由于在编译期***了Hook跳转逻辑,因此会先执行Runtime SDK的回调接口onMethodEnter,在该回调中能够拿到原函数所有的形参,进而修改这些形参值,在getDeviceId函数返回前,会先执行运行期的软件开发工具包Runtime SDK的回调接口onMethodReturn,在该回调中同样能够拿到原函数所有的形参值,并且可以通过修改该接口的返回值来达到修改原函数返回值的目的。
图7示意性地示出了根据本公开的一些实施例的注入字节码指令集的流程示意图。
参考图7所示,步骤S710,基于配置解析器701解析开发人员在项目自动化构建工具中配置的配置文件,得到待拦截对象列表;
步骤S720,基于字节码处理引擎702中的第一Transform节点遍历源代码在编译时生成的所有字节码文件以及所有依赖的第三方SDK的字节码文件并传递给第二Transform节点;
步骤S730,基于字节码处理引擎702中的第二Transform节点根据待拦截对象列表对需要进行Hook的目标字节码文件中的待拦截对象并传递给字节码注入模块703执行注入操作;
步骤S740,基于字节码注入模块703在该拦截对象对应的目标字节码文件中注入调用Hook接口的相关逻辑对应的字节码指令集,完成Hook逻辑的***,并将输出最终处理后的字节码文件对应的二进制内容传递给第三Transform节点;
步骤S750,基于字节码处理引擎702中的第三Transform节点将处理后的字节码内容输出到剩余的多个Transform节点;
步骤S760,基于字节码处理引擎702中的编译器以及剩余的多个Transform节点将处理后的字节码内容生成最终的Jar/Dex文件。
示例性装置
在介绍了本公开示例性实施例的方法之后,接下来,参考图8对本公开示例性实施例的对象拦截装置进行描述。
在图8中,对象拦截装置800可以包括:待拦截对象确定模块810、字节码指令集获取模块820,可拦截对象生成模块830以及可拦截对象拦截模块840。其中:
待拦截对象确定模块810用于获取源代码,并确定所述源代码中的待拦截对象;
字节码指令集获取模块820用于在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;
可拦截对象生成模块830用于通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象;
可拦截对象拦截模块840用于在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
在本公开的一些实施例中,基于前述方案,所述待拦截对象确定模块810还包括:
待拦截对象确定单元,用于通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,其中,所述待拦截对象包括待拦截的类和/或待拦截的函数方法;以及
待拦截对象存储单元,用于根据所述待拦截对象生成待拦截对象列表并将所述待拦截对象列表存储在所述配置解析器中。
在本公开的一些实施例中,基于前述方案,所述待拦截对象确定单元还被配置为:
获取所述源代码对应的配置文件中包含通配符的配置信息;
通过所述配置解析器解析所述包含通配符的配置信息,以确定所述包含通配符的配置信息对应的待拦截对象。
在本公开的一些实施例中,基于前述方案,所述对象拦截装置800还包括字节码文件获取单元,所述字节码文件获取单元被配置为:
基于所述字节码处理引擎遍历在编译期的所述源代码,获取所述源代码中的所有字节码文件以基于所述所有字节码文件生成所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述可拦截对象生成模块830还包括:
待拦截对象列表获取单元,用于获取所述配置解析器存储的所述待拦截对象列表;
目标字节码文件确定单元,用于基于所述字节码处理引擎,根据所述待拦截对象列表在所述所有字节码文件中确定需要进行字节码注入处理的目标字节码文件;其中,所述目标字节码文件包括所述待拦截对象;
可拦截对象生成单元,用于通过所述字节码处理引擎将所述目标字节码文件发送到所述字节码注入器,以通过所述字节码注入器将所述字节码指令集注入到所述目标字节码文件中的所述待拦截对象,生成可拦截对象。
在本公开的一些实施例中,基于前述方案,所述对象拦截装置800还包括可执行文件转换单元,所述可执行文件转换单元被配置为:
通过所述字节码处理引擎对包含所述可拦截对象的所述目标字节码文件进行并行编译处理,将所述目标字节码文件转换为所述源代码对应的可执行文件。
在本公开的一些实施例中,基于前述方案,所述可拦截对象拦截模块840还被配置为:
在所述源代码的运行期,响应于运行到所述可执行文件,调用所述可拦截对象。
在本公开的一些实施例中,基于前述方案,所述可拦截对象拦截模块840还被配置为:
在执行所述可拦截对象前,基于所述软件开发工具包通过所述回调进入接口获取所述可拦截对象的形参值,并通过所述拦截接口修改所述形参值;
在拦截后的所述可拦截对象返回前,基于所述软件开发工具包通过所述回调返回接口获取修改后的所述形参值,并基于修改后的所述形参值修改所述可拦截对象的返回值,以实现对所述可拦截对象的拦截回调。
示例性介质
在介绍了本公开示例性实施例的装置之后,接下来,对本公开示例性实施例的存储介质进行说明。
在一些实施例中,本公开的各个方面还可以实现为一种介质,其上存储有程序代码,当所述程序代码被设备的处理器执行时用于实现本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施例的对象拦截方法中的步骤。
例如,所述设备的处理器执行所述程序代码时可以实现如图2中所述的步骤S210,获取源代码,并确定所述源代码中的待拦截对象。步骤S220,在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集。步骤S230,通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象。步骤S240,在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
参考图9所示,描述了根据本公开的实施例的用于实现上述对象拦截方法的程序产品900,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本公开的程序产品不限于此。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,所述程序设计语言包括面向对象的程序设计语言-诸如Java、C++等,还包括常规的过程式程序设计语言-诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备。
示例性计算设备
在介绍了本公开示例性实施例的对象拦截方法、对象拦截装置以及存储介质之后,接下来,介绍根据本公开的示例性实施例的电子设备。
所属技术领域的技术人员能够理解,本公开的各个方面可以实现为***、方法或程序产品。因此,本公开的各个方面可以具体实现为以下形式,即:完全的硬件实施例、完全的软件实施例(包括固件、微代码等),或硬件和软件方面结合的实施例,这里可以统称为“电路”、“模块”或“***”。
在一些可能的实施例中,根据本公开的电子设备可以至少包括至少一个处理单元、以及至少一个存储单元。其中,所述存储单元存储有程序代码,当所述程序代码被所述处理单元执行时,使得所述处理单元执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施例的对象拦截方法中的步骤。例如,所述处理单元可以执行如图2中所示的步骤S210,获取源代码,并确定所述源代码中的待拦截对象。步骤S220,在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集。步骤S230,通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象。步骤S240,在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
下面参照图10来描述根据本公开的示例实施例的电子设备1000。图10所示的电子设备1000仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图10所示,电子设备1000以通用计算设备的形式表现。电子设备1000的组件可以包括但不限于:上述至少一个处理单元1001、上述至少一个存储单元1002、连接不同***组件(包括存储单元1002和处理单元1001)的总线1003、显示单元1007。
总线1003包括数据总线、地址总线和控制总线。
存储单元1002可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)1021和/或高速缓存存储器1022,还可以进一步包括只读存储器(ROM)1023。
存储单元1002还可以包括具有一组(至少一个)程序模块1024的程序/实用工具1025,这样的程序模块1024包括但不限于:操作***、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
电子设备1000也可以与一个或多个外部设备1004(例如键盘、指向设备、蓝牙设备等)通信,这种通信可以通过输入/输出(I/O)接口1005进行。并且,电子设备1000还可以通过网络适配器1006与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器1006通过总线1003与电子设备1000的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备1000使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID***、磁带驱动器以及数据备份存储***等。
应当注意,尽管在上文详细描述中提及了对象拦截装置的若干单元/模块或子单元/子模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施例,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施例描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施例,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。

Claims (10)

1.一种对象拦截方法,其特征在于,包括:
获取源代码,并确定所述源代码中的待拦截对象;
在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;
通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象;
在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
2.根据权利要求1所述的方法,其特征在于,所述项目自动化构建工具包括配置解析器,所述确定所述源代码中的待拦截对象,包括:
通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,其中,所述待拦截对象包括待拦截的类和/或待拦截的函数方法;以及
根据所述待拦截对象生成待拦截对象列表并将所述待拦截对象列表存储在所述配置解析器中。
3.根据权利要求2所述的方法,其特征在于,通过所述配置解析器解析所述源代码对应的配置文件,以确定所述源代码中的待拦截对象,还包括:
获取所述源代码对应的配置文件中包含通配符的配置信息;
通过所述配置解析器解析所述包含通配符的配置信息,以确定所述包含通配符的配置信息对应的待拦截对象。
4.根据权利要求1所述的方法,其特征在于,所述项目自动化构建工具包括字节码处理引擎,在通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象之前,所述方法还包括:
基于所述字节码处理引擎遍历在编译期的所述源代码,获取所述源代码中的所有字节码文件以基于所述所有字节码文件生成所述可拦截对象。
5.根据权利要求4所述的方法,其特征在于,所述项目自动化构建工具包括字节码注入器,所述通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象,包括:
获取所述配置解析器存储的所述待拦截对象列表;
基于所述字节码处理引擎,根据所述待拦截对象列表在所述所有字节码文件中确定需要进行字节码注入处理的目标字节码文件;其中,所述目标字节码文件包括所述待拦截对象;
通过所述字节码处理引擎将所述目标字节码文件发送到所述字节码注入器,以通过所述字节码注入器将所述字节码指令集注入到所述目标字节码文件中的所述待拦截对象,生成可拦截对象。
6.根据权利要求5所述的方法,其特征在于,在通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象之后,所述方法还包括:
通过所述字节码处理引擎对包含所述可拦截对象的所述目标字节码文件进行并行编译处理,将所述目标字节码文件转换为所述源代码对应的可执行文件。
7.根据权利要求6所述的方法,其特征在于,在所述源代码的运行期,响应于调用所述可拦截对象,包括:
在所述源代码的运行期,响应于运行到所述可执行文件,调用所述可拦截对象。
8.根据权利要求7所述的方法,其特征在于,所述字节码指令集包括回调进入接口和回调返回接口,所述基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调,包括:
在执行所述可拦截对象前,基于所述软件开发工具包通过所述回调进入接口获取所述可拦截对象的形参值,并通过所述拦截接口修改所述形参值;
在拦截后的所述可拦截对象返回前,基于所述软件开发工具包通过所述回调返回接口获取修改后的所述形参值,并基于修改后的所述形参值修改所述可拦截对象的返回值,以实现对所述可拦截对象的拦截回调。
9.一种对象拦截装置,其特征在于,包括:
待拦截对象确定模块,用于获取源代码,并确定所述源代码中的待拦截对象;
字节码指令集获取模块,用于在所述源代码的编译期,响应于字节码指令集注入操作,获取预设的软件开发工具包中注册的拦截接口对应的字节码指令集;
可拦截对象生成模块,用于通过预设的项目自动化构建工具将所述字节码指令集注入到所述待拦截对象中生成可拦截对象;
可拦截对象拦截模块,用于在所述源代码的运行期,响应于调用所述可拦截对象,基于所述软件开发工具包通过所述可拦截对象中注入的所述字节码指令集调用所述拦截接口,以通过所述拦截接口实现对所述可拦截对象的拦截回调。
10.一种电子设备,其特征在于,包括:
处理器;以及
存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如权利要求1至8中任意一项所述的对象拦截方法。
CN202010894451.XA 2020-08-31 2020-08-31 对象拦截方法、装置、介质及电子设备 Active CN111913741B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010894451.XA CN111913741B (zh) 2020-08-31 2020-08-31 对象拦截方法、装置、介质及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010894451.XA CN111913741B (zh) 2020-08-31 2020-08-31 对象拦截方法、装置、介质及电子设备

Publications (2)

Publication Number Publication Date
CN111913741A true CN111913741A (zh) 2020-11-10
CN111913741B CN111913741B (zh) 2023-12-15

Family

ID=73267904

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010894451.XA Active CN111913741B (zh) 2020-08-31 2020-08-31 对象拦截方法、装置、介质及电子设备

Country Status (1)

Country Link
CN (1) CN111913741B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112532381A (zh) * 2020-11-16 2021-03-19 航天信息股份有限公司 基于密码卡的数据处理方法、电子设备及存储介质
CN112596932A (zh) * 2021-01-04 2021-04-02 天冕信息技术(深圳)有限公司 服务注册及拦截方法、装置、电子设备及可读存储介质
CN112711566A (zh) * 2020-12-28 2021-04-27 广州品唯软件有限公司 跨服务Modify数据的共享使用方法、***、设备及存储介质

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020138821A1 (en) * 2001-01-23 2002-09-26 Vadim Furman Method and apparatus for seamless porting of object code between operating system environments
US20080301636A1 (en) * 2007-05-31 2008-12-04 Red Hat, Inc. Per-instance and per-class aspects
US20120233612A1 (en) * 2011-02-08 2012-09-13 Beckett Stephen M Code injection and code interception in an operating system with multiple subsystem environments
US20150378756A1 (en) * 2014-06-25 2015-12-31 SmartBear Software, Inc. Systems and methods for mobile application tracing instrumentation
CN106293808A (zh) * 2016-07-26 2017-01-04 北京北森云计算股份有限公司 多语言云编译实现***功能动态拦截扩展的方法及***
CN107092488A (zh) * 2017-03-31 2017-08-25 武汉斗鱼网络科技有限公司 一种对应用进行无侵入化埋点的实现方法及***
CN107436832A (zh) * 2016-05-27 2017-12-05 阿里巴巴集团控股有限公司 一种动态埋点的方法、装置及电子设备
US20190087210A1 (en) * 2017-09-20 2019-03-21 Citrix Systems, Inc. Java native interface and windows universal app hooking
CN111045746A (zh) * 2018-10-12 2020-04-21 北京京东尚科信息技术有限公司 代码扩展方法和框架
CN111290760A (zh) * 2020-03-03 2020-06-16 北京字节跳动网络技术有限公司 应用程序编译方法、装置、电子设备及存储介质

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020138821A1 (en) * 2001-01-23 2002-09-26 Vadim Furman Method and apparatus for seamless porting of object code between operating system environments
US20080301636A1 (en) * 2007-05-31 2008-12-04 Red Hat, Inc. Per-instance and per-class aspects
US20120233612A1 (en) * 2011-02-08 2012-09-13 Beckett Stephen M Code injection and code interception in an operating system with multiple subsystem environments
US20150378756A1 (en) * 2014-06-25 2015-12-31 SmartBear Software, Inc. Systems and methods for mobile application tracing instrumentation
CN107436832A (zh) * 2016-05-27 2017-12-05 阿里巴巴集团控股有限公司 一种动态埋点的方法、装置及电子设备
CN106293808A (zh) * 2016-07-26 2017-01-04 北京北森云计算股份有限公司 多语言云编译实现***功能动态拦截扩展的方法及***
CN107092488A (zh) * 2017-03-31 2017-08-25 武汉斗鱼网络科技有限公司 一种对应用进行无侵入化埋点的实现方法及***
US20190087210A1 (en) * 2017-09-20 2019-03-21 Citrix Systems, Inc. Java native interface and windows universal app hooking
CN111045746A (zh) * 2018-10-12 2020-04-21 北京京东尚科信息技术有限公司 代码扩展方法和框架
CN111290760A (zh) * 2020-03-03 2020-06-16 北京字节跳动网络技术有限公司 应用程序编译方法、装置、电子设备及存储介质

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
BC. JAKUB H´AVA: "Monitoring Tool for Distributed Java Applications", DEPARTMENT OF DISTRIBUTED AND DEPENDABLE SYSTEMS, pages 1 - 93 *
CSDN: "神奇的Hook机制,一文读懂AOP编程", Retrieved from the Internet <URL:http://t.csdn.cn/x7jLX> *
常丽梅: "Android移动应用缺陷监测***的设计与实现", 中国优秀硕士学位论文全文数据库 (信息科技辑), no. 12, pages 140 - 883 *
张冠豫: "基于Java Instrumentation技术的数据采集探针验证", 信息化技术应用, pages 2 - 4 *
李博亚等: "Android***中恶意代码的动态检测技术研究", 上海师范大学学报(自然科学版), vol. 46, no. 01, pages 16 - 22 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112532381A (zh) * 2020-11-16 2021-03-19 航天信息股份有限公司 基于密码卡的数据处理方法、电子设备及存储介质
CN112711566A (zh) * 2020-12-28 2021-04-27 广州品唯软件有限公司 跨服务Modify数据的共享使用方法、***、设备及存储介质
CN112596932A (zh) * 2021-01-04 2021-04-02 天冕信息技术(深圳)有限公司 服务注册及拦截方法、装置、电子设备及可读存储介质

Also Published As

Publication number Publication date
CN111913741B (zh) 2023-12-15

Similar Documents

Publication Publication Date Title
CN110096338B (zh) 智能合约执行方法、装置、设备及介质
CN111913741B (zh) 对象拦截方法、装置、介质及电子设备
US8615750B1 (en) Optimizing application compiling
US9170787B2 (en) Componentization of compiler functionality
US10209968B2 (en) Application compiling
US20090024986A1 (en) Runtime code modification
CN109564540B (zh) 用于jit编译器的调试的***、方法和设备
CN110704063B (zh) 编译和执行智能合约的方法及装置
CN111740948B (zh) 数据包发布方法、动态更新方法、装置、设备及介质
US20090328016A1 (en) Generalized expression trees
US20080295070A1 (en) Native access to foreign code environment
Shatnawi et al. Analyzing program dependencies in java ee applications
US9134973B2 (en) Dynamic compiling and loading at runtime
US8910137B2 (en) Code profiling of executable library for pipeline parallelization
CN111880801A (zh) 应用程序动态化方法、装置、电子设备
US10846417B2 (en) Identifying permitted illegal access operations in a module system
US8875089B2 (en) Workspace model for interrelated projects
CN112988175A (zh) 跨平台应用安装包的生成方法、装置、介质及电子设备
CN110110299B (zh) 文本变换方法、装置以及服务器
WO2022078057A1 (zh) 应用包发布方法、应用方法、装置、介质、服务器及设备
CN113778451B (zh) 文件加载方法、装置、计算机***和计算机可读存储介质
CN115390846A (zh) 编译构建方法、装置、电子设备和存储介质
US9720660B2 (en) Binary interface instrumentation
Husák et al. PeachPie: Mature PHP to CLI compiler
KR20050007901A (ko) 무선인터넷플랫폼이 탑재된 이동통신단말기에서실행가능한 바이너리코드를 생성하는 방법 및 시스템

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
TA01 Transfer of patent application right
TA01 Transfer of patent application right

Effective date of registration: 20211022

Address after: 310000 Room 408, building 3, No. 399, Wangshang Road, Changhe street, Binjiang District, Hangzhou City, Zhejiang Province

Applicant after: Hangzhou Netease Zhiqi Technology Co.,Ltd.

Address before: 310052 Building No. 599, Changhe Street Network Business Road, Binjiang District, Hangzhou City, Zhejiang Province, 4, 7 stories

Applicant before: NETEASE (HANGZHOU) NETWORK Co.,Ltd.

GR01 Patent grant
GR01 Patent grant