实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法与流程
未命名
09-22
阅读:80
评论:0
1.本公开涉及计算机技术领域,具体而言,涉及一种实现代码疫苗的插桩方法、基于代码疫苗的应用测试方法、装置、设备及介质。
背景技术:
2.数字化时代,用户面临日益复杂和普遍的网络安全威胁。随着黑客技术的不断演进和网络攻击的规模不断扩大,用户面临着巨大的业务安全风险。在这个信息泄露和数据侵犯的时代,保护用户的敏感信息和业务资产变得尤为重要。基于插桩技术实现的代码疫苗技术应运而生,代码疫苗是通过像疫苗一样将代码安全能力注入到应用服务器内部,在内部清晰看到解析后的流量,感知应用运行过程的情境上下文,既能实现运行时诊断应用自身存在的漏洞位置和缺陷成因,同时也能基于此防御外部危险,进行自主检测和响应。go语言是近几年兴起的编程语言,其核心优势在于开发/运行效率高、工具链完善且二进制易于部署。由于go语言与其他编程语言的属性完全不同,利用传统的runtime机制进行插桩的方式对于go语言就不再有效。对于go语言的插桩,得益于go语言的开源特性,可以直接对go语言工具链的源码进行改写。具体的,通过将“go build”命令逻辑进行改写,即可在项目构建过程中,将用于安全保障的检测逻辑加入关键方法之中。
3.在对go语言进行插桩时,大多是直接在源代码指定位置处添加检测逻辑代码,可能会影响正常的业务运行,对于代码运行的限制较大。
技术实现要素:
4.本公开实施例至少提供一种实现代码疫苗的插桩方法、基于代码疫苗的应用测试方法、装置、设备及介质。
5.本公开实施例提供了一种实现代码疫苗的插桩方法,所述方法包括:确定初始编译源码;针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
6.一种可选的实施方式中,所述针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,包括:对所述初始编译源码进行解析,得到所述初始编译源码对应的抽象语法树;在所述抽象语法树中待进行检测的目标函数中插入钩子函数,将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,所述接口函数用于指示代理函数从
目标编译源码中获取信息;对所述修改后的抽象语法树进行转换,得到目标编译源码。
7.一种可选的实施方式中,所述在所述抽象语法树中待进行检测的目标函数中插入钩子函数,包括:基于预设的函数检测需求,从所述抽象语法树中确定待进行检测的目标函数;确定与所述目标函数对应的钩子插入要求,所述钩子插入要求包括钩子类型、钩子变量、钩子获取方式、钩子设置方式和钩子调用逻辑;基于所述钩子插入要求,在所述目标函数中插入钩子函数。
8.一种可选的实施方式中,所述方法还包括:将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中。
9.一种可选的实施方式中,所述确定与所述目标编译源码匹配的代理函数代码,包括:基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码。
10.一种可选的实施方式中,所述基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码,包括:基于所述目标函数对应的函数信息,确定与所述函数信息对应的检测逻辑代码;基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码;基于所述检测逻辑代码和所述调用逻辑代码,确定所述代理函数代码。
11.一种可选的实施方式中,所述基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,包括:对所述代理函数代码进行编译处理,得到代理编译文件,将所述代理函数代码对应的代理信息写入编译临时目录中;基于所述编译临时目录中的信息,将所述初始编译源码的第一文件路径替换为所述目标编译源码的第二文件路径;对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件;对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件。
12.一种可选的实施方式中,所述对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件,包括:按照所述第二文件路径调用得到所述目标编译源码;将指示代理函数代码启动逻辑的代码写入所述目标编译源码中的启动函数中,得到修改后的目标编译源码;对所述修改后的目标编译源码进行编译处理,得到应用编译文件。
13.一种可选的实施方式中,所述对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件,包括:基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件;基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接
处理,得到所述执行文件。
14.一种可选的实施方式中,所述基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件,包括:将所述编译临时目录中的信息和所述预设链接配置文件中的信息进行去重合并处理,得到去重合并处理后的信息;将包括去重合并处理后的信息的文件确定为所述目标链接配置文件。
15.一种可选的实施方式中,所述基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件,包括:基于所述目标链接配置文件中的信息,将所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径;按照所述第四文件路径调用所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
16.本公开实施例提供了一种基于代码疫苗的应用测试方法,所述方法包括:获取根据上述的实现代码疫苗的插桩方法得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。
17.一种可选的实施方式中,所述响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上,包括:响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上。
18.一种可选的实施方式中,在所述通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上之后,所述方法还包括:通过所述代理函数代码将所述钩子函数上的所述第一检测逻辑代码删除;通过所述代理函数代码将与所述目标函数对应的第二检测逻辑代码挂载在所述钩子函数上。
19.本公开实施例还提供一种实现代码疫苗的插桩装置,所述装置包括:源码确定模块,用于确定初始编译源码;钩子插入模块,用于针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;代理确定模块,用于确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;文件生成模块,用于基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
20.一种可选的实施方式中,所述钩子插入模块具体用于:对所述初始编译源码进行解析,得到所述初始编译源码对应的抽象语法树;在所述抽象语法树中待进行检测的目标函数中插入钩子函数,将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,所述接口函数用于指示代理函数从目标编译源码中获取信息;对所述修改后的抽象语法树进行转换,得到目标编译源码。
21.一种可选的实施方式中,所述钩子插入模块在用于所述在所述抽象语法树中待进行检测的目标函数中插入钩子函数时,具体用于:基于预设的函数检测需求,从所述抽象语法树中确定待进行检测的目标函数;确定与所述目标函数对应的钩子插入要求,所述钩子插入要求包括钩子类型、钩子变量、钩子获取方式、钩子设置方式和钩子调用逻辑;基于所述钩子插入要求,在所述目标函数中插入钩子函数。
22.一种可选的实施方式中,所述钩子插入模块还用于:将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中。
23.一种可选的实施方式中,所述代理确定模块具体用于:基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码。
24.一种可选的实施方式中,所述代理确定模块在用于所述基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码时,具体用于:基于所述目标函数对应的函数信息,确定与所述函数信息对应的检测逻辑代码;基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码;基于所述检测逻辑代码和所述调用逻辑代码,确定所述代理函数代码。
25.一种可选的实施方式中,所述文件生成模块具体用于:对所述代理函数代码进行编译处理,得到代理编译文件,将所述代理函数代码对应的代理信息写入编译临时目录中;基于所述编译临时目录中的信息,将所述初始编译源码的第一文件路径替换为所述目标编译源码的第二文件路径;对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件;对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件。
26.一种可选的实施方式中,所述文件生成模块在用于所述对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件时,具体用于:按照所述第二文件路径调用得到所述目标编译源码;将指示代理函数代码启动逻辑的代码写入所述目标编译源码中的启动函数中,得到修改后的目标编译源码;对所述修改后的目标编译源码进行编译处理,得到应用编译文件。
27.一种可选的实施方式中,所述文件生成模块在用于所述对所述代理编译文件和所
述应用编译文件进行链接处理,得到执行文件时,具体用于:基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件;基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
28.一种可选的实施方式中,所述文件生成模块在用于所述基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件时,具体用于:将所述编译临时目录中的信息和所述预设链接配置文件中的信息进行去重合并处理,得到去重合并处理后的信息;将包括去重合并处理后的信息的文件确定为所述目标链接配置文件。
29.一种可选的实施方式中,所述文件生成模块在用于所述基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件时,具体用于:基于所述目标链接配置文件中的信息,将所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径;按照所述第四文件路径调用所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
30.本公开实施例还提供一种基于代码疫苗的应用测试装置,所述装置包括:文件获取模块,用于获取根据上述的实现代码疫苗的插桩装置得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;代码执行模块,用于响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;钩子挂载模块,用于响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;函数检测模块,用于基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。
31.一种可选的实施方式中,所述钩子挂载模块具体用于:响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上。
32.一种可选的实施方式中,所述钩子挂载模块还用于:通过所述代理函数代码将所述钩子函数上的所述第一检测逻辑代码删除;通过所述代理函数代码将与所述目标函数对应的第二检测逻辑代码挂载在所述钩子函数上。
33.本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述实现代码疫苗的插桩方法,或上述基于代码疫苗的应用测试方法中任一种可能的实施方式中的步骤。
34.本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有
计算机程序,该计算机程序被处理器运行时执行上述实现代码疫苗的插桩方法,或上述基于代码疫苗的应用测试方法中任一种可能的实施方式中的步骤。
35.本公开实施例提供的实现代码疫苗的插桩方法、基于代码疫苗的应用测试方法、装置、设备及介质,可以针对初始编译源码中待进行检测的目标函数,在目标函数中插入挂载内容为空的钩子函数,得到目标编译源码,确定与目标编译源码匹配的、包括用于挂载到钩子函数上的检测逻辑代码的代理函数代码,基于目标编译源码和代理函数代码进行编译处理和链接处理,得到执行文件,进而在运行执行文件时,通过目标编译源码和代理函数代码的并行运行,响应于触发执行目标函数,通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,基于检测逻辑代码对钩子函数所在的目标函数进行检测,得到检测结果,这样可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。
36.进一步的,在运行时可以针对钩子函数进行检测逻辑代码的挂载、置空、替换挂载的检测逻辑代码,从而实现在运行时对于插桩位置的动态控制,可以通过对于挂载的检测逻辑代码的替换实现在运行时对于插桩逻辑的动态控制,有效提升插桩的灵活性和丰富性。
37.更进一步的,本公开实施作用于源代码层级,而非指令级别,从而不需要针对每个指令集进行针对性的开发,大大降低数据处理量,并且也不需要禁止代码内联,有助于降低开发成本,减少资源消耗。
38.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
39.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开的技术方案。
附图说明
40.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
41.图1示出了本公开实施例所提供的一种实现代码疫苗的插桩方法的流程图;图2示出了本公开实施例所提供的一种实现代码疫苗的插桩过程的示意图;图3示出了本公开实施例所提供的一种基于代码疫苗的应用测试方法的流程图;图4示出了本公开实施例所提供的一种基于代码疫苗的应用测试过程的示意图;图5示出了本公开实施例所提供的一种实现代码疫苗的插桩装置的示意图;图6示出了本公开实施例所提供的一种基于代码疫苗的应用测试装置的示意图;图7示出了本公开实施例所提供的一种电子设备的结构示意图。
具体实施方式
42.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
43.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
44.本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括a、b、c中的至少一种,可以表示包括从a、b和c构成的集合中选择的任意一个或多个元素。
45.经研究发现,在对go语言进行插桩时,大多是直接在源代码指定位置处添加检测逻辑代码,也即将检测逻辑代码固定插入源代码,这样插入的检测逻辑代码在运行时是无法进行修改或者跳过的,可能会影响正常的业务运行,对于代码运行的限制较大,并且无法做到运行时对插桩位置的检测逻辑的切换和动态调整,在需要进行多种检测时数据处理量极大。
46.基于上述研究,本公开提供了一种实现代码疫苗的插桩方法、基于代码疫苗的应用测试方法、装置、设备及介质,可以针对初始编译源码中待进行检测的目标函数插入钩子函数,并在编译过程中加入代理函数代码,得到执行文件,进而在运行执行文件时,通过目标编译源码和代理函数代码的并行运行,响应于触发执行目标函数,通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,基于检测逻辑代码对钩子函数所在的目标函数进行检测,得到检测结果,这样可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。
47.针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
48.为便于对本实施例进行理解,首先对本公开实施例所公开的一种实现代码疫苗的插桩方法进行详细介绍,本公开实施例所提供的实现代码疫苗的插桩方法的执行主体可以是实现代码疫苗的插桩装置,也可以是具有一定计算能力的电子设备。本实施方式中,该电子设备可以为服务器。其中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云存储、大数据和人工智能平台等基础云计算服务的云服务器。
49.其他实施方式中,该电子设备还可以为终端设备或者其他处理设备,该终端设备可以为移动设备、终端及计算设备等。其它处理设备可以是包括处理器和存储器的设备,在此不做限定。在一些可能的实现方式中,该实现代码疫苗的插桩方法可以通过处理器调用
存储器中存储的计算机可读指令的方式来实现。
50.下面对本公开实施例提供的一种实现代码疫苗的插桩方法加以说明。
51.参见图1所示,为本公开实施例提供的一种实现代码疫苗的插桩方法的流程图,如图1中所示,本公开实施例提供的实现代码疫苗的插桩方法包括步骤s101~s104,其中:s101:确定初始编译源码。
52.这里,首先可以获取编译应用源码,在所述编译应用源码中添加编译参数,得到所述初始编译源码。
53.其中,所述编译参数用于调用编译拦截工具。
54.需要说明的是,本公开实施例是为了解决对go语言进行插桩时存在的问题,因此前述的所述编译应用源码、所述初始编译源码都采用go语言编写,后续的编译处理和链接处理都是针对go语言的编译处理和链接处理。
55.具体的,在所述编译应用源码中添加编译参数时,可以通过go工具的build子命令提供的编译参数toolexec来添加编译拦截工具xmirror-go。
56.在添加编译参数toolexec之后,可以调用go工具的build子命令并使用添加的编译参数toolexec来进行编译处理,go工具的build子命令可以在编译处理的各个阶段自动调用编译拦截工具xmirror-go。
57.s102:针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空。
58.基于前述内容可知,由于通过编译参数toolexec来添加编译拦截工具xmirror-go,因此在编译处理的各个阶段自动调用编译拦截工具xmirror-go,并传入预设编译命令和预设编译参数,编译拦截工具xmirror-go可以解析预设编译命令和预设编译参数,从所述预设编译参数中获取文件列表和包信息。
59.这里,所述文件列表包括与所述编译应用源码对应的文件,所述包信息包括所述编译应用源码对应的信息,具体的,所述包信息中包括与所述编译应用源码中各个函数对应的函数信息。
60.其中,所述包信息也可称为结构体,在后续可以通过包信息来确定待进行检测的目标函数所需要的检测逻辑。
61.然后,可以基于所述编译参数toolexec,调用所述编译拦截工具xmirror-go,通过所述编译拦截工具xmirror-go在所述目标函数中插入钩子函数,得到目标编译源码。
62.可选地,所述目标函数包括但不限于os.openfile(),database/sql.open。
63.相应地,在一些可能的实施方式中,先对所述初始编译源码进行解析,得到所述初始编译源码对应的抽象语法树,然后在所述抽象语法树中待进行检测的目标函数中插入钩子函数,将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,所述接口函数用于指示代理函数从目标编译源码中获取信息,进而对所述修改后的抽象语法树进行转换,得到目标编译源码。
64.上述步骤中,可以先通过编译拦截工具xmirror-go对所述初始编译源码进行语法分析和词法分析,得到所述初始编译源码对应的抽象语法树。
65.这里,抽象语法树(abstract syntax tree,ast)是源代码结构中的一种抽象表示,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种语
法结构,抽象语法树中的每一个节点都表示源代码中的一个元素,每一颗子树都表示一个语法,作为一种常用的数据结构,抽象语法树抹去了源代码中不重要的一些字符、空格、分号或者括号等。每个抽象语法树都是对应的源代码的确切表示,可以用于确定结构正确的程序是否存在一些类型不匹配或不一致的问题,其中,节点对应于源代码的各种元素,例如表达式、声明和语句等。
66.语法分析是编译过程的一个逻辑阶段,语法分析的任务是对结构上正确的源代码进行上下文有关性质的审查,进行类型审查。语法分析用于审查源代码有无语义错误,为代码生成阶段收集类型信息。
67.词法分析的作用就是解析源代码,将源代码中的字符串序列转换成token序列,方便后面的处理和解析。语法分析的输入就是词法分析输出的token序列,这里,token序列是一组预定义的、能够识别的字符串,通常由名字和值构成,其中,名字一般是词法的类别,例如标识符、关键字、分隔符、操作符、文字和注释等,可以理解,token可以包括标识符、关键字、分隔符、操作符、文字和注释中的至少一种,这些序列会按照顺序被语法分析器进行解析,语法的解析过程就是将词法分析生成的token按照语言定义好的文法(grammar)自下而上或者自上而下的进行规约,每一个源代码文件最终会被归纳成一个源文件(sourcefile)结构。
68.这里,可以对源代码进行词法解析,转换成对应的token序列,然后对token序列进行语法分析,根据语法特征将标记序列token构建为抽象语法树。
69.然后通过编译拦截工具xmirror-go可以在所述抽象语法树中待进行检测的目标函数中插入钩子函数,并且将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,进而对所述修改后的抽象语法树进行转换,得到目标编译源码。
70.这里,所述接口函数用于指示代理函数从目标编译源码中获取信息,从而可以基于获取的信息确定与所述目标函数适配的检测逻辑。
71.示例性的,所述接口函数中可以定义代理函数获取信息的方法,例如应用程序接口(application programming interface,api)接口路径。
72.其中,在得到所述目标编译源码后,可以将所述目标编译源码写入编译临时目录中。所述编译临时目录在整个编译处理和链接处理中都需要使用到,所述编译目录可以写入编译处理和链接处理中所有使用到的信息和生成的数据。
73.这样,通过修改抽象语法树,可以在待进行检测的目标函数中插入钩子函数,并将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,从而实现将用于挂载检测逻辑代码的钩子函数写入目标函数中,并通过接口函数的写入实现代理函数信息的获取。
74.具体的,在所述抽象语法树中待进行检测的目标函数中插入钩子函数时,可以先基于预设的函数检测需求,从所述抽象语法树中确定待进行检测的目标函数,然后确定与所述目标函数对应的钩子插入要求,所述钩子插入要求包括钩子类型、钩子变量、钩子获取方式、钩子设置方式和钩子调用逻辑,接着基于所述钩子插入要求,在所述目标函数中插入钩子函数。
75.其中,所述钩子变量用于指示所述钩子函数的挂载内容。在本实施方式中,为了实现在编译时将源代码和插桩代码分开,所述钩子函数的挂载内容为空null。
76.这样,通过对于钩子插入要求的定义,可以实现在目标函数中插入钩子函数,有助于保障后续针对钩子函数的使用。
77.在具体实施中,为了保障信息记录的全面性,在插入所述钩子函数之后,可以将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中。
78.这样,将钩子信息和函数信息进行记录,有助于保障编译过程中信息的完整性和全面性。
79.s103:确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码。
80.这里,在编译过程中可以加入代理函数代码,从而实现在编译时将源代码和插桩代码分开,为此需要确定与所述目标编译源码匹配的代理函数agent代码。
81.因此,在一些可能的实施方式中,可以基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码。
82.该步骤中,可以通过记录的所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,来确定所述代理函数代码。
83.基于前述内容可知,在插入所述钩子函数之后,可以将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中,进而在确定所述代理函数代码时,所述钩子信息和所述函数信息可以从所述编译临时目录中确定。
84.这样,可以基于钩子函数对应的钩子信息和目标函数对应的函数信息来确定与目标编译源码匹配的代理函数代码,有助于保障目标编译源码与代理函数代码的匹配性。
85.具体的,在一些可能的实施方式中,可以基于所述目标函数对应的函数信息,确定与所述代码信息对应的检测逻辑代码,基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码,基于所述检测逻辑代码和所述调用逻辑代码,确定所述代理函数代码。
86.上述步骤中,可以基于所述目标函数对应的函数信息,确定在对所述目标函数检测时需要使用到的与所述代码信息对应检测逻辑代码。
87.可选地,所述检测逻辑代码包括但不限于交互式应用程序安全测试(interactive application security testing,iast)检测逻辑代码,运行时应用程序自我保护(runtime application self-protection,rasp)检测逻辑代码,软件成分分词(software composition analysis,sca)检测逻辑代码。
88.并且可以基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码。
89.可选地,可以基于所述钩子信息生成钩子记录表,通过表现为列表的形式呈现所述调用逻辑代码。
90.这样,可以通过函数信息来具体确定检测逻辑代码,并通过钩子信息来具体确定调用逻辑代码,从而组织得到代理函数代码,有助于保障函数代码与钩子函数的关联性。
91.s104:基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
92.这里,在得到所述目标编译源码和所述代理函数代码后,就可以进行编译处理和
链接处理,得到二进制执行文件。
93.在进行编译处理时,由于对初始编译源码进行了修改,生成目标编译源码,为了保障编译内容的准确性,可以对所述预设编译命令中的文件路径进行改写,有助于保障编译处理的实现。
94.具体的,在一些可能的实施方式中,可以对所述代理函数代码进行编译处理,得到代理编译文件,将所述代理函数代码对应的代理信息写入编译临时目录中,并且基于所述编译临时目录中的信息,将所述初始编译源码的第一文件路径替换为所述目标编译源码的第二文件路径;对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件;对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件。
95.上述步骤中,可以将预设编译命令中包括的所述初始编译源码的第一文件路径替换为所述目标编译源码的第二文件路径,从而执行预设编译命令并按照所述第二文件路径调用修改后的所述目标编译源码进行编译处理,得到应用编译文件。
96.这样,通过文件路径的替换,可以实现对于修改后的目标编译源码进行编译处理,有助于提升编译的准确性。
97.在对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件时,在一些可能的实施方式中,可以按照所述第二文件路径调用得到所述目标编译源码;将指示代理函数代码启动逻辑的代码写入所述目标编译源码中的启动函数中,得到修改后的目标编译源码;对所述修改后的目标编译源码进行编译处理,得到应用编译文件。
98.这里,可以在编译启动main函数时,通过修改ast的方式,在启动函数中写入指示所述代理函数代码启动逻辑的代码,从而保障后续运行时所述代理函数代码的正常启动。
99.在编译处理后,所述编译临时目录中记录有所述钩子信息、所述函数信息、所述目标编译源码、所述代理信息。进而可以基于所述编译临时目录对所述代理编译文件和所述应用编译文件进行链接处理。
100.具体的,可以基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件;基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
101.这里,所述预设链接配置importcfg.link文件是与所述编译应用源码对应的配置文件,因此所述预设连接配置文件中并不包括修改后的目标编译源码、以及所述代理函数代码的内容,为了保障编译处理的实现,可以通过所述编译临时目录中的信息对预设链接配置文件中的信息进行调整,得到目标链接配置文件,进而再基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
102.因此,可以将所述编译临时目录中的信息和所述预设链接配置文件中的信息进行去重合并处理,得到去重合并处理后的信息;将包括去重合并处理后的信息的文件确定为所述目标链接配置文件。
103.这里,同样可以将所述去重合并处理后的信息写入所述编译临时目录中。
104.然后,可以基于所述目标链接配置文件中的信息,将所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径;按照所述第四文件路径调用所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
105.上述步骤中,可以将预设链接命令中包括的所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径,从而执行预设链接命令并按照所述第四文件路径调用修改后的所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件,从而将所述代理函数代码包括的所述检测逻辑代码编译进所述执行文件中。
106.这样,通过文件路径的替换,可以实现对于修改后的目标链接配置文件的调用,来对代理编译文件和应用编译文件进行链接处理,有助于提升链接的准确性。
107.为了清晰地展示出实现代码疫苗的插桩的过程,图2示出本公开实施例提供的一种实现代码疫苗的插桩过程的示意图。如图2中所示,在确定初始编译源码后,可以针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,并确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码,然后基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件。其中,具体步骤的描述参见前述各个实施例,此处不再赘述。
108.本公开实施例提供的实现代码疫苗的插桩方法,可以确定初始编译源码;针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
109.这样,可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。
110.进一步的,本公开实施作用于源代码层级,而非指令级别,从而不需要针对每个指令集进行针对性的开发,大大降低数据处理量,并且也不需要禁止代码内联,有助于降低开发成本,减少资源消耗。
111.进一步的,在处理得到所述执行文件之后,即可运行所述执行文件进行应用测试,因此,本公开实施例还提供一种基于代码疫苗的应用测试方法,下面对本公开实施例提供的一种基于代码疫苗的应用测试方法加以说明。
112.请参阅图3,图3为本公开实施例提供的一种基于代码疫苗的应用测试方法的流程图。本公开实施例提供的基于代码疫苗的应用测试方法,可以运行所述执行文件对所述目标函数进行检测,如图3中所示,本公开实施例提供的基于代码疫苗的应用测试方法包括步骤s301~s304,其中:s301:获取根据上述的实现代码疫苗的插桩方法得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码。
113.s302:响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码。
114.这里,在运行所述执行文件时,所述代理函数代码可以和所述目标编译源码一并
运行。
115.s303:响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上。
116.本步骤中,随着所述目标编译源码的运行,在触发执行所述目标编译源码中的所述目标函数时,可以通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上。
117.具体的,所述代理函数代码可以先通过所述接口函数读取所述目标函数的函数信息,基于读取到的函数信息确定与所述目标函数对应的检测逻辑代码,然后再通过所述钩子记录表中的调用逻辑代码确定对应设置所述钩子函数的方式,并调用该方式将与所述目标函数对应的检测逻辑代码设置在所述钩子函数上。
118.可选地,可以响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上。
119.在所述通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上之后,本实施方式还可以替换所述钩子函数上挂载的第一检测逻辑代码,具体可以通过先置空所述钩子函数的挂载内容,以取消当前挂载的第一检测逻辑代码,然后再调用该方式将与所述目标函数对应的第二检测逻辑代码设置在所述钩子函数上。
120.因此,在所述通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上之后,还可以通过所述代理函数代码将所述钩子函数上的所述第一检测逻辑代码删除;通过所述代理函数代码将与所述目标函数对应的第二检测逻辑代码挂载在所述钩子函数上。
121.这样,可以实现在运行时对于插桩位置的动态控制,可以通过对于挂载的检测逻辑代码的替换实现在运行时对于插桩逻辑的动态控制,有效提升插桩的灵活性和丰富性。
122.s304:基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。
123.该步骤中,可以通过所述钩子函数获取所述目标函数的数据,进而通过所述检测逻辑代码对所述目标函数进行检测,得到所述检测结果。
124.在其他实施方式中,为了保障所述目标编译源码的正常运行,可以在所述目标编译源码运行占用系统资源高于预设阈值时,置空所述钩子函数,或者配置关闭所述代理函数代码的执行。
125.为了清晰地展示出基于代码疫苗的应用测试的过程,图4示出本公开实施例提供的一种基于代码疫苗的应用测试过程的示意图。如图4中所示,在获取执行文件后,响应于所述执行文件的运行,并行执行所述目标编译源码和所述代理函数代码,响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上,可以对所述钩子函数进行置空以及检测逻辑代码的替换,进而所述目标编译源码可以照常进行业务处理,同时可以基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。其中,具体步骤的描述参见前述各个实施例,此处不再赘述。
126.本公开实施例提供的基于代码疫苗的应用测试方法,可以获取根据上述的实现代码疫苗的插桩方法得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于
挂载到所述钩子函数上的检测逻辑代码;响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。
127.这样,可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。
128.进一步的,在运行时可以针对钩子函数进行检测逻辑代码的挂载、置空、替换挂载的检测逻辑代码,从而实现在运行时对于插桩位置的动态控制,可以通过对于挂载的检测逻辑代码的替换实现在运行时对于插桩逻辑的动态控制,有效提升插桩的灵活性和丰富性。
129.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
130.基于同一发明构思,本公开实施例中还提供了与实现代码疫苗的插桩方法对应的实现代码疫苗的插桩装置,由于本公开实施例中的实现代码疫苗的插桩装置解决问题的原理与本公开实施例上述实现代码疫苗的插桩方法相似,因此实现代码疫苗的插桩装置的实施可以参见实现代码疫苗的插桩方法的实施,重复之处不再赘述。
131.请参阅图5,图5为本公开实施例提供的一种实现代码疫苗的插桩装置的示意图。如图5中所示,本公开实施例提供的实现代码疫苗的插桩装置500包括:源码确定模块510,用于确定初始编译源码;钩子插入模块520,用于针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;代理确定模块530,用于确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;文件生成模块540,用于基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
132.一种可选的实施方式中,所述钩子插入模块520具体用于:对所述初始编译源码进行解析,得到所述初始编译源码对应的抽象语法树;在所述抽象语法树中待进行检测的目标函数中插入钩子函数,将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,所述接口函数用于指示代理函数从目标编译源码中获取信息;对所述修改后的抽象语法树进行转换,得到目标编译源码。
133.一种可选的实施方式中,所述钩子插入模块520在用于所述在所述抽象语法树中待进行检测的目标函数中插入钩子函数时,具体用于:基于预设的函数检测需求,从所述抽象语法树中确定待进行检测的目标函数;确定与所述目标函数对应的钩子插入要求,所述钩子插入要求包括钩子类型、钩子变量、钩子获取方式、钩子设置方式和钩子调用逻辑;
基于所述钩子插入要求,在所述目标函数中插入钩子函数。
134.一种可选的实施方式中,所述钩子插入模块520还用于:将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中。
135.一种可选的实施方式中,所述代理确定模块530具体用于:基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码。
136.一种可选的实施方式中,所述代理确定模块530在用于所述基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码时,具体用于:基于所述目标函数对应的函数信息,确定与所述函数信息对应的检测逻辑代码;基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码;基于所述检测逻辑代码和所述调用逻辑代码,确定所述代理函数代码。
137.一种可选的实施方式中,所述文件生成模块540具体用于:对所述代理函数代码进行编译处理,得到代理编译文件,将所述代理函数代码对应的代理信息写入编译临时目录中;基于所述编译临时目录中的信息,将所述初始编译源码的第一文件路径替换为所述目标编译源码的第二文件路径;对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件;对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件。
138.一种可选的实施方式中,所述文件生成模块540在用于所述对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件时,具体用于:按照所述第二文件路径调用得到所述目标编译源码;将指示代理函数代码启动逻辑的代码写入所述目标编译源码中的启动函数中,得到修改后的目标编译源码;对所述修改后的目标编译源码进行编译处理,得到应用编译文件。
139.一种可选的实施方式中,所述文件生成模块540在用于所述对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件时,具体用于:基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件;基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
140.一种可选的实施方式中,所述文件生成模块540在用于所述基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件时,具体用于:将所述编译临时目录中的信息和所述预设链接配置文件中的信息进行去重合并处理,得到去重合并处理后的信息;将包括去重合并处理后的信息的文件确定为所述目标链接配置文件。
141.一种可选的实施方式中,所述文件生成模块540在用于所述基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件时,具
体用于:基于所述目标链接配置文件中的信息,将所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径;按照所述第四文件路径调用所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。
142.本公开实施例提供的实现代码疫苗的插桩装置,可以确定初始编译源码;针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。
143.这样,可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。
144.进一步的,本公开实施作用于源代码层级,而非指令级别,从而不需要针对每个指令集进行针对性的开发,大大降低数据处理量,并且也不需要禁止代码内联,有助于降低开发成本,减少资源消耗。
145.基于同一发明构思,本公开实施例中还提供了与基于代码疫苗的应用测试方法对应的基于代码疫苗的应用测试装置,由于本公开实施例中的基于代码疫苗的应用测试装置解决问题的原理与本公开实施例上述基于代码疫苗的应用测试方法相似,因此基于代码疫苗的应用测试装置的实施可以参见基于代码疫苗的应用测试方法的实施,重复之处不再赘述。
146.请参阅图6,图6为本公开实施例提供的一种基于代码疫苗的应用测试装置的示意图。如图6中所示,本公开实施例提供的基于代码疫苗的应用测试装置600包括:文件获取模块610,用于获取根据上述的实现代码疫苗的插桩装置得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;代码执行模块620,用于响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;钩子挂载模块630,用于响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;函数检测模块640,用于基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。
147.一种可选的实施方式中,所述钩子挂载模块630具体用于:响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上。
148.一种可选的实施方式中,所述钩子挂载模块630还用于:
memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
165.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。
技术特征:
1.一种实现代码疫苗的插桩方法,其特征在于,所述方法包括:确定初始编译源码;针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。2.根据权利要求1所述的方法,其特征在于,所述针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,包括:对所述初始编译源码进行解析,得到所述初始编译源码对应的抽象语法树;在所述抽象语法树中待进行检测的目标函数中插入钩子函数,将接口函数写入所述目标函数的函数信息中,得到修改后的抽象语法树,所述接口函数用于指示代理函数从目标编译源码中获取信息;对所述修改后的抽象语法树进行转换,得到目标编译源码。3.根据权利要求2所述的方法,其特征在于,所述在所述抽象语法树中待进行检测的目标函数中插入钩子函数,包括:基于预设的函数检测需求,从所述抽象语法树中确定待进行检测的目标函数;确定与所述目标函数对应的钩子插入要求,所述钩子插入要求包括钩子类型、钩子变量、钩子获取方式、钩子设置方式和钩子调用逻辑;基于所述钩子插入要求,在所述目标函数中插入钩子函数。4.根据权利要求1所述的方法,其特征在于,所述方法还包括:将所述钩子函数对应的钩子信息以及所述目标函数对应的函数信息写入编译临时目录中。5.根据权利要求1所述的方法,其特征在于,所述确定与所述目标编译源码匹配的代理函数代码,包括:基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码。6.根据权利要求5所述的方法,其特征在于,所述基于所述钩子函数对应的钩子信息和所述目标函数对应的函数信息,确定与所述目标编译源码匹配的代理函数代码,包括:基于所述目标函数对应的函数信息,确定与所述函数信息对应的检测逻辑代码;基于所述钩子函数对应的钩子信息,确定与所述钩子信息对应的调用逻辑代码;基于所述检测逻辑代码和所述调用逻辑代码,确定所述代理函数代码。7.根据权利要求1所述的方法,其特征在于,所述基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,包括:对所述代理函数代码进行编译处理,得到代理编译文件,将所述代理函数代码对应的代理信息写入编译临时目录中;基于所述编译临时目录中的信息,将所述初始编译源码的第一文件路径替换为所述目
标编译源码的第二文件路径;对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件;对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件。8.根据权利要求7所述的方法,其特征在于,所述对按照所述第二文件路径调用的所述目标编译源码进行编译处理,得到应用编译文件,包括:按照所述第二文件路径调用得到所述目标编译源码;将指示代理函数代码启动逻辑的代码写入所述目标编译源码中的启动函数中,得到修改后的目标编译源码;对所述修改后的目标编译源码进行编译处理,得到应用编译文件。9.根据权利要求7所述的方法,其特征在于,所述对所述代理编译文件和所述应用编译文件进行链接处理,得到执行文件,包括:基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件;基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。10.根据权利要求9所述的方法,其特征在于,所述基于所述编译临时目录和预设链接配置文件,得到目标链接配置文件,包括:将所述编译临时目录中的信息和所述预设链接配置文件中的信息进行去重合并处理,得到去重合并处理后的信息;将包括去重合并处理后的信息的文件确定为所述目标链接配置文件。11.根据权利要求9所述的方法,其特征在于,所述基于所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件,包括:基于所述目标链接配置文件中的信息,将所述预设链接配置文件的第三文件路径替换为所述目标链接配置文件的第四文件路径;按照所述第四文件路径调用所述目标链接配置文件对所述代理编译文件和所述应用编译文件进行链接处理,得到所述执行文件。12.一种基于代码疫苗的应用测试方法,其特征在于,所述方法包括:获取根据权利要求1至11中任一项所述的实现代码疫苗的插桩方法得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。13.根据权利要求12所述的方法,其特征在于,所述响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上,包括:响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的第一
检测逻辑代码挂载在所述钩子函数上。14.根据权利要求13所述的方法,其特征在于,在所述通过所述代理函数代码将与所述目标函数对应的第一检测逻辑代码挂载在所述钩子函数上之后,所述方法还包括:通过所述代理函数代码将所述钩子函数上的所述第一检测逻辑代码删除;通过所述代理函数代码将与所述目标函数对应的第二检测逻辑代码挂载在所述钩子函数上。15.一种实现代码疫苗的插桩装置,其特征在于,所述装置包括:源码确定模块,用于确定初始编译源码;钩子插入模块,用于针对所述初始编译源码中待进行检测的目标函数,在所述目标函数中插入钩子函数,得到目标编译源码,所述钩子函数的挂载内容为空;代理确定模块,用于确定与所述目标编译源码匹配的代理函数代码,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;文件生成模块,用于基于所述目标编译源码和所述代理函数代码进行编译处理和链接处理,得到执行文件,其中,在运行所述执行文件时执行所述目标编译源码和所述代理函数代码,并在执行所述钩子函数时调用所述检测逻辑代码。16.一种基于代码疫苗的应用测试装置,其特征在于,所述装置包括:文件获取模块,用于获取根据权利要求15所述的实现代码疫苗的插桩装置得到的执行文件,所述执行文件包括目标编译源码和代理函数代码,所述目标编译源码中待进行检测的目标函数中写入有钩子函数,所述代理函数代码包括用于挂载到所述钩子函数上的检测逻辑代码;代码执行模块,用于响应于所述执行文件的运行,执行所述目标编译源码和所述代理函数代码;钩子挂载模块,用于响应于触发执行所述目标函数,通过所述代理函数代码将与所述目标函数对应的检测逻辑代码挂载在所述钩子函数上;函数检测模块,用于基于所述检测逻辑代码对所述钩子函数所在的目标函数进行检测,得到检测结果。17.一种电子设备,其特征在于,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如权利要求1至11中任一项所述的实现代码疫苗的插桩方法或者如权利要求12至14中任一项所述的基于代码疫苗的应用测试方法的步骤。18.一种计算机可读存储介质,其特征在于,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如权利要求1至11中任一项所述的实现代码疫苗的插桩方法或者如权利要求12至14中任一项所述的基于代码疫苗的应用测试方法的步骤。
技术总结
本公开提供了一种实现代码疫苗的插桩方法、基于代码疫苗的应用测试方法、装置、设备及介质,可以针对初始编译源码中待进行检测的目标函数插入钩子函数,并在编译过程中加入代理函数代码,得到执行文件,进而在运行执行文件时,通过目标编译源码和代理函数代码的并行运行,响应于触发执行目标函数,通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,基于检测逻辑代码对钩子函数所在的目标函数进行检测,得到检测结果,这样可以实现在编译时将源代码和插桩代码分开,在运行时再通过代理函数代码将与目标函数对应的检测逻辑代码挂载在钩子函数上,从而实现运行时插桩,有助于减轻对于业务的影响,进而降低对于代码运行的限制。代码运行的限制。代码运行的限制。
技术研发人员:张涛 宁戈 刘恩炙 王越 杜玉洁
受保护的技术使用者:北京安普诺信息技术有限公司
技术研发日:2023.08.16
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/