一种获取程序中模块间函数接口的方法和系统的制作方法

文档序号:6434122阅读:140来源:国知局
专利名称:一种获取程序中模块间函数接口的方法和系统的制作方法
技术领域
本发明涉及大型软件的模块接口技术,尤其涉及一种获取程序中模块间函数接口 的方法和系统。
背景技术
随着计算机技术和通信技术的不断发展,用户对软件系统的性能要求也越来越 高,软件系统也变得越来越大,进而在现有技术中,产生了很多大型软件系统。
在大型软件系统中,程序里包含了若干逻辑模块之间的相互作用,而这些逻辑模 块之间的接口,会直接影响模块的程序架构中的模块耦合关系,对软件系统的综合性能影 响很大。
逻辑模块之间的接口除了在系统架构设计时考虑以外,还需要在后续的详细设 计、编码实现中严格遵循接口说明书。因此,需要一种有效的手段,可以检查已实现的软件 系统中,模块的实际接口情况,以便与接口设计进行对比,在发现接口差异可以进行及时修 改。
同时,在对旧的软件系统架构改造中,还需要对现有程序中的模块接口关系进行 提取,然后在此基础上进行模块解耦,设计新的模块接口。而这也需要获取模块接口。
程序模块之间的接口,包括函数接口与数据接口。对于函数接口,程序里的函数 调用关系有两类,分别是内部函数调用IFC(Internal Function Calling)、外部函数调用 EFC (External Function Calling)。其中IFC的函数调用点和被调用函数都处于程序范围 内,而EFC的被调用函数处于程序范围以外,通常为调用动态链接库内的函数。
IFC根据调用形式的不同,还可以分为内部函数静态调用IFSCdnternal Function Static Calling)和内部函数动态调用 IFDC(Internal Function Dynamic Calling)。静态调用指调用的目标函数在编译时已经确定,动态调用指调用的目标函数在 编译时尚未明确,当程序运行到调用点时,才确定调用的目标函数。
在现有技术中,获取模块函数接口的方法是在编译链接程序的时候,利用编译器 生成每个目标文件的函数依赖关系,然后汇总分析形成模块之间的函数接口关系。
在实现本申请实施例中技术方案的过程中,本申请发明人发现现有技术中至少存 在如下技术问题
在依赖于编译时对源码的依赖关系提取,无法适用于源码不完整的程序的接口分 析;
程序内回调函数等动态调用关系只能通过人工配置维护,无法自动提取;
由于任务调度信息的传统获取方法的上述缺点,导致对模块函数接口的分析一直 存在动态调用关系维护难度大、适用场景有限等问题。发明内容
本发明提供一种获取程序中模块间函数接口的方法和系统,用于实现自动对模块间函数接口进行获取的目的。
一方面,本发明通过本申请中的一个实施例,提供如下技术方案
一种获取程序中模块间函数接口的方法,用于获取可执行程序中模块间函数接 口,所述方法包括
通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文件、外部函数 调用EFC关系文件,及内部函数动态调用IFDC出口清单文件;
在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录文件;
基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述可执行程 序中1旲块间的函数调用关系表。
可选地,在所述基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获 得所述可执行程序中模块间的函数调用关系表之后,基于所述可执行程序中模块间的实际 函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数接口变更信息。
可选地,所述获得所述可执行程序中模块间的函数接口变更信息,具体包括
基于所述实际函数调用关系表和模块内部函数清单,获得所述可执行程序中模块 间的实际函数接口关系;
基于所述可执行程序的标准模块函数接口配置文件,获得所述可执行程序中模块 间的标准函数接口关系;
比较所述可执行程序中模块间的实际函数接口关系及标准函数接口关系,获得所 述可执行程序中模块间的函数接口变更信息文件。
可选地,所述通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文 件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件,具体包括
提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息;
分析所述可执行程序的重定位段,生成所述外部函数调用EFC关系文件;
扫描所述可执行程序的每个函数的函数代码段,获得每个函数的函数调用指令;
在所述函数调用指令中指定的函数调用方式为寄存器形式时,生成所述IFDC出 口清单文件;
在所述函数调用指令中指定的函数调用方式为操作数形式时,生成所述IFSC关 系文件。
可选地,所述每个函数的属性信息至少包括函数名称、函数类型、函数开始地址 和函数的代码段大小。
可选地,所述在运行所述可执行程序时,基于所述IFDC清单文件,生成IFDC记录 文件,具体包括
所述可执行程序运行时,执行所述可执行程序初始化段内的提取动态调用关系模 块的初始化代码,以获得所述IFDC出口清单文件;
执行每个函数头部内的动态调用关系模块的提取代码,以获得每个函数的上级函 数调用出口地址;
当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件 对应的目标函数列表中包括所述调用出口地址对应函数时,则记录所述调用出口地址对应 函数的IFDC信息;
当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件 对应的目标函数列表中不包括所述调用出口地址对应函数时,则在为所述调用出口地址对 应函数建立新的IFDC关系之后,记录所述调用出口地址对应函数的IFDC信息;
当所述可执行程序运行结束时,提取出每个函数的IFDC信息,在程序目录下生成 所述IFDC记录文件。
可选地,所述执行每个函数头部内的动态调用关系模块的提取代码,以获得每个 函数的上级函数调用出口地址的步骤,具体包括
将从寄存器中,获取每个函数的上级函数调用出口的下一条指令的地址;
修正所述下一条指令的地址,得到所述上级函数调用出口地址。
可选地,所述基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得 所述可执行程序中模块间的函数调用关系表,具体包括
利用分析工具,对所述EFC关系文件、所述IFSC关系文件及IFDC记录文件进行解 析,获得所述可执行程序中模块间的函数调用关系表。
可选地,所述函数调用关系表中每条函数调用关系至少包括父函数名称、调用出 口地址、目标函数名称、调用方式、父函数对应源文件。
此外,本发明还通过本申请中的另一实施例提供如下技术方案
一种获取程序中模块间函数接口的系统,用于获取可执行程序中模块间函数接 口,所述系统包括
静态扫描单元,用于通过静态扫描所述可执行程序,生成内部函数静态调用IFSC 关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件;
IFDC记录文件获得单元,用于在运行所述可执行程序时,基于所述IFDC出口清单 文件,生成IFDC记录文件;
函数调用关系获得单元,用于基于所述EFC关系文件、所述IFSC关系文件及IFDC 记录文件,获得所述可执行程序中模块间的函数调用关系表。
可选地,所述系统还包括函数接口变更信息获得单元,用于基于所述可执行程序 中模块间的实际函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数 接口变更信息。
可选地,所述函数接口变更信息获得单元具体包括
第一获得单元,用于基于所述函数调用关系表,获得所述可执行程序中模块间的 实际函数接口关系;
第二获得单元,用于基于所述可执行程序的标准模块函数接口配置文件,获得所 述可执行程序中模块间的标准函数接口关系;
比较单元,用于比较所述可执行程序中模块间的实际函数接口关系及标准函数接 口关系,获得所述可执行程序中模块间的函数接口变更信息文件。
可选地,所述静态扫描单元,具体包括
提取单元,用于提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息;
分析单元,用于分析所述可执行程序的重定位段,生成所述外部函数调用EFC关 系文件;
扫描单元,用于扫描所述可执行程序的每个函数的函数代码段,获得每个函数的 函数调用指令;
第一生成单元,用于在所述函数调用指令中指定的函数调用方式为寄存器形式 时,生成所述IFDC出口清单文件;
第二生成单元,用于在所述函数调用指令中指定的函数调用方式为操作数形式 时,生成所述IFSC关系文件。
可选地,所述每个函数的属性信息至少包括函数名称、函数类型、函数开始地址 和函数的代码段大小。
可选地,所述IFDC记录文件获得单元,具体包括
第一执行单元,用于所述可执行程序运行时,执行所述可执行程序初始化段内的 提取动态调用关系模块的初始化代码,以获得所述IFDC出口清单文件;
第二执行单元,用于执行每个函数头部内的动态调用关系模块的提取代码,以获 得每个函数的上级函数调用出口地址;
记录单元,用于当所述IFDC出口清单文件中存在所述调用出口地址时且所述 IFDC出口清单文件对应的目标函数列表中包括所述调用出口地址对应函数时,则记录所 述调用出口地址对应函数的IFDC信息;当所述IFDC出口清单文件中存在所述调用出口地 址时且所述IFDC出口清单文件对应的目标函数列表中不包括所述调用出口地址对应函数 时,则在为所述调用出口地址对应函数建立新的IFDC关系之后,记录所述调用出口地址对 应函数的IFDC信息;
提取单元,用于当所述可执行程序运行结束时,提取出每个函数的IFDC信息写文 件,在程序目录下生成所述IFDC记录文件。
可选地,所述第二执行单元,具体包括
获取单元,用于从寄存器中,获取每个函数的上级函数调用出口的下一条指令的 地址;
修正单元,用于修正所述下一条指令的地址,得到所述上级函数调用出口地址。
可选地,所述函数调用关系获得单元具体为解析单元,用于对所述EFC关系文 件、所述IFSC关系文件及IFDC记录文件进行解析,获得所述可执行程序中模块间的函数调 用关系表。
可选地,所述函数调用关系表中每条函数调用关系至少包括父函数名称、调用出 口地址、目标函数名称、调用方式、父函数对应源文件。
上述技术方案中的一个或多个技术方案,具有如下技术效果或优点
一、通过在获取程序中模块间函数接口的过程中,采用了插入钩子函数,静态扫描 可执行程序技术手段,使得在程序进行每一次内部函数调用的过程中,实现动态调用关系 容易维护的技术效果;
二、通过在获取程序中模块间函数接口的过程中,采用了将可执行程序中模块间 的实际函数接口关系与标准函数接口关系进行对比的手段,使得在获取可执行程序中模块 间的函数接口变更信息文件的过程中,实现动态调用关系适用场景不受限制的技术效果。


图1为本申请实施例中获取程序中模块间函数接口的方法流程图2为本申请实施例中获得及提取IFDC记录文件的方法流程图3为本申请实施例中提取函数调用关系的方法流程图4为本申请实施例中获得函数接口变更信息的方法流程图5为本申请实施例中获取程序中模块间函数接口的系统模块图6为本申请实施例中静态扫描单元的模块图7为本申请实施例中IFDC记录文件获得单元的模块图8为本申请实施例中函数接口变更信息获得单元的模块图。
具体实施方式
为了使本申请所属技术领域中的技术人员更清楚地理解本发明,下面结合附图, 通过具体实施例对本发明技术方案作详细描述。
请参考图1、图2、图3和图4,本申请实施例一中的获取程序中模块间函数接口的方法,包括如下步骤
步骤101,通过静态扫描一可执行程序,生成内部函数静态调用IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件。
在具体实施过程中,所述可执行程序通过如下步骤生成先编译源代码,然后插入函数调用的钩子函数,通过该步骤可在程序中预先植入钩子函数的代码,使其能够在程序运行时完成IFDC信息的提取。
其中,插入函数调用的钩子函数具体实现过程如下
一,在程序的init段插入动态调用关系提取的初始化代码;
所述程序中的每一个可执行文件,都包含一个对应的init段,所述init段在所述程序加载时得到一次性运行。
二,在所有的函数入口处插入动态调用关系提取代码。
根据编译时在makefile中设置的开关,在指定文件中所有函数的入口处添加提取所述动态函数调用的代码片段。通过运行该代码片段可以提取当前函数的上级函数调用出口 ;并判断所述上级函数调用出口是否在IFDC出口清单里;并在动态调用出口已经存在时,生成动态调用记录。
对于步骤101,在具体实施过程中,具体包括
一,提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息,如函数名称、类型、地址、大小等。在所述程序文件的Symbol符号段里,包含了所有函数与变量符号信息。一个符号的定义如下
typedef struct {Ε1β2—Wordst—name;Il名称的偏移入口ElB2_Addrst—value;;丨I符号的段地址偏移ElB2_Wordst—size; /V符号的大小unsigned charst—info; /V符号的类型等unsigned charst—other;Ε1β2—Halfst shndx; /丨丨关联的段
} Ε1β2—Sym;
其中,st_info字段的低4位为st_type信息,所有函数符号的st_type值为STT_ FUNC。提取所有符合该特征的函数符号则形成函数清单。
然后,根据存在于程序中SHT_STRTAB段中的st_name,提取该符号的名称。根据 st_value并结合st_shndx对应段的加载地址,计算出符号的开始地址。从st_size字段获得符号的大小,即函数的长度,并结合函数的开始地址,得到函数的结束地址。所述函数的开始地址与结束地址之间,则为函数的代码区间。
二,分析所述可执行程序的重定位段,生成所述外部函数调用EFC关系文件;
其中,生成所述外部函数调用EFC关系文件的过程具体为所述可执行程序文件在编译链接后,会针对外部动态库的符号引用,在SHT_RELA段中保存对应的重定位信息。 所述SHT_RELA段为所述可执行程序文件中的地址段或代码段,所述重定位信息的格式为
typedef struct {ElB2_Addr r offset; Il 重定位地址 ElB2_Word r—info; Il 重定位信息 } Ε1β2—Rel;
根据所可以计算出代码段中需要重定位的地址,S卩,调用所述外部动态库函数的指令的地址。根据所述1"」1^0获得调用的外部符号,进一步在符号表中查询 st_type为STT_UNDEF的符号,可得到调用的外部动态库的函数名称,从而形成所述可执行程序的EFC信息。完成对所述可执行程序的扫描后,会在所述可执行程序文件目录下,生成所述EFC关系文件。
三,扫描所述可执行程序的每个函数的函数代码段,获得每个函数的函数调用指令,具体包括
根据函数符号清单,获得所述程序中每个函数的代码区间,所述每个函数的代码区间内是所述每个函数的每一条指令的机器码,即,指令码,所述指令码通常由指令操作符和操作数组成。
对于不同的CPU体系,指令格式是不同的,如intel的CPU体系中的指令格式和AMD的CPU体系中的指令格式是不一样的;但对于同一类型的所述CPU体系,基础指令格式 是固定的,如intel的奔腾系列的CPU中的基础指令格式是固定的。
确定所述CPU的体系,并按照所述CPU体系中对应CPU的指令格式,逐条读入所述 每个函数的所述指令码,然后提取所述指令码中的操作码,并判断所述CPU的指令是否为 函数调用指令。其中,判断的结果包括两种情况
第一种,所述CPU的指令不是所述函数调用指令,则不进行下一步分析函数调用 的处理;
第二种,所述CPU的指令是所述函数调用指令,则进一步判断属于何种函数调用。
在进一步判断属于何种函数调用时,通过识别所述CPU的指令的操作码,判断所 述函数调用指令中指定的调用函数的调用方式,所述调用函数的调用方式具体包括两种
第一种,以寄存器形式调用;
第二种,以操作数形式调用。
在所述函数调用指令中指定的函数调用方式为寄存器形式时,所述函数无法通过 静态分析程序代码获取目标函数信息,需要在后续的程序运行过程中进行提取。因此,需要 将未确定的所述目标函数的调用指令出口记录,供所述可执行程序运行时的编译内嵌功能 使用。完成对所述可执行程序的扫描后,会在所述可执行程序文件目录下,生成所述IFDC 出口清单文件。
在所述函数调用指令中指定的函数调用方式为操作数形式时,从所述函数调用指 令码中,提取对应的操作数,按照寻址方式,转换成对应的目标函数绝对地址。然后在所述 函数符号清单中,查找调用的所述目标函数名称。
将所述调用出口、目标函数形成一条IFSC关系并进行记录。完成对所述可执行程 序的扫描后,会在所述可执行程序文件目录下,生成所述完整的IFSC关系文件。
步骤102,在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录 文件。
在具体实施过程中,所述可执行程序运行时,首先,执行init段中内嵌的初始化 功能,提取动态调用关系模块的初始化代码,以获得所述IFDC出口清单文件,然后,加载所 述IFDC出口清单文件,所述IFDC出口清单文件里包含了所有需要提取的函数动态调用关 系,如内部函数静态调用IFSC关系文件、内部函数动态调用IFDC关系文件、外部函数调用 EFC关系文件等,执行每个函数头部内的动态调用关系模块的提取代码,获得所述每个函数 的上级函数调用出口地址;
其中,所述每个函数的上级函数调用出口地址获得方式具体为所述动态调用关 系模块的提取代码从ra寄存器中,获取当前函数的上级函数调用出口的下一条指令的地 址,修正后得到所述上级函数调用出口地址CP(Calling Point)。
进一步,在所述IFDC清单中,查找所述CP是否存在。其中,查找的结果包括两种 情况
第一种,所述CP不存在于所述IFDC清单中,则表示所述当前函数调用不需要记 录,继续分析后续的函数的其它指令;
第二种,所述CP存在于所述IFDC清单中,则表示所述当前函数调用是需要记录的 动态调用。
此时,在所述IFDC清单对应的函数出口条目中,查找目标函数列表。其中,查找的 结果也包括两种情况
第一种,当前函数在所述目标函数列表中,则记录所述调用出口地址对应函数的 IFDC信息;
第二种,当前函数不在所述目标函数列表中,则建立一条新的IFDC关系,记录所 述调用出口地址对应函数的IFDC信息,并将所述IFDC信息写文件添加到所述目标函数列表中。
当程序运行结束时,提取出每个函数的IFDC信息,在所述可执行程序目录下生成 所述IFDC记录文件。
步骤103,基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述 可执行程序中模块间的函数调用关系表。
在具体实施过程中,当程序运行完毕并生成了 IFDC记录文件后,结合静态扫描 程序文件得到的所述IFSC文件与EFC文件,解析出完整的函数调用关系表FC (Function Calling)。
其中,每一条FC信息包含多种属性信息,如父函数名称、调用出口地址、目标函 数名称、调用方式、父函数对应源文件等,供进一步分析模块之间的函数接口关系。
在具体分析时,基于所述函数调用关系表,获得所述可执行程序中模块间的实际 函数接口关系;其中,具体过程为所述解析出完整的函数调用关系表后,加载程序内部模 块配置表IMC(Intemal Module Configuration)文件,将所述可执行程序内所有函数之间 的调用关系转换成所有模块的函数调用关系MFC (Module Function Calling),在所述所有 模块的函数调用关系MFC的基础上,过滤掉所述调用出口与目标函数属于同一个模块的模 块内部调用关系,得到模块之间的实际函数接口关系MFI (Module Function Interface)。
基于所述可执行程序的标准模块函数接口配置文件,获得所述可执行程序中模 块间的标准函数接口关系;其中,具体过程为从模块接口设计方案中导出,或在扫描得到 的模块函数接口信息基础上进行修订得到所述可执行程序的标准模块函数接口配置文件 SMFIC (Standard Module Function Interface Configuration),所述可执行程序的标准模 块函数接口配置具体为一个标准模块函数接口信息,记录了软件设计中各模块之间的标准 函数接口关系。
比较所述可执行程序中模块间的实际函数接口关系及标准函数接口关系,获得 所述可执行程序中模块间的函数接口变更信息;其中,具体过程为分析所述可执行程序 中模块间的实际函数接口关系与标准函数接口关系,所述分析完成后,比较出两者之间 的差异,所述的差异即为所述可执行程序中模块间的函数接口变更信息MFICI (Module Function Interface Change Information)。
请参考图5、图6、图7和图8,本申请实施例二中的获取程序中模块间函数接口的 系统,包括
静态扫描单元201,用于通过静态扫描所述可执行程序,生成内部函数静态调用 IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件;
具体来讲,所述静态扫描单元201,包括
提取单元2011,用于提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息,如函数名称、类型、地址、大小等。
分析单元2012,用于分析所述可执行程序的重定位段,生成所述外部函数调用 EFC关系文件,如分析所述重定位段中计算出代码段中需要重定位的地址, 即调用外部动态库函数的指令的地址。
扫描单元2013,用于扫描所述可执行程序的每个函数的函数代码段,获得每个函 数的函数调用指令,如扫描所述可执行程序的Symbol符号段,获取所述符号段中st_size 字段的地址。
第一生成单元2014,用于在所述函数调用指令中指定的函数调用方式为寄存器形 式时,生成所述IFDC出口清单文件;
第二生成单元2015,用于在所述函数调用指令中指定的函数调用方式为操作数形 式时,生成所述IFSC关系文件。
IFDC记录文件获得单元202,用于在运行所述可执行程序时,基于所述IFDC出口 清单文件,生成IFDC记录文件;
具体来讲,所述IFDC记录文件获得单元202,包括
第一执行单元2021,用于所述可执行程序运行时,执行所述可执行程序初始化段 内的提取动态调用关系模块的初始化代码,在所述可执行化程序加载时得到一次性运行, 以获得所述IFDC出口清单文件。
第二执行单元2022,用于执行每个函数头部内的动态调用关系模块的提取代码, 以获得每个函数的上级函数调用出口地址,如根据编译时在makefile中设置的开关,在 指定文件中所有函数的入口处添加提取动态函数调用的代码片段。
记录单元2023,用于当所述IFDC出口清单文件中存在所述调用出口地址时且所 述IFDC出口清单文件对应的目标函数列表中包括所述调用出口地址对应函数时,则记录 所述调用出口地址对应函数的IFDC信息;当所述IFDC出口清单文件中存在所述调用出口 地址时且所述IFDC出口清单文件对应的目标函数列表中不包括所述调用出口地址对应函 数时,则在为所述调用出口地址对应函数建立新的IFDC关系之后,记录所述调用出口地址 对应函数的IFDC信息;
提取单元2024,用于当所述可执行程序运行结束时,提取出每个函数的IFDC信 息,在程序目录下生成所述IFDC记录文件。
函数调用关系获得单元203,用于基于所述EFC关系文件、所述IFSC关系文件及 IFDC记录文件,获得所述可执行程序中模块间的函数调用关系表。
具体来讲,当程序运行完毕并生成了所述IFDC记录文件后,结合静态扫描程 序文件得到的所述IFSC文件与EFC文件,解析出完整的函数调用关系表FC (Function Calling)。
其中,每一条FC信息包含多种属性信息,如父函数名称、调用出口地址、目标函 数名称、调用方式、父函数对应源文件等,供进一步分析模块之间的函数接口关系。
此外,所述系统还包括函数接口变更信息获得单元,用于基于所述可执行程序中 模块间的实际函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数接 口变更信息。
所述函数接口变更信息获得单元,具体包括
第一获得单元2041,用于基于所述函数调用关系表,获得所述可执行程序中模块 间的实际函数接口关系;
具体来讲,在分析时,基于所述函数调用关系表,获得所述可执行程序中模块间的 实际函数接口关系;
其中,具体过程为所述解析出完整的函数调用关系表后,加载程序内部模块配置 表文件,将所述可执行程序内所有函数之间的调用关系转换成所有模块的函数调用关系, 在所述所有模块的函数调用关系的基础上,过滤掉所述调用出口与目标函数属于同一个模 块的模块内部调用关系,得到模块之间的实际函数接口关系。
第二获得单元2042,用于基于所述可执行程序的标准模块函数接口配置文件,获 得所述可执行程序中模块间的标准函数接口关系;
具体来讲,在分析时,基于所述可执行程序的标准模块函数接口配置文件,获得所 述可执行程序中模块间的标准函数接口关系;其中,具体过程为从模块接口设计方案中 导出,或在扫描得到的模块函数接口信息基础上进行修订得到所述可执行程序的标准模块 函数接口配置文件,所述可执行程序的标准模块函数接口配置具体为一个标准模块函数接 口信息,记录了软件设计中各模块之间的标准函数接口关系。
比较单元2043,用于比较所述可执行程序中模块间的实际函数接口关系及标准函 数接口关系,生成所述可执行程序中模块间的函数接口变更信息文件。
具体来讲,在分析时,比较所述可执行程序中模块间的实际函数接口关系及标准 函数接口关系,生成所述可执行程序中模块间的函数接口变更信息文件;其中,具体过程 为分析所述可执行程序中模块间的实际函数接口关系与标准函数接口关系,所述分析完 成后,比较出两者之间的差异,所述的差异即为所述可执行程序中模块间的函数接口变更 信息。
本申请实施例中的一个或多个技术方案,至少具有如下技术效果
一、通过在获取程序中模块间函数接口的过程中,采用了插入钩子函数,静态扫描 可执行程序的技术手段,使得在程序进行每一次内部函数调用的过程中,实现动态调用关 系容易维护的技术效果;
二、通过在获取程序中模块间函数接口的过程中,采用了将可执行程序中模块间 的实际函数接口关系与标准函数接口关系进行对比的手段,使得在获取可执行程序中模块 间的函数接口变更信息文件的过程中,实现动态调用关系适用场景不受限制的技术效果;
三、通过在获取程序中模块间函数接口的过程中,采用了提取函数的指令码,以寄 存器形式调用函数的技术手段,使得在获得内部函数动态调用出口清单的过程中,实现准 确、高效的技术效果;
四、通过在获取程序中模块间函数接口的过程中,采用了提取函数的指令码,以操 作数形式调用函数的技术手段,使得在获得内部函数静态调用关系的过程中,实现准确、高 效的技术效果。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精 神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围 之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种获取程序中模块间函数接口的方法,用于获取可执行程序中模块间函数接口,其特征在于,所述方法包括 通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件; 在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录文件; 基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述可执行程序中模块间的函数调用关系表。
2.如权利要求1所述的方法,其特征在于,在所述基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述可执行程序中模块间的函数调用关系表之后,所述方法还包括 基于所述实际函数调用关系表和模块内部函数清单,获得所述可执行程序中模块间的实际函数接口关系; 基于所述可执行程序的标准模块函数接口配置文件,获得所述可执行程序中模块间的标准函数接口关系; 比较所述可执行程序中模块间的实际函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数接口变更信息文件。
3.如权利要求1或2所述的方法,其特征在于,所述通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件,具体包括 提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息; 分析所述可执行程序的重定位段,生成所述外部函数调用EFC关系文件; 扫描所述可执行程序的每个函数的函数代码段,获得每个函数的函数调用指令;在所述函数调用指令中指定的函数调用方式为寄存器形式时,生成所述IFDC出口清单文件; 在所述函数调用指令中指定的函数调用方式为操作数形式时,生成所述IFSC关系文件。
4.如权利要求1或2所述的方法,其特征在于,所述在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录文件,具体包括 所述可执行程序运行时,执行所述可执行程序初始化段内的提取动态调用关系模块的初始化代码,以获得所述IFDC出口清单文件; 执行每个函数头部内的动态调用关系模块的提取代码,以获得每个函数的上级函数调用出口地址; 当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件对应的目标函数列表中包括所述调用出口地址对应函数时,则记录所述调用出口地址对应函数的IFDC信息; 当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件对应的目标函数列表中不包括所述调用出口地址对应函数时,则在为所述调用出口地址对应函数建立新的IFDC关系之后,记录所述调用出口地址对应函数的IFDC信息; 当所述可执行程序运行结束时,提取出每个函数的IFDC信息,在程序目录下生成所述IFDC记录文件。
5.一种获取程序中模块间函数接口的系统,用于获取可执行程序中模块间函数接口,其特征在于,所述系统包括 静态扫描单元,用于通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件; IFDC记录文件获得单元,用于在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录文件; 函数调用关系获得单元,用于基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述可执行程序中模块间的函数调用关系表。
6.如权利要求5所述的系统,其特征在于,所述系统还包括 函数接口变更信息获得单元,用于基于所述可执行程序中模块间的实际函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数接口变更信息。
7.如权利要求6所述的系统,其特征在于,所述函数接口变更信息获得单元具体包括 第一获得单元,用于基于所述函数调用关系表,获得所述可执行程序中模块间的实际函数接口关系; 第二获得单元,用于基于所述可执行程序的标准模块函数接口配置文件,获得所述可执行程序中模块间的标准函数接口关系; 比较单元,用于比较所述可执行程序中模块间的实际函数接口关系及标准函数接口关系,获得所述可执行程序中模块间的函数接口变更信息文件。
8.如权利要求5或6所述的系统,其特征在于,所述静态扫描单元,具体包括 提取单元,用于提取所述可执行程序中每个函数的用来表征每个函数特征的属性信息; 分析单元,用于分析所述可执行程序的重定位段,生成所述外部函数调用EFC关系文件; 扫描单元,用于扫描所述可执行程序的每个函数的函数代码段,获得每个函数的函数调用指令; 第一生成单元,用于在所述函数调用指令中指定的函数调用方式为寄存器形式时,生成所述IFDC出口清单文件; 第二生成单元,用于在所述函数调用指令中指定的函数调用方式为操作数形式时,生成所述IFSC关系文件。
9.如权利要求5或6所述的系统,其特征在于,所述IFDC记录文件获得单元,具体包括 第一执行单元,用于所述可执行程序运行时,执行所述可执行程序初始化段内的提取动态调用关系模块的初始化代码,以获得所述IFDC出口清单文件; 第二执行单元,用于执行每个函数头部内的动态调用关系模块的提取代码,以获得每个函数的上级函数调用出口地址; 记录单元,用于当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件对应的目标函数列表中包括所述调用出口地址对应函数时,则记录所述调用出口地址对应函数的IFDC信息;当所述IFDC出口清单文件中存在所述调用出口地址时且所述IFDC出口清单文件对应的目标函数列表中不包括所述调用出口地址对应函数时,则在为所述调用出口地址对应函数建立新的IFDC关系之后,记录所述调用出口地址对应函数的IFDC信息; 提取单元,用于当所述可执行程序运行结束时,提取出每个函数的IFDC信息,在程序目录下生成所述IFDC记录文件。
10.如权利要求5或6所述的系统,其特征在于,所述函数调用关系获得单元具体为解析单元,用于对所述EFC关系文件、所述IFSC关系文件及IFDC记录文件进行解析,获得所述可执行程序中模块间的函数调用关系表。
全文摘要
本发明公开了一种获取程序中模块间函数接口的方法和系统,其中,获取程序中模块间函数接口的方法用于实现自动对模块间函数接口进行获取,包括如下步骤通过静态扫描所述可执行程序,生成内部函数静态调用IFSC关系文件、外部函数调用EFC关系文件,及内部函数动态调用IFDC出口清单文件;在运行所述可执行程序时,基于所述IFDC出口清单文件,生成IFDC记录文件;基于所述EFC关系文件、所述IFSC关系文件及IFDC记录文件,获得所述可执行程序中模块间的函数调用关系表。
文档编号G06F9/44GK103019663SQ201110287958
公开日2013年4月3日 申请日期2011年9月26日 优先权日2011年9月26日
发明者蒋嵩 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1