CN112799677B - 一种编译期的hook方法、装置、设备及存储介质 - Google Patents
一种编译期的hook方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN112799677B CN112799677B CN202110164407.8A CN202110164407A CN112799677B CN 112799677 B CN112799677 B CN 112799677B CN 202110164407 A CN202110164407 A CN 202110164407A CN 112799677 B CN112799677 B CN 112799677B
- Authority
- CN
- China
- Prior art keywords
- hook
- positioning information
- syntax tree
- preset
- abstract syntax
- 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
- 238000000034 method Methods 0.000 title claims abstract description 123
- 238000003672 processing method Methods 0.000 claims abstract description 50
- 238000002715 modification method Methods 0.000 claims description 12
- 238000004590 computer program Methods 0.000 claims description 10
- 230000004048 modification Effects 0.000 claims description 9
- 238000012986 modification Methods 0.000 claims description 9
- 230000007246 mechanism Effects 0.000 claims description 4
- 238000006243 chemical reaction Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 23
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 5
- 230000009471 action Effects 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
Classifications
-
- 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/447—Target code generation
-
- 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
-
- 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/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了一种编译期的hook方法、装置、设备及存储介质,所述方法包括:首先,接收hook代码文件和目标程序源码,hook代码文件包括预设定位信息与预设对象处理方法之间的对应关系。然后,将目标程序源码转换为抽象语法树后,确定抽象语法树中与hook代码文件中的预设定位信息对应的节点,利用与预设定位信息对应的预设对象处理方法,对抽象语法树中的该节点进行修改,得到更新后抽象语法树。最终,基于该更新后抽象语法树,生成目标程序。与在应用程序运行时执行hook方法相比,本公开实施例只需要在编译期执行hook方法即可,应用程序运行时不需要再执行hook方法,节省了系统资源。
Description
技术领域
本公开涉及数据处理领域,尤其涉及一种编译期的hook方法、装置、设备及存储介质。
背景技术
在项目开发流程中,当应用程序完成代码开发后,需要对程序源码进行编译,最终得到可执行文件,该可执行文件能够安装并运行于计算机设备中。
实际应用中,在代码开发完成后,如果存在新增的功能需求,目前需要开发人员人工修改程序源码,以实现应用程序功能的更新,然后再基于修改后程序源码进行编译,得到可执行文件。
但是,由于程序源码的代码量通常较大,人工对程序源码进行修改比较困难,因此,目前可以在应用程序运行时,通过在需要调整功能的代码位置插桩,并在插桩位置执行hook方法的方式,实现应用程序功能的更新。
但是,由于需要调整功能的代码位置通常较多,如果基于上述应用程序运行时执行hook方法的方式,则在每一次的应用程序运行时均需要大量的执行hook方法,对系统资源消耗较大。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开提供了一种编译期的hook方法、装置、设备及存储介质,能够在编译期通过执行hook方法对目标程序源码中的指定对象进行修改,使得编译后得到的目标程序中实现了功能的更新。
第一方面,本公开提供了一种编译期的hook方法,所述方法包括:
接收钩子程序hook代码文件和目标程序源码;其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序源码中的对象;
将所述目标程序源码转换为抽象语法树,并确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点;其中,所述抽象语法树中的节点与所述目标程序源码中的对象具有对应关系;
利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树;
基于所述更新后抽象语法树,生成目标程序。
一种可选的实施方式中,所述预设对象处理方法包括对象替换方法或对象修改方法;
所述利用所述hook配置文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后语法树,包括:
利用所述hook配置文件中与所述预设定位信息对应的对象替换方法,将所述抽象语法树中与所述预设定位信息对应的节点替换为所述对象替换方法中的指定对象,得到更新后抽象语法树;
或者,利用所述hook配置文件中与所述预设定位信息对应的对象修改方法,对所述抽象语法树中与所述预设定位信息对应的节点中的逻辑内容进行修改,得到更新后抽象语法树。
一种可选的实施方式中,所述接收钩子程序hook代码文件和目标程序源码之前,还包括:
基于预设标记机制,标记所述目标程序源码中的目标对象的定位信息,作为所述预设定位信息。
一种可选的实施方式中,所述预设定位信息包括文件位置信息、类名和方法名。
一种可选的实施方式中,所述目标程序源码为Dart程序源码,所述目标程序源码为Dart程序源码,所述确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点,包括:
基于所述hook代码文件的预设定位信息,确定所述抽象语法树中与所述预设定位信息中的所述文件位置信息对应的节点,作为第一节点;
确定所述第一节点中与所述预设定位信息中的所述类名对应的节点,作为第二节点;
确定所述第二节点中与所述预设定位信息中的所述方法名对应的节点,作为第三节点;
相应的,所述利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树,包括:
利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中的所述第三节点进行修改,得到更新后抽象语法树。
一种可选的实施方式中,所述接收hook代码文件和目标程序源码之前,还包括:
接收用户输入的源码参数信息,并将所述源码参数信息添加到预设文件模板中;
接收向所述预设文件模板写入的对象处理方法,得到hook代码文件。
第二方面,本公开提供了一种编译期的hook装置,所述装置包括:
接收模块,用于接收钩子程序hook代码文件和目标程序的源代码;其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序的源代码中的对象;
转换模块,用于将所述目标程序的源代码转换为抽象语法树;
确定模块,用于确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点;其中,所述抽象语法树中的节点与所述目标程序源码中的对象具有对应关系;
修改模块,用于利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树;其中,所述修改后程序代码用于生成可执行文件;
生成模块,用于基于所述更新后抽象语法树,生成目标程序。
一种可选的实施方式中,所述预设对象处理方法包括对象替换方法或对象修改方法;
所述修改模块,包括:
替换子模块,用于利用所述hook代码文件中与所述预设定位信息对应的对象替换方法,将所述抽象语法树中与所述预设定位信息对应的节点替换为所述对象替换方法中的指定对象,得到更新后抽象语法树;
或者,
修改子模块,用于利用所述hook代码文件中与所述预设定位信息对应的对象修改方法,对所述抽象语法树中与所述预设定位信息对应的节点中的逻辑内容进行修改,得到更新后抽象语法树。
第三方面,本公开提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现上述的方法。
第四方面,本公开提供了一种设备,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述的方法。
第五方面,本公开提供了一种计算机程序产品,所述计算机程序产品包括计算机程序/指令,该计算机程序/指令被处理器执行时实现上述的方法。
本公开实施例提供的技术方案与现有技术相比具有如下优点:
本公开实施例提供了一种编译期的hook方法,首先,接收钩子程序hook代码文件和目标程序源码,其中,hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,预设定位信息用于标识目标程序源码中的对象。然后,将目标程序源码转换为抽象语法树后,确定抽象语法树中与hook代码文件中的预设定位信息对应的节点,进而,利用hook代码文件中与预设定位信息对应的预设对象处理方法,对抽象语法树中与预设定位信息对应的节点进行修改,得到更新后抽象语法树。最终,基于该更新后抽象语法树,生成目标程序。
本公开实施例在编译期通过hook方法修改目标程序源码的抽象语法树中的节点,使得编译后得到的目标程序中实现了功能的更新。与现有技术中在应用程序运行时执行hook方法相比,本公开实施例只需要在编译期执行hook方法即可,应用程序运行时不需要再执行hook方法,节省了系统资源。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例提供的一种编译期的hook方法的流程图;
图2为本公开实施例提供的一种抽象语法树的部分结构示意图;
图3为本公开实施例提供的一种编译期的hook装置的结构示意图;
图4为本公开实施例提供的一种编译期的hook设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
在项目开发流程中,当存在业务需求的变更时,通常在对程序源码进行编译之前,由开发人员通过人工修改程序源码的方式实现产品功能的更新。
但是,程序源码的代码量一般较大,需要修改的代码位置较多,由开发人员人工修改程序源码的方式,实现产品功能的更新比较困难,效率较低且容易出错。
为此,目前可以通过在应用程序运行时,针对需要调整功能的代码位置执行hook方法的方式,对应用程序的功能进行调整。但是,由于应用程序中需要调整功能的代码位置通常较多,应用程序每一次的运行均需要执行大量的hook方法,显然对于系统资源消耗较大。
因此,本公开提供了一种编译期的hook方法,在对目标程序源码进行编译过程中,通过hook方法修改目标程序源码的抽象语法树中的节点,使得编译后得到的目标程序中实现了功能的更新,与应用程序运行时执行hook方法相比,本公开实施例只需要在编译期执行hook方法即可,应用程序运行时不需要再执行hook方法,节省了系统资源。
具体的,本公开提供的编译期的hook方法中,首先,接收钩子程序hook代码文件和目标程序源码,其中,hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,预设定位信息用于标识目标程序源码中的对象。然后,将目标程序源码转换为抽象语法树后,确定抽象语法树中与hook代码文件中的预设定位信息对应的节点,进而,利用hook代码文件中与预设定位信息对应的预设对象处理方法,对抽象语法树中与预设定位信息对应的节点进行修改,得到更新后抽象语法树。最终,基于该更新后抽象语法树,生成目标程序。
基于此,本公开实施例提供了一种编译期的hook方法,参考图1,为本公开实施例提供的一种编译期的hook方法的流程图,该方法包括:
S101:接收钩子程序hook代码文件和目标程序源码。
其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序源码中的对象。
钩子程序hook是一种拦截程序原有执行流程,添加预设处理逻辑的一种技术,hook方法一般在应用程序的运行阶段被使用。
本公开实施例中,在程序源码的编译阶段实现了hook方法,用于在程序源码的编译期对抽象语法树中的指定节点进行修改,使得编译后的目标程序中实现了功能的更新。
本公开实施例中的目标程序源码可以为基于任意一种开发语言开发得到的程序源码,例如,目标程序源码可以为Dart程序源码。
本公开实施例中,hook代码文件中可以包括一对或多对预设定位信息和预设对象处理方法之间的对应关系,其中,预设定位信息用于定位目标程序源码中的目标对象,预设对象处理方法用于指定基于对应的预设定位信息定位的目标对象的处理逻辑。
实际应用中,hook代码文件可以通过用户人工编写代码的方式得到。另外,hook代码文件也可以基于预设文件模板和用户输入的源码参数信息自动化生成。具体的,首先接收用户输入的源码参数信息,并将该源码参数信息添加到预设文件模板中。然后,接收向该预设文件模板写入的对象处理方法,得到hook代码文件,该hook代码文件能够用于实现编译期的hook方法。如下所示,为本公开实施例提供的一种hook代码文件的示例,其中,用户输入的源码参数信息包括:'package:http/src/base_client.dart'、'BaseClient'和'_sendUnstreamed';对象处理方法为sendUnstreamed,用于拦截网络请求。
一种可选的实施方式中,源码参数信息可以包括文件位置信息、类名和方法名的对应关系,其中,文件位置信息用于标识文件,文件中包括至少一个类,类中包括至少一个方法。通过文件位置信息、类名和方法名的对应关系可以定位到目标方法,作为hook对象。
实际应用中,用户通过输入源码参数信息指定目标程序源码中的hook对象。具体的,用户输入的源码参数信息添加到预设文件模板后,作为生成的hook代码文件中的预设定位信息。另外,在该预设文件模板中,针对该预设定位信息写入对象处理方法,作为生成的hook代码文件中与该预设定位信息对应的预设对象处理方法,用于定义该预设定位信息对应的hook对象的处理逻辑。
一种可选的实施方式中,可以基于预设标记机制,标记出目标程序源码中的目标对象的定位信息,作为本公开实施例中的预设定位信息,用于定位到hook对象。
S102:将所述目标程序源码转换为抽象语法树,并确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点。
其中,所述抽象语法树中的节点与所述目标程序源码中的对象具有对应关系。
本公开实施例中,在对目标程序源码进行编译的过程中,将目标程序源码转换为抽象语法树,其中,抽象语法树中的各个节点与目标程序源码中的语法元素具有对应关系,语法元素可以包括Component组件、Library库、Class类、Procedure方法以及Field字段等。
具体的,将目标程序源码转换为抽象语法树的过程属于源码编译中的语法分析过程,具体的实现方式在本公开实施例中不做赘述。
本公开实施例中,在获取到目标程序源码对应的抽象语法树之后,基于hook代码文件中的预设定位信息,从抽象语法树中确定与其对应的节点。
一种可选的实施方式中,预设定位信息包括文件位置信息、类名和方法名的对应关系,在确定抽象语法树中与hook代码文件中的预设定位信息对应的节点时,可以首先基于hook代码文件中的预设定位信息中的文件位置信息,确定抽象语法树中与其对应的节点,作为第一节点。具体的,第一节点可以指以该文件位置信息所标识的文件对应的节点为父节点的各个子节点。
参考图2,为本公开实施例提供的一种抽象语法树的部分结构示意图,其中,假设预设定位信息中的文件位置信息所标识的文件对应的节点为节点A,则以节点A为父节点的各个子节点B、C、D和E均属于第一节点。
在确定抽象语法树中的第一节点后,基于预设定位信息中与该文件位置信息对应的类名,从第一节点中确定与该类名对应的第二节点。如图2所示,假设该类名所标识的类对应的节点为节点B,则以节点B为父节点的各个子节点D和E均作为第二节点。
在确定抽象语法树中的第二节点后,基于预设定位信息中与该类名对应的方法名,从第二节点中确定与该方法名对应的第三节点。如图2所示,假设该方法名所标识的方法对应的节点为节点D,则将节点D确定为第三节点,作为本公开实施例的修改目标。
S103:利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树。
本公开实施例中,在确定抽象语法树中与hook代码文件中的预设定位信息对应的节点之后,从hook代码文件中确定与该预设定位信息具有对应关系的预设对象处理方法,然后利用该预设对象处理方法对确定的节点进行修改,得到更新后抽象语法树。
实际应用中,如果hook代码文件中存在多对预设定位信息与预设对象处理方法的对应关系时,分别基于每对对应关系处理对应的节点,最终实现对抽象语法树的更新,得到更新后抽象语法树。
S104:基于所述更新后抽象语法树,生成目标程序。
本公开实施例中,在对目标程序源码进行编译的过程中,在得到更新后抽象语法树之后,基于该更新后抽象语法树继续进行编译,最终生成目标程序。由于更新后抽象语法树中的部分节点被修改,因此,基于更新后抽象语法树生成的目标程序中也实现了功能的更新。
本公开实施例提供的编译期的hook方法中,首先,接收钩子程序hook代码文件和目标程序源码,其中,hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,预设定位信息用于标识目标程序源码中的对象。然后,将目标程序源码转换为抽象语法树后,确定抽象语法树中与hook代码文件中的预设定位信息对应的节点,进而,利用hook代码文件中与预设定位信息对应的预设对象处理方法,对抽象语法树中与预设定位信息对应的节点进行修改,得到更新后抽象语法树。最终,基于该更新后抽象语法树,生成目标程序。与现有技术中在应用程序运行时执行hook方法相比,本公开实施例只需要在编译期执行hook方法即可,应用程序运行时不需要再执行hook方法,节省了系统资源。
基于上述实施例,本公开还提供了一种对抽象语法树中的节点进行修改的以下两种具体实施方法。
实际应用中,hook代码文件中包含的预设对象处理方法为对象替换方法或者对象修改方法。其中,对象替换方法用于指定将预设定位信息对应的节点替换为指定对象的处理逻辑。而对象修改方法用于指定对预设定位信息对应的节点中的逻辑内容进行修改的处理逻辑。
一种可选的实施方式中,如果hook代码文件中与预设定位信息具有对应关系的预设对象处理方法为对象替换方法,则在确定抽象语法树中与该预设定位信息对应的节点后,利用该对象替换方法,将抽象语法树中与该预设定位信息对应的节点替换为该对象替换方法中的指定对象,实现对抽象语法树的更新,得到更新后抽象语法树。
另一种可选的实施方式中,如果hook代码文件中与预设定位信息具有对应关系的预设对象处理方法为对象修改方法,则在确定抽象语法树中与该预设定位信息对应的节点后,利用该对象修改方法,对抽象语法树中与该预设定位信息对应的节点中的逻辑内容进行修改,实现对抽象语法树的更新,得到更新后抽象语法树。
本公开实施例中,在基于hook代码文件中的每对预设定位信息与预设对象处理方法之间的对应关系,完成对目标程序源码对应的抽象语法树的更新后,得到更新后抽象语法树,然后,基于该更新后抽象语法树执行后续编译流程,最终得到目标程序。
本公开实施例提供的编译期的hook方法,在对目标程序源码进行编译的过程中,不仅能够通过hook方法对目标程序源码中的对象的实现逻辑的修改,还能够通过hook方法对目标程序源码中的对象的替换,使得编译后得到的目标程序中实现了功能的更新,避免了应用程序运行时执行hook方法,节省了系统资源。
实际应用中,本公开提供的编译期的hook方法可以应用于以下几种应用场景中。
一种可选的应用场景中,本公开提供的编译期的hook方法可以应用于部署于本地设备的编译器中,具体的,该编译器可以为任意一种编程语言对应的编译器,如Dart编译器等。
具体的,在编译器对目标程序源码进行编译的过程中,还可以执行本公开实施例提供的编译期的hook方法,以实现在编译期对目标程序源码中的指定功能的更新。
另一种可选的应用场景中,可以由云平台和本地设备协同实现本公开实施例提供的编译期的hook方法。具体的,本地设备中安装有客户端,云平台部署有编译器,由客户端接收hook代码文件和目标程序源码之后,将hook代码文件和目标程序源码上传至云平台,后续由云平台上部署的编译器基于接收到的hook代码文件和目标程序源码执行本公开实施例提供的编译期的hook方法,以实现在编译期对目标程序源码中的指定功能的更新,最终生成目标程序。另外,云平台还可以将生成的目标程序下发至客户端。
在上述应用场景中,云平台上可以部署多个编译器,该多个编译器可以包括不同编程语言分别对应的编译器,例如,包括Dart编译器,java编译器等。实际应用中,可以由客户端用户指定云平台上的编译器为目标编译器,后续利用该目标编译器执行本公开实施例提供的编译期的hook方法,实现对目标程序源码的编译功能。
另一种可选的应用场景中,本公开实施例提供的编译期的hook方法还可以作为编译器的插件功能,应用于可安装至编译器的插件中。
事实上,本公开实施例提供的编译期的hook方法也能够应用于其他各种应用场景中,本公开不做限制。
基于上述方法实施例,本公开还提供了一种编译期的hook装置,参考图3,为本公开实施例提供的一种编译期的hook装置的结构示意图,所述装置包括:
接收模块301,用于接收钩子程序hook代码文件和目标程序的源代码;其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序的源代码中的对象;
转换模块302,用于将所述目标程序的源代码转换为抽象语法树;
确定模块303,用于确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点;
修改模块304,用于利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树;其中,所述修改后程序代码用于生成可执行文件;
生成模块305,用于基于所述更新后抽象语法树,生成目标程序。
一种可选的实施方式中,所述预设对象处理方法包括对象替换方法或对象修改方法;
所述修改模块,包括:
替换子模块,用于利用所述hook代码文件中与所述预设定位信息对应的对象替换方法,将所述抽象语法树中与所述预设定位信息对应的节点替换为所述对象替换方法中的指定对象,得到更新后抽象语法树;
或者,
修改子模块,用于利用所述hook代码文件中与所述预设定位信息对应的对象修改方法,对所述抽象语法树中与所述预设定位信息对应的节点中的逻辑内容进行修改,得到更新后抽象语法树。
一种可选的实施方式中,所述装置还包括:
标记模块,用于基于预设标记机制,标记所述目标程序源码中的目标对象的定位信息,作为所述预设定位信息。
一种可选的实施方式中,所述预设定位信息包括文件位置信息、类名和方法名。
一种可选的实施方式中,目标程序源码为Dart程序源码,所述确定模块,包括:
第一确定子模块,用于基于所述hook代码文件的预设定位信息,确定所述抽象语法树中与所述预设定位信息中的所述文件位置信息对应的节点,作为第一节点;
第二确定子模块,用于确定所述第一节点中与所述预设定位信息中的所述类名对应的节点,作为第二节点;
第三确定子模块,用于确定所述第二节点中与所述预设定位信息中的所述方法名对应的节点,作为第三节点;
相应的,所述修改模块,具体用于:
利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中的所述第三节点进行修改,得到更新后抽象语法树。
一种可选的实施方式中,所述装置还包括:
添加模块,用于接收用户输入的源码参数信息,并将所述源码参数信息添加到预设文件模板中;
写入模块,用于接收向所述预设文件模板写入的对象处理方法,得到hook代码文件。
本公开实施例提供的编译期的hook装置中,首先,接收钩子程序hook代码文件和目标程序源码,其中,hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,预设定位信息用于标识目标程序源码中的对象。然后,将目标程序源码转换为抽象语法树后,确定抽象语法树中与hook代码文件中的预设定位信息对应的节点,进而,利用hook代码文件中与预设定位信息对应的预设对象处理方法,对抽象语法树中与预设定位信息对应的节点进行修改,得到更新后抽象语法树。最终,基于该更新后抽象语法树,生成目标程序。与现有技术中在应用程序运行时执行hook方法相比,本公开实施例只需要在编译期执行hook方法即可,应用程序运行时不需要再执行hook方法,节省了系统资源。
除了上述方法和装置以外,本公开实施例还提供了一种计算机可读存储介质,计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现本公开实施例所述的编译期的hook方法。
本公开实施例还提供了一种计算机程序产品,包括计算机程序/指令,其特征在于,该计算机程序/指令被处理器执行时实现本公开实施例所述的编译期的hook方法。
另外,本公开实施例还提供了一种编译期的hook设备,参见图4所示,可以包括:
处理器401、存储器402、输入装置403和输出装置404。编译期的hook设备中的处理器401的数量可以一个或多个,图4中以一个处理器为例。在本公开的一些实施例中,处理器401、存储器402、输入装置403和输出装置404可通过总线或其它方式连接,其中,图4中以通过总线连接为例。
存储器402可用于存储软件程序以及模块,处理器401通过运行存储在存储器402的软件程序以及模块,从而执行编译期的hook设备的各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。输入装置403可用于接收输入的数字或字符信息,以及产生与编译期的hook设备的用户设置以及功能控制有关的信号输入。
具体在本实施例中,处理器401会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现上述编译期的hook设备的各种功能。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (9)
1.一种编译期的hook方法,其特征在于,所述方法包括:
接收钩子程序hook代码文件和目标程序源码;其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序源码中的对象;
将所述目标程序源码转换为抽象语法树,并确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点;其中,所述抽象语法树中的节点与所述目标程序源码中的对象具有对应关系;
利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树;
基于所述更新后抽象语法树,生成目标程序。
2.根据权利要求1所述的方法,其特征在于,所述预设对象处理方法包括对象替换方法或对象修改方法;
所述利用所述hook配置文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后语法树,包括:
利用所述hook配置文件中与所述预设定位信息对应的对象替换方法,将所述抽象语法树中与所述预设定位信息对应的节点替换为所述对象替换方法中的指定对象,得到更新后抽象语法树;
或者,利用所述hook配置文件中与所述预设定位信息对应的对象修改方法,对所述抽象语法树中与所述预设定位信息对应的节点中的逻辑内容进行修改,得到更新后抽象语法树。
3.根据权利要求1所述的方法,其特征在于,所述接收钩子程序hook代码文件和目标程序源码之前,还包括:
基于预设标记机制,标记所述目标程序源码中的目标对象的定位信息,作为所述预设定位信息。
4.根据权利要求3所述的方法,其特征在于,所述预设定位信息包括文件位置信息、类名和方法名。
5.根据权利要求4所述的方法,其特征在于,所述目标程序源码为Dart程序源码,所述确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点,包括:
基于所述hook代码文件的预设定位信息,确定所述抽象语法树中与所述预设定位信息中的所述文件位置信息对应的节点,作为第一节点;
确定所述第一节点中与所述预设定位信息中的所述类名对应的节点,作为第二节点;
确定所述第二节点中与所述预设定位信息中的所述方法名对应的节点,作为第三节点;
相应的,所述利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树,包括:
利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中的所述第三节点进行修改,得到更新后抽象语法树。
6.根据权利要求1所述的方法,其特征在于,所述接收钩子程序hook代码文件和目标程序源码之前,还包括:
接收用户输入的源码参数信息,并将所述源码参数信息添加到预设文件模板中;
接收向所述预设文件模板写入的对象处理方法,得到hook代码文件。
7.一种编译期的hook装置,其特征在于,所述装置包括:
接收模块,用于接收钩子程序hook代码文件和目标程序的源代码;其中,所述hook代码文件中包括预设定位信息与预设对象处理方法之间的对应关系,所述预设定位信息用于标识所述目标程序的源代码中的对象;
转换模块,用于将所述目标程序的源代码转换为抽象语法树;
确定模块,用于确定所述抽象语法树中与所述hook代码文件中的预设定位信息对应的节点;其中,所述抽象语法树中的节点与所述目标程序源码中的对象具有对应关系;
修改模块,用于利用所述hook代码文件中与所述预设定位信息对应的预设对象处理方法,对所述抽象语法树中与所述预设定位信息对应的节点进行修改,得到更新后抽象语法树;其中,所述修改后程序代码用于生成可执行文件;
生成模块,用于基于所述更新后抽象语法树,生成目标程序。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现如权利要求1-6任一项所述的方法。
9.一种设备,其特征在于,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现如权利要求1-6任一项所述的方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110164407.8A CN112799677B (zh) | 2021-02-05 | 2021-02-05 | 一种编译期的hook方法、装置、设备及存储介质 |
PCT/CN2022/073580 WO2022166669A1 (zh) | 2021-02-05 | 2022-01-24 | 一种编译期的hook方法、装置、设备及存储介质 |
US18/275,577 US20240311111A1 (en) | 2021-02-05 | 2022-01-24 | Hook method and apparatus for compile time, device, and storage medium |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110164407.8A CN112799677B (zh) | 2021-02-05 | 2021-02-05 | 一种编译期的hook方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112799677A CN112799677A (zh) | 2021-05-14 |
CN112799677B true CN112799677B (zh) | 2023-09-12 |
Family
ID=75814544
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110164407.8A Active CN112799677B (zh) | 2021-02-05 | 2021-02-05 | 一种编译期的hook方法、装置、设备及存储介质 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20240311111A1 (zh) |
CN (1) | CN112799677B (zh) |
WO (1) | WO2022166669A1 (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112799677B (zh) * | 2021-02-05 | 2023-09-12 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
CN113515300B (zh) * | 2021-07-09 | 2023-08-22 | 北京字节跳动网络技术有限公司 | 代码查看方法、装置、电子设备和存储介质 |
CN114035805B (zh) * | 2021-11-16 | 2024-07-26 | 北京字节跳动网络技术有限公司 | 用于预编译器的代码转换方法、装置、介质及设备 |
CN114691104A (zh) * | 2021-12-22 | 2022-07-01 | 北京达佳互联信息技术有限公司 | 一种语言转换方法、装置、电子设备及存储介质 |
CN114461247A (zh) * | 2022-02-07 | 2022-05-10 | 北京京东振世信息技术有限公司 | 热更新方法、装置、电子设备和计算机可读介质 |
CN114880357A (zh) * | 2022-05-25 | 2022-08-09 | 北京百度网讯科技有限公司 | 源码信息检索方法、装置、电子设备、存储介质及产品 |
CN115034960A (zh) * | 2022-06-23 | 2022-09-09 | 北京百度网讯科技有限公司 | 动态图转静态图的方法、装置、电子设备和存储介质 |
CN115904480B (zh) * | 2023-01-09 | 2023-07-14 | 成方金融科技有限公司 | 代码重构方法、装置、电子设备及存储介质 |
CN116775040B (zh) * | 2023-08-16 | 2023-11-17 | 北京安普诺信息技术有限公司 | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110149800A (zh) * | 2015-04-07 | 2019-08-20 | 华为技术有限公司 | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 |
CN110633567A (zh) * | 2019-05-31 | 2019-12-31 | 天津理工大学 | 一种基于rasp的智能合约虚拟机漏洞检测系统及方法 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111684766A (zh) * | 2019-05-23 | 2020-09-18 | 深圳市大疆创新科技有限公司 | 分布式系统中通信协议版本号的更新 |
CN111736840A (zh) * | 2019-09-19 | 2020-10-02 | 北京沃东天骏信息技术有限公司 | 小程序应用的编译方法、运行方法、存储介质及电子设备 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8813047B2 (en) * | 2005-09-08 | 2014-08-19 | Alcatel Lucent | Yet another transformation language (YATL) |
US9047100B2 (en) * | 2011-12-16 | 2015-06-02 | Microsoft Technology Licensing, Llc | Abstract syntax tree transformation |
CN106990955A (zh) * | 2017-03-09 | 2017-07-28 | 武汉斗鱼网络科技有限公司 | 一种对应用程序进行打点的方法和系统 |
US11080164B2 (en) * | 2018-01-08 | 2021-08-03 | Ozcode Ltd. | Time travel source code debugger incorporating redaction of sensitive information |
CN111090433B (zh) * | 2019-10-23 | 2023-10-20 | 贝壳技术有限公司 | 一种数据处理的方法、装置和存储介质 |
CN111352849B (zh) * | 2020-03-13 | 2023-05-16 | 杭州趣维科技有限公司 | 一种移动端无码埋点解决方法 |
CN112799677B (zh) * | 2021-02-05 | 2023-09-12 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
-
2021
- 2021-02-05 CN CN202110164407.8A patent/CN112799677B/zh active Active
-
2022
- 2022-01-24 US US18/275,577 patent/US20240311111A1/en active Pending
- 2022-01-24 WO PCT/CN2022/073580 patent/WO2022166669A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110149800A (zh) * | 2015-04-07 | 2019-08-20 | 华为技术有限公司 | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 |
CN111684766A (zh) * | 2019-05-23 | 2020-09-18 | 深圳市大疆创新科技有限公司 | 分布式系统中通信协议版本号的更新 |
CN110633567A (zh) * | 2019-05-31 | 2019-12-31 | 天津理工大学 | 一种基于rasp的智能合约虚拟机漏洞检测系统及方法 |
CN111736840A (zh) * | 2019-09-19 | 2020-10-02 | 北京沃东天骏信息技术有限公司 | 小程序应用的编译方法、运行方法、存储介质及电子设备 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112799677A (zh) | 2021-05-14 |
US20240311111A1 (en) | 2024-09-19 |
WO2022166669A1 (zh) | 2022-08-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112799677B (zh) | 一种编译期的hook方法、装置、设备及存储介质 | |
EP3204849B1 (en) | Systems and methods to update source code files | |
KR101795844B1 (ko) | 런타임 시스템 | |
EP2827244A1 (en) | Extension mechanism for scripting language compiler | |
CN111061638B (zh) | 一种iOS系统调试的方法、装置及服务器 | |
US20080104096A1 (en) | Software development system | |
CN111399853A (zh) | 机器学习模型与自定义算子的模板化部署方法 | |
JP2004295398A (ja) | コンパイラ、コンパイル方法、及びプログラム開発ツール | |
US20090328016A1 (en) | Generalized expression trees | |
CN112596739B (zh) | 一种数据的处理方法和装置 | |
CN110109671B (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
CN112882718A (zh) | 编译处理方法、装置、设备及存储介质 | |
CN115951890A (zh) | 一种不同前端框架间的代码转换方法及系统及装置 | |
CN115686606A (zh) | 一种项目依赖树的展示方法、装置、系统及介质 | |
CN111596951A (zh) | 一种工程文件的配置方法及装置 | |
CN113360156B (zh) | 一种ios编译方法及相关设备 | |
CN111552480B (zh) | 跨平台编译方法、装置、设备及可读存储介质 | |
US10545741B2 (en) | Information processing apparatus, method of compiling, and storage medium | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
US7873949B2 (en) | In source code suppression of binary analysis | |
JP3266097B2 (ja) | 非リエントラントプログラムの自動リエントラント化方法及びシステム | |
Rástočný et al. | Automated change propagation from source code to sequence diagrams | |
Abate et al. | Bootstrapping software distributions | |
CN113946338B (zh) | 基于rinsim仿真平台的c语言编译方法及装置 | |
JP2009098963A (ja) | モジュール自動生成システム |
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 |