一种信息处理方法及服务器、计算机存储介质与流程

文档序号:16067225发布日期:2018-11-24 12:47阅读:168来源:国知局
本发明涉及通信技术,尤其涉及一种信息处理方法及服务器、计算机存储介质。
背景技术
:用户使用的各种应用、各种互联网服务、各种生活服务等等,都可以通过计算机编程实现。在编程中有时会把多个函数串在一起依次调用,以达到特定的目的,在这里,把这样的调用方式形象地称为函数链调用。函数链中的函数有些是独立的,有些则只用在函数组合中,不会单独调用。对象的连续配置和组合是函数链调用比较常用场合,编程的编译过程中需要有相应的汇编类库供调用。现有函数调用关系链的获取方式,是通过doxygen工具来实现。这种方式是静态解析源代码,通过解析代码的调用以生成函数调用关系链,即:通过解析源代码的方式获取该函数调用关系链。采用上述函数调用关系链的获取方式,所存在的问题是:采用静态解析源代码的方式在对动态语言进行分析过程中,函数调用关系链会有缺失的现象,因为,需要在动态实际运行过程中才能够确定实际的函数地址。然而,相关技术中,对于该问题,尚无有效解决方案。技术实现要素:有鉴于此,本发明实施例提供了一种信息处理方法及服务器、计算机存储介质,至少解决了现有技术存在的问题。本发明实施例提供一种信息处理方法,所述方法包括:以静态方式逆向遍历二进制文件中的函数代码;解析所述函数代码,获取所述函数代码中全局的函数拓扑关系;以动态方式获取所述函数代码运行时函数被调用的实际地址;根据所述函数被调用的实际地址得到局部的函数拓扑关系;根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。上述方案中,所述解析所述函数代码,获取所述函数代码中全局的函数拓扑关系,包括:在静态解析模式下解析所述函数代码,得到所述函数代码中的所有指令;从所述函数代码中的所有指令中,识别出函数地址调用指令;根据所述函数地址调用指令所指示的位置,从所述函数代码中提取出第一函数调用关系链,所述第一函数调用关系链用于表征所述全局的函数拓扑关系。上述方案中,所述以动态方式获取所述函数代码运行时函数被调用的实际地址,包括:从所述静态解析模式切换到动态解析模式,解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址。上述方案中,所述解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址,包括:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;在所述待测试进程运行前,对所述待测试进程下断点,运行到所述断点时,得到运行的特征数据,根据所述特征数据得到所述函数被调用的实际地址。上述方案中,所述解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址,包括:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;挂起所述待测试进程;对所述待测试进程中所述函数地址调用指令的所在位置下断点;运行所述待测试进程,若命中所述断点,则触发对所述函数被调用的实际地址的提取处理,提取出所述函数被调用的实际地址。上述方案中,所述方法还包括:根据所述函数被调用的实际地址得到第二函数调用关系链,所述第一函数调用关系链用于表征所述局部的函数拓扑关系;所述根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链,还包括:根据所述第一函数调用关系链和所述第二函数调用关系链得到所述函数调用关系链。本发明实施例还提供一种服务器,所述服务器包括:遍历单元,用于以静态方式逆向遍历二进制文件中的函数代码;第一解析单元,用于解析所述函数代码,获取所述函数代码中全局的函数拓扑关系;第二解析单元,用于以动态方式获取所述函数代码运行时函数被调用的实际地址;第一处理单元,用于根据所述函数被调用的实际地址得到局部的函数拓扑关系;第二处理单元,用于根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。上述方案中,所述第一解析单元,进一步用于:在静态解析模式下解析所述函数代码,得到所述函数代码中的所有指令;从所述函数代码中的所有指令中,识别出函数地址调用指令;根据所述函数地址调用指令所指示的位置,从所述函数代码中提取出第一函数调用关系链,所述第一函数调用关系链用于表征所述全局的函数拓扑关系。上述方案中,所述第二解析单元,进一步用于:从所述静态解析模式切换到动态解析模式,解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址。上述方案中,所述第二解析单元,进一步用于:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;在所述待测试进程运行前,对所述待测试进程下断点,运行到所述断点时,得到运行的特征数据,根据所述特征数据得到所述函数被调用的实际地址。上述方案中,所述第二解析单元,进一步用于:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;挂起所述待测试进程;对所述待测试进程中所述函数地址调用指令的所在位置下断点;运行所述待测试进程,若命中所述断点,则触发对所述函数被调用的实际地址的提取处理,提取出所述函数被调用的实际地址。上述方案中,所述服务器还包括:关系链获取单元,用于:根据所述函数被调用的实际地址得到第二函数调用关系链,所述第一函数调用关系链用于表征所述局部的函数拓扑关系;所述第二处理单元,进一步用于:根据所述第一函数调用关系链和所述第二函数调用关系链得到所述函数调用关系链。本发明实施例还提供一种计算机可读存储介质,所述存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上面任意一种所述信息处理方法的步骤。本发明实施例还提供一种服务器,所述服务器包括:存储器,用于存储能够在处理器上运行的计算机程序;处理器,用于运行所述计算机程序时,执行上面任意一种所述信息处理方法的步骤。本发明实施例的信息处理方法,包括:以静态方式逆向遍历二进制文件中的函数代码;解析所述函数代码,获取所述函数代码中全局的函数拓扑关系;以动态方式获取所述函数代码运行时函数被调用的实际地址;根据所述函数被调用的实际地址得到局部的函数拓扑关系;根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。采用本发明实施例,对于函数调用关系链存在缺失的现象,以静态方式和动态方式结合的机制,先以静态方式逆向遍历二进制文件中的函数代码,解析得到全局的函数拓扑关系,之后,以动态方式解析得到局部的函数拓扑关系,根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链,该函数调用关系链是完整的,不存在缺失,从而避免了函数调用关系链存在缺失的现象。附图说明图1为本发明实施例中进行信息交互的各方硬件实体的示意图;图2为本发明实施例一方法的实现流程示意图;图3为本发明实施例一系统架构的示意图;图4为本发明实施例一服务器的硬件架构示意图;图5为应用本发明实施例的一服务器模块组成结构示意图;图6为应用本发明实施例的一函数调用指令的识别示意图;图7为应用本发明实施例的一应用场景的静态解析流程图;图8为应用本发明实施例的一应用场景的动态解析流程图;图9为应用本发明实施例的一应用场景的动、静态结合的处理流程示意图。具体实施方式下面结合附图对技术方案的实施作进一步的详细描述。现在将参考附图描述实现本发明各个实施例的移动终端。在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明实施例的说明,其本身并没有特定的意义。因此,"模块"与"部件"可以混合地使用。在下面的详细说明中,陈述了众多的具体细节,以便彻底理解本发明。不过,对于本领域的普通技术人员来说,显然可在没有这些具体细节的情况下实践本发明。在其他情况下,没有详细说明公开的公知方法、过程、组件、电路和网络,以避免不必要地使实施例的各个方面模糊不清。另外,本文中尽管多次采用术语“第一”、“第二”等来描述各种元件(或各种阈值或各种应用或各种指令或各种操作)等,不过这些元件(或阈值或应用或指令或操作)不应受这些术语的限制。这些术语只是用于区分一个元件(或阈值或应用或指令或操作)和另一个元件(或阈值或应用或指令或操作)。例如,第一操作可以被称为第二操作,第二操作也可以被称为第一操作,而不脱离本发明的范围,第一操作和第二操作都是操作,只是二者并不是相同的操作而已。本发明实施例中的步骤并不一定是按照所描述的步骤顺序进行处理,可以按照需求有选择的将步骤打乱重排,或者删除实施例中的步骤,或者增加实施例中的步骤,本发明实施例中的步骤描述只是可选的顺序组合,并不代表本发明实施例的所有步骤顺序组合,实施例中的步骤顺序不能认为是对本发明的限制。本发明实施例中的术语“和/或”指的是包括相关联的列举项目中的一个或多个的任何和全部的可能组合。还要说明的是:当用在本说明书中时,“包括/包含”指定所陈述的特征、整数、步骤、操作、元件和/或组件的存在,但是不排除一个或多个其他特征、整数、步骤、操作、元件和/或组件和/或它们的组群的存在或添加。本发明实施例的智能终端(如移动终端)可以以各种形式来实施。例如,本发明实施例中描述的移动终端可以包括诸如移动电话、智能电话、笔记本电脑、数值广播接收器、个人数值助理(pda,personaldigitalassistant)、平板电脑(pad)、便携式多媒体播放器(pmp,portablemediaplayer)、导航装置等等的移动终端以及诸如数值tv、台式计算机等等的固定终端。下面,假设终端是移动终端。然而,本领域技术人员将理解的是,除了特别用于移动目的的元件之外,根据本发明的实施方式的构造也能够应用于固定类型的终端。图1为本发明实施例中进行信息交互的各方硬件实体的示意图,图1中包括:终端1、服务器2。终端1可以由多个终端11-13组成,通过无线或有线方式与服务器2进行信息交互。图1中的服务器个数仅仅起指代作用,并不限制服务器的。相关技术中,函数调用关系链的获取方式,是静态解析源代码,通过解析代码的调用以生成函数调用关系链,即:通过解析源代码的方式获取该函数调用关系链。这种函数调用关系链的获取方式,存在缺点。1)需要获取源代码方可获取函数调用关系链数据;2)静态分析源码的方式在对动态语言进行分析过程中,函数调用关系链会有缺失的现象,因为,需要在动态实际运行过程中才能够确定实际的函数地址;3)对于跨模块的接口之间的边界耦合调用解析,通过这种方式是获取不了的,因为,通过doxygen工具来实现的静态解码都是在模块内部解析的,模块与模块的调用关系它是无法处理的,单凭字符匹配的错误率也高;4)在源代码量级达一定级别之后,解析的过程过于冗长,消耗时间过多,不易于保持函数调用关系链数据的实时性。可见,相关技术中,由于得到的函数调用关系链是不完整的,存在缺失,导致了上述无法解决的问题。采用本发明实施例,由服务器执行如图1所示的处理逻辑10,以静态方式和动态方式结合的机制,先以静态方式逆向遍历二进制文件中的函数代码,解析得到全局的函数拓扑关系,之后,以动态方式解析得到局部的函数拓扑关系,根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链,该函数调用关系链是完整的,不存在缺失,从而避免了函数调用关系链存在缺失所导致的上述问题。处理逻辑10,包括:s1、以静态方式逆向遍历二进制文件中的函数代码,解析得到函数代码中全局的函数拓扑关系;s2、以动态方式解析得到函数代码中局部的函数拓扑关系;s3、根据局部的函数拓扑关系,对全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。上述图1的例子只是实现本发明实施例的一个系统架构实例,本发明实施例并不限于上述图1所述的系统结构,基于上述图1所述的系统架构,提出本发明方法各个实施例。本文中,函数调用关系链也可以简称为函数调用链。本发明实施例的种信息处理方法,如图2所示,所述方法包括:以静态方式逆向遍历二进制文件中的函数代码(101)。本发明实施例中,通过对逆向汇编的遍历分析,比如函数代码为c/c++代码,函数代码中的函数调用在被编译成二进制之后,逆向成汇编语言。调用函数的指令有两类:一类是call指令。另一类是无条件跳转jump指令。这两类指令都用于函数实际地址的调用,即这两类指令调用的地址均是函数的实际地址。需要从函数代码中识别出这两类指令。解析所述函数代码,获取所述函数代码中全局的函数拓扑关系(102)。对于静态方式的解析过程,只需要逆向遍历每一个二进制文件中的函数,遍历每一个函数中的每一条指令,以识别出call指令与jump指令的调用。call指令与jump指令都是函数地址调用的指令,将call指令与jump指令这种函数地址调用的指令提取出来,就可以完成静态函数调用关系链的解析过程。采用本发明实施例的静态逆向分析二进制的方式,可以获取函数调用关系链全局图。本发明实施例的种信息处理方法,包括:以动态方式获取所述函数代码运行时函数被调用的实际地址(103)。函数实际地址区别于虚地址。对应函数实际地址,相应的函数可以称为真实函数,对应虚地址,相应的函数可以称为虚函数。具体的,站在逆向二进制的角度观察函数的调用关系,可以将函数的调用分为两种类型:1)函数实际地址的调用,分为两种一个是call指令调用,另一个是无条件跳转jump指令调用,指令调用的地址均是实际地址。2)函数虚地址的调用,指的是将函数作为参数进行传递,通过参数/变量进行调用、虚函数调用。函数实际地址的调用,通过静态解析可以得到,而函数虚地址的调用,由于对这种类型的调用在静态解析时是对寄存器的调用,是虚的地址,还需要在动态运行时从寄存器中提取函数实际地址才可以知道真正被调用的函数。以动态方式获取所述函数代码运行时函数被调用的实际地址,可以采用动态插桩的方式来实现。采用动态插桩的方式,可以获取动态(或多态)函数运行时的真实函数调用地址。所述动态插桩方式是指:为了保证被测程序(如函数代码)原有逻辑的完整性,以此为基础在程序中插入一些探针,通过探针的执行来抛出程序运行的特征数据,通过对这些特征数据的分析,可以获得程序的函数调用关系链。本发明实施例的种信息处理方法,包括:根据所述函数被调用的实际地址得到局部的函数拓扑关系(104)。根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链(105)。采用本发明实施例,实现了函数调用关系链的解析,能够完整得获取函数间的调用关系,为测试分析提供辅助;对于代码的变更能够智能进行测试范围的精准划分。本发明实施例中,在静态解析模式下解析所述函数代码,得到所述函数代码中的所有指令。从所述函数代码中的所有指令中,识别出函数地址调用指令(包括call与jump指令)。根据所述函数地址调用指令所指示的位置,从所述函数代码中提取出第一函数调用关系链,所述第一函数调用关系链用于表征所述全局的函数拓扑关系,从而通过静态解析模式下对所述函数代码的解析,最终,获取到函数代码中全局的函数拓扑关系。对于静态解析,只需要遍历每一个二进制文件中的函数,在遍历每一个函数中的每一条指令,识别函数地址调用指令,如call调用指令和jump调用指令,将call调用指令和jump调用指令提取出来,就可以完成静态函数调用关系链的解析过程。通过静态逆向遍历二进制中的函数指令,将call调用指令和jump调用指令从函数所有指令中提取出来之后,根据call调用指令和jump调用指令提取出函数调用关系链。可以将该函数调用关系链保存到静态版本调用链数据库中。但是,这种静态解析方式对于虚地址的函数调用是无效的,对于调用函数虚地址,需要动态运行函数代码时才可以可实时确定出来,得到虚地址对应的函数实际地址。本发明实施例中,从所述静态解析模式切换到动态解析模式,解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址,从而,通过动态解析模式下对所述函数代码的解析,最终,得到函数代码运行时函数被调用的实际地址。上述实施例中,在所述第一函数调用关系链中存在缺失的数据,该缺失的数据是函数虚地址的调用所导致的,函数虚地址的调用,在上述静态解析时,是对寄存器的调用,是虚的地址,需要在动态运行函数代码时从寄存器中提取函数实际地址,才可以知道真正被调用的函数。其中,函数虚地址的调用指的是将函数作为参数进行传递,通过参数/变量进行调用、虚函数调用。采用本实施例,对于虚函数调用,以动态解析模式可以得到函数被调用的实际地址。本发明实施例中,从函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址。在所述待测试进程运行前,对所述待测试进程下断点,运行到所述断点时,得到运行的特征数据,根据所述特征数据得到所述函数被调用的实际地址。一个示例为:所述待测试进程运行前,对所述待测试进程下断点,运行到所述断点时,得到运行的特征数据,根据所述特征数据捕获这里的调用信息,得到第二函数调用关系链,所述第二函数调用关系链用于表征所述局部的函数拓扑关系调用的实际地址得到局部的函数拓扑关系。本发明实施例中,从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址。挂起所述待测试进程,对所述待测试进程中所述函数地址调用指令的所在位置下断点。运行所述待测试进程,若命中所述断点,则触发对所述函数被调用的实际地址的提取处理,提取出所述函数被调用的实际地址。一个示例为:确定出所述函数代码中存在需要动态获取函数调用关系链的待测试进程;挂起所述待测试进程,对所述函数地址调用指令处下断点,执行待测试进程,若命中断点,提取函数实际地址。根据函数实际地址得到第二函数调用关系链,所述第二函数调用关系链用于表征所述局部的函数拓扑关系调用的实际地址得到局部的函数拓扑关系。本发明实施例中,根据所述函数被调用的实际地址得到第二函数调用关系链,所述第一函数调用关系链用于表征所述局部的函数拓扑关系。所述根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链的过程中,根据所述第一函数调用关系链和所述第二函数调用关系链得到所述函数调用关系链。采用本实施例,是采用静态逆向反汇编代码方式,及动态汇编代码插桩的方式来获取函数调用关系链,即:将静态与动态两者的函数调用关系链数据进行合并,从而对静态分析的函数调用关系链数据进行补充。具体的,采用静态逆向反汇编代码方式的方式获取全局的函数拓扑关系。对于存在缺失的部分,采用动态汇编代码插桩的方式,分析函数调用关系链方式在动态运行过程中实际运行的函数地址,从而获取动态(多态)函数运行时的真实函数调用地址。其中,所述插桩指:保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的函数调用关系链。本发明实施例中,通过函数调用关系链的解析,能够完整得获取函数间的调用关系,为测试分析提供辅助;对于代码的变更能够智能进行测试范围的精准划分。本发明实施例的信息处理系统,如图3所示,包括终端41和服务器42,服务器42对从终端41收集到的函数代码进行解析时,以静态方式逆向遍历二进制文件中的函数代码,解析得到函数代码中全局的函数拓扑关系,以动态方式解析得到函数代码中局部的函数拓扑关系,根据局部的函数拓扑关系,对全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。服务器42可以为用于测试用例(或测试数据)测试的测试平台。服务器42包括:遍历单元421,用于以静态方式逆向遍历二进制文件中的函数代码;第一解析单元422,用于解析所述函数代码,获取所述函数代码中全局的函数拓扑关系;第二解析单元423,用于以动态方式获取所述函数代码运行时函数被调用的实际地址;第一处理单元424,用于根据所述函数被调用的实际地址得到局部的函数拓扑关系;第二处理单元425,用于根据所述局部的函数拓扑关系,对所述全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。本发明实施例一实施方式中,所述第一解析单元,进一步用于:在静态解析模式下解析所述函数代码,得到所述函数代码中的所有指令;从所述函数代码中的所有指令中,识别出函数地址调用指令;根据所述函数地址调用指令所指示的位置,从所述函数代码中提取出第一函数调用关系链,所述第一函数调用关系链用于表征所述全局的函数拓扑关系。本发明实施例一实施方式中,所述第二解析单元,进一步用于:从所述静态解析模式切换到动态解析模式,解析所述函数代码中包含的函数虚地址,得到与所述函数虚地址对应的函数被调用的实际地址。本发明实施例一实施方式中,所述第二解析单元,进一步用于:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;在所述待测试进程运行前,对所述待测试进程下断点,运行到所述断点时,得到运行的特征数据,根据所述特征数据得到所述函数被调用的实际地址。本发明实施例一实施方式中,所述第二解析单元,进一步用于:从所述函数代码中确定出需要动态获取函数调用关系链的待测试进程,所述待测试进程中包含函数虚地址;挂起所述待测试进程;对所述待测试进程中所述函数地址调用指令的所在位置下断点;运行所述待测试进程,若命中所述断点,则触发对所述函数被调用的实际地址的提取处理,提取出所述函数被调用的实际地址。本发明实施例一实施方式中,所述服务器还包括:关系链获取单元,用于:根据所述函数被调用的实际地址得到第二函数调用关系链,所述第一函数调用关系链用于表征所述局部的函数拓扑关系;所述第二处理单元,进一步用于:根据所述第一函数调用关系链和所述第二函数调用关系链得到所述函数调用关系链。本发明实施例的一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行实时现如上述实施例所述信息处理方法的步骤。本发明实施例的一种服务器,如图4所示,所述服务器包括:存储器61,用于存储能够在处理器上运行的计算机程序;处理器62,用于运行所述计算机程序时,执行如上述实施例中信息处理方法的步骤。所述服务器还可以包括:外部通信接口63,外部通信接口63用于与终端等外设进行信息交互,具体如服务器对从终端收集到的函数代码进行解析时,以静态方式逆向遍历二进制文件中的函数代码,解析得到函数代码中全局的函数拓扑关系,以动态方式解析得到函数代码中局部的函数拓扑关系,根据局部的函数拓扑关系,对全局的函数拓扑关系中缺失的数据进行补齐,得到函数调用关系链。所述服务器还可以包括:内部通信接口64,所述内部通信接口64具体可以是pci总线等总线接口。以一个现实应用场景为例对本发明实施例阐述如下:本发明实施例可以实现函数调用关系链的提取,是一种基于动静结合的方式集合获取函数调用关系链的方案。采用静态逆向反汇编代码方式以及动态汇编代码插桩的方式获取函数调用关系链。其中,采用静态逆向分析二进制的方式获取函数调用关系链全局图。采用动态插桩方式获取动态(多态)函数运行时的真实函数调用地址。本发明实施例采用的模块,如图5所示,包括:静态解析模块51、动态解析模块52和关系链统计模块53。其中,静态解析模块51用于采用静态逆向反汇编代码方式对函数代码进行解析,得到的第一函数调用链为函数调用关系链的全局图;动态解析模块52用于采用动态插桩方式获取动态(多态)函数运行时的真实函数调用地址,通过函数运行时的真实函数调用地址得到第二函数调用链,得到的第二函数调用链为函数调用关系链的局部图;关系链统计模块53,用于根据第二函数调用链和第一函数调用链得到完整的函数调用关系链,具体是通过第二函数调用链对第一函数调用链中缺失的数据进行补齐,从而实现对函数调用链的统计和完善。一、静态解析模块51实现了从二进制逆向的角度获取函数相互之间的调用关系。进行静态二进制逆向分析以得到函数调用关系链的过程中,具体实现方法如下:站在逆向二进制的角度观察函数的调用关系,可以将函数分为以下两种类型:1)函数实际地址的调用,分为两种一个是call指令调用,另一个是无条件跳转jump指令调用,指令调用的地址均是实际地址。2)函数虚地址的调用,指的是将函数作为参数进行传递,通过参数/变量进行调用、虚函数调用。这种类型的调用在静态时期是对寄存器的调用,是虚的地址,需要在动态运行时从寄存器中提取实际地址才可以知道真正被调用的函数。普通函数的调用,指的是可以直接通过函数的实际地址进行直接的调用。从c/c++语言的角度来看,这个函数可以是一个纯c函数或者c++类成员非虚函数。通过对逆向汇编的分析,c/c++代码中的函数调用在编译成二进制之后,逆向成汇编语言,从普通函数的角度观察,调用函数的指令有两类:一类是call指令。另一类是无条件跳转jump指令,如图6所示。对于静态分析,只需要遍历每一个二进制文件中的函数,在遍历每一个函数中的每一条指令,识别call与jump调用,将是函数地址调用的指令提取出来,就可以完成静态函数调用关系链的解析过程,该解析过程如图7所示,包括:逆向遍历二进制中函数(401),遍历函数中的指令(402),解析汇编指令(403),判断函数调用指令(404),提取函数调用关系(405),将提取的函数调用关系进行信息入库(406)。可见,静态逆向遍历二进制中的函数指令的过程中,将涉及到函数调用的指令提取指令之后,保存到静态版本调用链数据库中。但是这种方式对于虚地址的函数调用是无效的,对于调用函数虚地址,需要动态运行时方可实时确定,所以需要下面动态插桩分析函数调用关系链方式方可解决。二、动态解析模块52,实现了补充静态逆向二进制文件解析函数调用关系链过程中调用链数据缺失的问题。具体实现方法如下:用例录入模块的目的是实现用例和函数的关联,具体实现方法如图8所示。图8中阴影4填充部分为用户需要进行的操作,其他部分为系统进行的操作。该具体实现过程,包括:设置版本号(601),挂起被测进程(602),解析汇编指令(603),判断函数调用指令(604),插入断点(605),执行测试程序(606),记录函数地址(607),记录函数调用关系(608),信息入库(609)。可见,用户在系统上设置测试的版本号,系统根据版本号从编译平台获取被测产品的程序的基本数据(pdb,programdatabase)文件,是vs编译链接时生成的文件,通过pdb文件获取得到函数与行号之间的关系,解析每一行代码的汇编指令,在汇编指令中判断是否是call/jump指令,在这两种指令处下断点。然后恢复挂起进程的运行,当被测程序命中断点之后,就可以提取断点处寄存器的实时地址值,这个地址就是动态运行的真是函数地址。然后将动态运行时获取的函数调用关系链存储到动态调用链数据库中。动态插桩分析函数调用关系链,通过运营的方式不断累积数据,使用这方面的数据就可以弥补静态逆向二进制文件解析函数调用关系链方式所缺失的调用链数据。从而真正的起到捕获完整的函数调用关系链的目的。三、关系链统计模块53,对函数调用关系链的统计和完善过程。静态逆向二进制文件解析函数调用关系链方式可以将函数调用的所有关系解析出来,只是部分调用关系因为函数虚地址的原因具体不到被调用的函数地址。由于静态分析可以系统自动解析,无需人工参与,所以我们可以对静态分析的函数调用关系链数据按版本进行保存,以保障调用链数据是最新版本的。而动态分析函数调用关系链的方式获取模块局部的函数调用关系图,其优势是获取的调用关系数据是实时准确的,但是,只能覆盖到运行到的函数调用分支数据。而且,需要人工的动态运行采集方可收集这方面的数据,为了避免人工对每一个版本采集的繁复工作量,可以将各个版本动态采集的函数调用关系链数据按大版本的概念进行存储,从而既保证了数据的完整度,又保证了一定的实时性。为了获取完善的函数调用关系链数据,可以将静态分析与动态分析相互结合的方式,在静态分析得出全局图的情况下,通过动态分析的方式对全局图中缺漏的点进行补充的方式,逐步完善所需的函数调用关系链。解析函数调用关系链并对其进行统计和完善的过程,如图9所示。图9中,左侧是静态分析的第一处理分支,右侧是动态分析的第二处理分支。该过程包括:步骤701、提测以进行版本对比之后,通过不同的处理分支继续执行操作。在第一处理分支中,包括:步骤7021、版本变更分析;步骤7022、获取静态函数调用关系链;步骤7023、在先统计每一个模块的函数调用链完善度,将其作为基础数据;步骤7024、通过大版本对应动态函数调用链数据来补充函数调用链数据。在第二处理分支中,包括:步骤7031、获取产品信息;步骤7032、获取大版本;步骤7033、转换对应产品id;步骤7034、获取大版本对应动态函数调用链数据,转入执行步骤7024;步骤704、最终补齐函数调用链数据后,统计每一个模块的函数调用链完善度。通过图9的流程,实现了如何将静态与动态两者的函数调用关系链数据进行合并,从而对静态分析的函数调用关系链数据进行补充。通过静态二进制逆向分析函数调用关系链方式获取全局的函数拓扑关系,对于存在缺失的部分,使用动态插桩分析函数调用关系链方式在动态运行的过程获取实际运行的函数地址,从而起到补充缺失调用链的作用,逐步完善整体函数调用关系链数据。采用本发明实施例,可以获取完整的函数调用关系链,包括跨模块的接口调用。可以建立起项目中函数关系,方便项目组成员理解开发实现。方便测试进行开发实现分析。可以对函数的调用关系的变更进行监控,避免耦合问题,测试分析遗漏等问题。同时可以通过调用链的耦合关系明确变更代码的影响测试范围。在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。或者,本发明上述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本
技术领域
:的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1