掌桥专利:专业的专利平台
掌桥专利
首页

一种埋点自动插桩方法、装置及计算机可读存储介质

文献发布时间:2023-06-19 16:04:54



技术领域

本申请涉及网络安全技术领域,尤其涉及一种埋点自动插桩方法、装置及计算机可读存储介质。

背景技术

随着人们对软件开发的性能和安全的认知意识的进步,越来越多的传统系统开发问题也逐渐暴露出来,系统安全问题如何避免,系统性能如何优化这些问题越来越多,比如系统中存在的一些安全漏洞,一些地方的性能问题等等。如果没有一个合适的手段在上线前检查出这些问题,系统一旦上线可能会造成无法挽回的损失。但是目前还没有一个简单高效的方式来针对.Net平台的性能安全和系统安全做全面的分析和嗅探。目前大部分市场上的探针分析器都是对项目代码存在侵入,即开发人员在开发阶段必须引用或者修改项目代码来使用探针或者分析器从而达到分析目的,然而一些线上的项目必须需要源代码才能引入,使用十分有限。传统的数据分析器存在以下问题:存在代码侵入性,使用者必须在开发阶段手动修改项目部分代码来引用分析器探针,使用完成后手动修改代码卸载探针分析器;需要第三方组件依赖,在使用探针时还需引用第三方组件,可能会对项目出现兼容性问题;安装卸载麻烦,特别是一些上线后的项目,无法做到随时使用,灵活性太差。

发明内容

本申请实施例提供了一种埋点自动插桩方法、装置及计算机可读存储介质,至少能够解决相关技术中安装探针时对被测项目存在代码入侵,安装好的探针无法自动插桩埋点的问题。

本申请实施例第一方面提供了一种埋点自动插桩方法,包括:

当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;

在所述探针运行环境下,控制探针分析器读取探针配置信息;

在对所述被测项目的编译过程中,根据所述探针配置信息确定待插桩埋点;

控制所述探针分析器对所述待插桩埋点进行插桩。

本申请实施例第二方面提供了一种埋点自动插桩装置,包括:

构建模块,用于当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;

读取模块,用于在所述探针运行环境下,控制探针分析器读取探针配置信息;

确定模块,用于在对所述被测项目的编译过程中,根据所述探针配置信息确定待插桩埋点;

插桩模块,用于控制所述探针分析器对所述待插桩埋点进行插桩。

本申请实施例第三方面提供了一种电子设备,其特征在于,包括存储器及处理器,其中,所述处理器用于执行存储在所述存储器上的计算机程序,所述处理器执行所述计算机程序时上述本申请实施例第一方面提供的埋点自动插桩方法中的各步骤。

本申请实施例第四方面提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时,实现上述本申请实施例第一方面提供的埋点自动插桩方法中的各步骤。

由上可见,根据本申请方案所提供的方法、装置及计算机可读存储介质,当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;在所述探针运行环境下,控制探针分析器读取探针配置信息;在对所述被测项目的编译过程中,根据所述探针配置信息确定待插桩埋点;控制所述探针分析器对所述待插桩埋点进行插桩。通过本申请方案的实施,通过加载公共语言运行库构建相应探针运行环境,在探针运行环境下,根据探针配置信息对待插桩埋点进行插桩,使安装探针时对被测项目不会存在代码入侵,并根据探针分析器自动插桩埋点。

附图说明

图1为本申请第一实施例提供的埋点自动插桩方法的基本流程示意图;

图2为本申请第一实施例提供的探针架构示意图;

图3为本申请第二实施例提供的埋点自动插桩方法的细化流程示意图;

图4为本申请第三实施例提供的埋点自动插桩装置的程序模块示意图;

图5为本申请第四实施例提供的电子装置的结构示意图。

为使得本申请的发明目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而非全部实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为了解决相关技术中安装探针时对被测项目存在代码入侵,安装好的探针无法自动插桩埋点的问题,本申请第一实施例提供了一种埋点自动插桩方法,如图1为本实施例提供的埋点自动插桩方法的基本流程图,该埋点自动插桩方法包括以下步骤:

步骤101、当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境。

具体的,在实际应用中,现有技术大部分都是对被测项目的源代码进行修改来实现插桩的过程,破坏了被测项目的代码整体结构。在本实施例中,当被测项目接收到相关技术人员的访问请求时,被测项目的运行容器会加载公共语言运行库(Common LanguageRuntime,CLR),通过公共语言运行库构建一个探针运行环境,在探针运行环境中对被测项目进行编译和运行,不需要破坏被测项目的代码整体结构,所以也就不存在代码入侵。

步骤102、在探针运行环境下,控制探针分析器读取探针配置信息。

具体的,在本实施例中,探针运行环境构建好之后,公共语言运行库会加载探针分析器,如图2所示为本实施例提供的探针框架示意图,其中,探针分析器为.NET profiling部分,探针分析器第一次加载时会读取探针配置信息,该探针分析器属于探针框架的外挂模块,主要用于对被测项目中需要检测的埋点自动插桩。

在本实施例一种可选的实施方式中,在探针运行环境下,控制探针分析器读取探针配置信息的步骤之后,还包括:初始化探针分析器;在探针分析器初始化完成之后,加载与探针相关的对应模块。

具体的,在本实施例中,在探针分析器读取完探针配置信息之后,开始进行探针分析器初始化,使探针分析器进入插桩的准备状态,在探针分析器初始化完成之后,公共语言运行库开始加载探针架构中其它相关的模块,如图2探针架构示意图所示的组件接口、通信模块Event Bus(事件总线)以及探针引擎模块(如图2中Agent Engine部分)。

步骤103、在对被测项目的编译过程中,根据探针配置信息确定待插桩埋点。

具体的,在本实施例中,在探针分析器初始化完成之后,开始对被测项目中的基础方法进行编译,在编译过程中,探针分析器会根据探针配置信息检测编译的基础方法,从编译的基础方法中确定需要插桩的埋点。

在本实施例一种可选的实施方式中,在对被测项目的编译过程中,根据探针配置信息确定待插桩埋点的步骤,包括:根据JIT编译器依次对被测项目进行编译;控制探针分析器根据探针配置信息对待编译的内容进行检查;根据检测结果确定待插桩埋点。

具体的,在本实施例中,公共语言运行库在探针分析器初始化完成之后,开始基础方法的编译,此时公共语言运行库将会启动JIT编译器对第一次调用的方法进行JIT编译,JIT编译完成后,返回编译完成的地址后编译下一个,公共语言运行库执行编译过的基础方法,探针分析器会在JIT编译中根据探针配置信息一直检测编译的基础方法,直到检测到需要插桩的埋点。

步骤104、控制探针分析器对待插桩埋点进行插桩。

具体的,在本实施例中,在确定待插桩埋点之后,探针分析器会获取当前对埋点的插桩配置信息,而探针分析器只负责插桩,该插桩配置信息并不存在于探针分析器中,于是,探针分析器需要从探针引擎中获取相应的插桩配置信息,根据插桩配置信息对埋点进行插桩,相对于传统的插桩方法需要相关技术人员手动操作插桩步骤,在探针分析器检测到埋点之后自动对埋点进行插桩。

在本实施例一种可选的实施方式中,控制探针分析器对待插桩埋点进行插桩的步骤,包括:控制探针分析器获取相应的插桩配置信息;根据插桩配置信息对待插桩埋点进行CIL修改;通过编译CIL修改后的待插桩埋点,对待插桩埋点进行插桩。

具体的,在本实施例中,在确定待插桩埋点之后,探针分析器从探针引擎中获取相应的插桩配置信息,根据插桩配置信息对与埋点对应的基础方法进行CIL(CommonIntermediate Language,通用中间语言)修改,包括但不限于CIL改写以及CIL替换,将CIL修改之后的方法再通过JIT编译器进行编译,实现对埋点的插桩。

在本实施例一种可选的实施方式中,控制探针分析器对待插桩埋点进行插桩的步骤之后,还包括:根据待插桩埋点的埋点配置信息自动访问探针引擎;控制探针引擎加载对应于待插桩埋点的相应功能组件。

具体的,在本实施例中,在探针分析器对埋点插桩之后,根据埋点在被测项目中的配置信息自动访问探针引擎,而探针引擎会根据探针分析器的访问信息获取埋点的配置信息,根据埋点的配置信息加载对埋点进行安全检测的相应功能组件。

进一步的,在本实施例一种可选的实施方式中,控制探针引擎加载对应于待插桩埋点的相应功能组件的步骤之后,还包括:检测功能组件的完整性;按照组件接口的运行条件,将检测通过的功能组件加载进对应被测项目的应用程序域;在应用程序域中,控制功能组件通过事件总线与探针引擎交互事件信息;根据事件信息控制功能组件对插桩后的埋点进行安全漏洞检测。

具体的,在本实施例中,功能模块还包括事件总线,探针架构采用组件式设计思想,每一个功能组件独立运行,当需要一个新的功能组件时可实现暴露在外的组件接口,实现此接口的模块都被视为一个可运行可接入的功能组件,探针在启动阶段会检查功能组件的完整性并按照运行条件加载功能组件进入AppDoMain(应用程序域),一个单独的进程中可以存在多个应用程序域,应用程序域有助于将针对不同被测项目的功能组件隔离开,在同一应用程序域中,功能组件通过事件总线与探针引擎进行事件信息的交互,功能组件根据事件信息包含的埋点配置信息对插桩后的埋点进行安全漏洞检测,根据埋点配置信息针对性的进行安全漏洞检测,使检测结构更加准确。

应当说明的是,探针可对功能组件进行版本查询,不同的项目可使用不同的功能组件,不同的功能组件分为不同的版本,组件越丰富,功能越强大。

再进一步的,在本实施例一种可选的实施方式中,控制功能组件通过事件总线与探针引擎交互事件信息的步骤,包括:控制多个功能组件中的其中一个目标功能组件通过事件总线与探针引擎交互事件信息;控制多个功能组件中的其中一个目标功能组件通过事件总线与探针引擎交互事件信息的步骤之后,还包括:控制目标功能组件通过事件总线的订阅发布模式,将事件信息转发至其它功能组件。

具体的,在本实施例中,事件总线能够实现对功能组件和探针引擎的解耦,使之探针引擎不会依赖与任何功能组件,功能组件在需要的时候可以通过事件总线的方式与探针引擎进行交互。通过事件总线的订阅发布模式,如图2左下Event Bus示例所示,探针引擎可以向多个功能组件发送事件信息,在多个功能组件的其中一个功能组件接收到探针引擎的事件信息之后,会将事件信息转发给同一应用程序域中不同的功能组件,多个功能组件可以共享探针引擎的同一种消息实现不同功能组件之间的消息共享。

更进一步的,在本实施例一种可选的实施方式中,将事件信息转发至其它功能组件的步骤之后,还包括:控制探针引擎接收所有功能组件发送的对应于事件信息的所有反馈信息;通过预设日志收集器生成对应于所有反馈信息的日志报告;根据日志报告确定各功能组件之间的运行冲突;若存在运行冲突,则生成维持各功能组件安全运行的解决方案。

具体的,在本实施例中,功能组件在接收到探针引擎发送的事件信息之后,会向探针引擎发送包含运行状态的反馈信息,探针引擎在接收到反馈信息之后,会根据预设的日志收集器收集所有的反馈信息并生成日志报告,日志报告包含了探针以及所有功能组件的运行状态日志,根据运行状态日志确定各功能组件是否存在运行错误以及各功能组件之间是否存在运行冲突,若存在运行错误或者运行冲突,则针对运行错误或运行冲突生成维持各功能组件安全运行的相应解决方案。

应当说明的是,在探针引擎与功能组件进行交互时,探针引擎会开启上报接口以及数据流引擎,等待功能组件发送检测信息,功能组件在检测埋点之后,会向探针引擎发送包含检测结果的反馈信息,探针引擎对反馈信息包含的检测结果进行数据收集、数据流处理以及漏洞上报。

基于上述申请的实施例方案,当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;在探针运行环境下,控制探针分析器读取探针配置信息探针配置信息;在对被测项目的编译过程中,根据配置信息确定待插桩埋点;在确定待插桩埋点之后,控制探针分析器对待插桩埋点进行插桩。通过本申请方案的实施,通过加载公共语言运行库构建相应探针运行环境,在探针运行环境下,根据探针配置信息对待插桩埋点进行插桩,使安装探针时对被测项目不会存在代码入侵,并根据探针分析器自动插桩埋点。

图3中的方法为本申请第二实施例提供的一种细化的埋点自动插桩方法,该埋点自动插桩方法包括:

步骤301、当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境。

步骤302、在探针运行环境下,控制探针分析器读取探针配置信息并初始化探针分析器。

步骤303、在探针分析器初始化完成之后,加载探针架构的探针引擎。

步骤304、在对被测项目的编译过程中,根据探针配置信息确定待插桩埋点。

步骤305、控制探针分析器对待插桩埋点进行插桩。

步骤306、根据待插桩埋点的埋点配置信息自动访问探针引擎。

步骤307、控制探针引擎加载对应于待插桩埋点的相应功能组件。

步骤308、通过功能组件对插桩后的埋点进行安全漏洞检测。

具体的,在本实施例中,当被测项目接收到相关技术人员的访问请求时,被测项目的运行容器会加载公共语言运行库,通过公共语言运行库构建一个探针运行环境,在探针运行环境下加载探针分析器,探针分析器第一次加载时会读取探针配置信息并进行分析器初始化,分析器初始化完成后,加载探针引擎并开始基础方法的编译,根据探针配置信息,在编译需要插桩的埋点时,分析器会获取到当前编译的埋点配置信息,对埋点进行CIL修改,实现插桩功能,插桩时探针引擎可根据埋点配置信息加载相应的功能组件,插桩完成之后,通过功能组件对埋点进行安全漏洞检测。

应当理解的是,本实施例中各步骤的序号的大小并不意味着步骤执行顺序的先后,各步骤的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成唯一限定。

根据本申请方案所提供的埋点自动插桩方法,当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;在探针运行环境下,控制探针分析器读取探针配置信息并初始化探针分析器;在探针分析器初始化完成之后,加载探针架构的探针引擎;在对被测项目的编译过程中,根据探针配置信息确定待插桩埋点;控制探针分析器对待插桩埋点进行插桩;根据待插桩埋点的埋点配置信息自动访问探针引擎;控制探针引擎加载对应于待插桩埋点的相应功能组件;通过功能组件检查对应的埋点。通过在公共语言运行库构建的探针运行环境下对埋点自动插桩并检测,不存在对被测项目的代码入侵。

图4为本申请第三实施例提供的一种埋点自动插桩装置。该埋点自动插桩装置可用于实现前述实施例中的埋点自动插桩方法。如图4所示,该埋点自动插桩装置主要包括:

构建模块401,用于当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;

读取模块402,用于在探针运行环境下,控制探针分析器读取探针配置信息;

确定模块403,用于在对被测项目的编译过程中,根据探针配置信息确定待插桩埋点;

插桩模块404,用于控制探针分析器对待插桩埋点进行插桩。

在本实施例一种可选的实施方式中,确定模块具体用于:根据JIT编译器依次对被测项目进行编译;控制探针分析器根据探针配置信息对待编译的内容进行检查;根据检测结果确定待插桩埋点。

在本实施例一种可选的实施方式中,插桩模块具体用于:控制探针分析器获取相应的插桩配置信息;根据插桩配置信息对待插桩埋点进行CIL修改;通过编译CIL修改后的待插桩埋点,对待插桩埋点进行插桩。

在本实施例一种可选的实施方式中,该埋点自动插桩装置还包括:初始化模块、加载模块、访问模块。初始化模块用于:初始化探针分析器。加载模块用于:在探针分析器初始化完成之后,加载与探针相关的对应模块。访问模块用于根据待插桩埋点的埋点配置信息自动访问探针引擎。加载模块还用于:控制探针引擎加载对应于待插桩埋点的相应功能组件。

进一步的,在本实施例一种可选的实施方式中,该埋点自动插桩装置还包括:检测模块、交互模块。检测模块用于:检测功能组件的完整性。加载模块还用于:按照组件接口的运行条件,将检测通过的功能组件加载进对应被测项目的应用程序域。交互模块用于:在应用程序域中,控制功能组件通过事件总线与探针引擎交互事件信息。检测模块还用于:根据事件信息控制功能组件对插桩后的埋点进行安全漏洞检测。

再进一步的,在本实施例一种可选的实施方式中,该埋点自动插桩装置还包括:转发模块。交互模块具体用于:控制多个功能组件中的其中一个目标功能组件通过事件总线与探针引擎交互事件信息。转发模块用于:控制目标功能组件通过事件总线的订阅发布模式,将事件信息转发至其它功能组件。

更进一步的,在本实施例一种可选的实施方式中,该埋点自动插桩装置还包括:接收模块、生成模块。生成模块用于:控制探针引擎接收所有功能组件发送的对应于事件信息的所有反馈信息。生成模块用于:通过预设日志收集器生成对应于所有反馈信息的日志报告。确定模块还用于:根据日志报告确定各功能组件之间是否存在运行冲突。生成模块还用于:若存在运行冲突,则生成维持各功能组件安全运行的解决方案。

应当说明的是,第一、二实施例中的埋点自动插桩方法均可基于本实施例提供的埋点自动插桩装置实现,所属领域的普通技术人员可以清楚的了解到,为描述的方便和简洁,本实施例中所描述的埋点自动插桩装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

根据本申请方案所提供的埋点自动插桩装置,当被测项目被访问时,通过加载公共语言运行库构建相应探针运行环境;在探针运行环境下,控制探针分析器读取探针配置信息探针配置信息;在对被测项目的编译过程中,根据配置信息确定待插桩埋点;在确定待插桩埋点之后,控制探针分析器对待插桩埋点进行插桩。通过本申请方案的实施,通过加载公共语言运行库构建相应探针运行环境,在探针运行环境下,根据探针配置信息对待插桩埋点进行插桩,使安装探针时对被测项目不会存在代码入侵,并根据探针分析器自动插桩埋点。

图5为本申请第四实施例提供的一种电子装置。该电子装置可用于实现前述实施例中的埋点自动插桩方法。如图5所示,该电子装置主要包括:

存储器501、处理器502、总线503及存储在存储器501上并可在处理器502上运行的计算机程序,存储器501和处理器502通过总线503连接。处理器502执行该计算机程序时,实现前述实施例中的埋点自动插桩方法。其中,处理器的数量可以是一个或多个。

存储器501可以是高速随机存取记忆体(RAM,Random Access Memory)存储器,也可为非不稳定的存储器(non-volatile memory),例如磁盘存储器。存储器501用于存储可执行程序代码,处理器502与存储器501耦合。

进一步的,本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是设置于上述各实施例中的电子装置中,该计算机可读存储介质可以是前述图5所示实施例中的存储器。

该计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现前述实施例中的埋点自动插桩方法。进一步的,该计算机可存储介质还可以是U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或模块的间接耦合或通讯连接,可以是电性,机械或其它的形式。

作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。

集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个可读存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。而前述的可读存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本申请所必须的。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。

以上为对本申请所提供的埋点自动插桩方法、装置及计算机可读存储介质的描述,对于本领域的技术人员,依据本申请实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本申请的限制。

技术分类

06120114697535