CN115794122B - 函数调用链递归解除方法、装置、系统与可读存储介质 - Google Patents
函数调用链递归解除方法、装置、系统与可读存储介质 Download PDFInfo
- Publication number
- CN115794122B CN115794122B CN202310104095.0A CN202310104095A CN115794122B CN 115794122 B CN115794122 B CN 115794122B CN 202310104095 A CN202310104095 A CN 202310104095A CN 115794122 B CN115794122 B CN 115794122B
- Authority
- CN
- China
- Prior art keywords
- function
- call chain
- level
- original
- recursion
- 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
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种函数调用链递归解除方法、装置、系统与可读存储介质,该方法包括:确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链;本发明通过确定待解析软件的原始函数调用链上的递归调用链,并对递归调用链上的每个函数的原始函数层级进行更新,以解除原始函数调用链中的递归调用链的函数递归调用关系,使得原始函数调用链上的递归调用链被消除,进而防止对软件的函数调用链进行软件成分分析时出现函数递归的情况。
Description
技术领域
本发明涉及软件安全技术领域,尤其涉及函数调用链递归解除方法、装置、系统与可读存储介质。
背景技术
在如今的软件开发过程中,第三方库的大规模使用减少了软件的开发成本,缩短了软件的开发周期,能让开发者专注于功能开发,由于第三方库的大规模使用给软件带来侵犯许可协议、安全漏洞等隐患,因此需要通过SCA(Software Composition Analysis)软件成分分析对开发的软件的二进制文件、源码等进行解析,解析得到软件检测成分进而确定软件是否存在隐患;但是,在对软件进行软件成分分析时,通常通过软件的函数调用链来进行检测,而通过软件调用链的检测时会出现函数递归的情况,这样会导致软件成分分析进入死循环,无法正常对软件成分进行解析。
因此,如何防止对软件的函数调用链进行软件成分分析时出现函数递归的情况,是急需解决的问题。
发明内容
本发明的主要目的在于提出一种函数调用链递归解除方法、装置、系统与可读存储介质,旨在解决如何防止对软件的函数调用链进行软件成分分析时出现函数递归的情况问题。
为实现上述目的,本发明提供一种函数调用链递归解除方法,所述函数调用链递归解除方法包括如下步骤:
确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
可选地,确定待解析软件的原始函数调用链的步骤包括:
获取并扫描待解析软件的软件代码,确定所述软件代码中的函数集合和函数调用关系;
根据所述函数调用关系,确定所述函数集合中的每个函数对应的被调用函数和/或调用者函数;
根据所述被调用函数和所述调用者函数,确定所述待解析软件的原始函数调用链。
可选地,判断所述原始函数调用链上是否存在递归调用链的步骤包括:
获取所述原始函数调用链上不存在所述被调用函数的函数或不存在所述调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链。
可选地,对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级的步骤包括:
获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
可选地,基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级的步骤包括:
根据所述原始函数调用链上的第二最大原始函数层级和所述原始函数调用链对应的函数调用关系,依次更新所述原始函数调用链上的每个函数的函数层级;
基于更新后的每个函数的函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
可选地,根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链的步骤包括:
将所述递归调用链上的每个函数对应的所述第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;
解除所述递归调用链上的所述最小第一目标函数层级对应的函数和所述最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
可选地,得到目标函数调用链的步骤之后,包括:
将所述最小第一目标函数层级与预设最小函数层级进行对比;
若确定所述最小第一目标函数层级不等于所述预设最小函数层级,则计算所述最小第一目标函数层级和所述预设最小函数层级的层级差值,并根据所述层级差值,确定所述目标函数调用链上每个函数对应的第二目标函数层级。
此外,为实现上述目的,本发明还提供一种函数调用链递归解除装置,所述函数调用链递归解除装置包括:
判断模块,用于确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
解除模块,用于若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
进一步地,所述判断模块还包括确定模块,所述确定模块用于:
获取并扫描待解析软件的软件代码,确定所述软件代码中的函数集合和函数调用关系;
根据所述函数调用关系,确定所述函数集合中的每个函数对应的被调用函数和/或调用者函数;
根据所述被调用函数和所述调用者函数,确定所述待解析软件的原始函数调用链。
进一步地,所述判断模块还用于:
获取所述原始函数调用链上不存在所述被调用函数的函数或不存在所述调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链。
进一步地,所述解除模块还包括更新模块,所述更新模块还用于:
获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
进一步地,所述更新模块还用于:
根据所述原始函数调用链上的第二最大原始函数层级和所述原始函数调用链对应的函数调用关系,依次更新所述原始函数调用链上的每个函数的函数层级;
基于更新后的每个函数的函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
进一步地,所述解除模块还用于:
将所述递归调用链上的每个函数对应的所述第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;
解除所述递归调用链上的所述最小第一目标函数层级对应的函数和所述最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
进一步地,所述解除模块还包括确定模块,所述确定模块用于:
将所述最小第一目标函数层级与预设最小函数层级进行对比;
若确定所述最小第一目标函数层级不等于所述预设最小函数层级,则计算所述最小第一目标函数层级和所述预设最小函数层级的层级差值,并根据所述层级差值,确定所述目标函数调用链上每个函数对应的第二目标函数层级。
此外,为实现上述目的,本发明还提供一种函数调用链递归解除系统,所述函数调用链递归解除系统包括:存储器、处理器及储存在所述存储器上并可在所述处理器上运行的函数调用链递归解除程序,所述函数调用链递归解除程序被所述处理器执行时实现如上所述的函数调用链递归解除方法的步骤。
此外,为实现上述目的,本发明还提供一种可读存储介质,所述可读储存介质为计算机可读存储介质,所述可读储存介质上储存有函数调用链递归解除程序,所述函数调用链递归解除程序被处理器执行时实现如上所述的函数调用链递归解除方法的步骤。
本发明提出的函数调用链递归解除方法,确定待解析软件的原始函数调用链,并判断原始函数调用链上是否存在递归调用链;若存在,则对递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据第一目标函数层级解除原始函数调用链中的函数递归调用关系,得到目标函数调用链;本发明通过确定待解析软件的原始函数调用链上的递归调用链,并对递归调用链上的每个函数的原始函数层级进行更新,以解除原始函数调用链中的递归调用链的函数递归调用关系,使得原始函数调用链上的递归调用链被消除,进而防止对软件的函数调用链进行软件成分分析时出现函数递归的情况。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明函数调用链递归解除方法第一实施例的流程示意图;
图3为本发明待解析软件的原始函数调用链示意图;
图4为本发明原始函数调用链以及每个函数的原始函数层级示意图;
图5为本发明原始函数调用链以及每个函数的更改后的原始函数层级示意图;
图6为本发明原始函数调用链以及每个函数的第一目标函数层级示意图;
图7为本发明目标函数调用链示意图;
图8为本发明函数调用链递归解除方法第一实施例的流程示意图;
图9为本发明目标函数调用链以及每个函数的第二目标函数层级示意图;
图10为本发明目标函数调用链以及每个函数的另一种第二目标函数层级示意图。
本发明目的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例设备可以是PC机或服务器设备。
如图1所示,该设备可以包括:处理器1001,例如CPU,网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的储存装置。
本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机储存介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及函数调用链递归解除程序。
其中,操作系统是管理和控制便携储存设备与软件资源的程序,支持网络通信模块、用户接口模块、函数调用链递归解除程序以及其他程序或软件的运行;网络通信模块用于管理和控制网络接口1002;用户接口模块用于管理和控制用户接口1003。
在图1所示的储存设备中,所述储存设备通过处理器1001调用存储器1005中储存的函数调用链递归解除程序,并执行下述函数调用链递归解除方法各个实施例中的操作。
基于上述硬件结构,提出本发明函数调用链递归解除方法实施例。
参照图2,图2为本发明函数调用链递归解除方法第一实施例的流程示意图,本实施例函数调用链递归解除方法运用于函数调用链递归解除系统中,该函数调用链递归解除系统可应用在pc设备、移动终端和其他智能终端上;为描述方便,以函数调用链递归解除系统为例进行描述,所述方法包括:
步骤S10,确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
在本实施例中,函数调用链递归解除系统先确定待解析软件,对待解析软件的软件代码进行扫描,确定待解析软件的原始函数调用链,并判断原始函数调用链上是否存在递归调用链;需要说明的是,“函数”对应的单词为“function”,意味“功能”,因此,函数调用链即是指函数相互调用形成的链条关系,“功能”的概念几乎适用于任何编程语言,因此“调用链”的概念也不限于编程语言、源码和二进制代码;递归调用链是指单个或多个函数之间循环调用形成的链条关系,即递归调用链包括单函数递归调用链和多函数递归调用链,单函数递归调用链即为某个函数调用自身,如:函数fun1调用的函数也是fun1;多函数递归调用链即为多个函数之间形成一个循环的调用关系,如:函数fun1调用函数fun2,函数fun2调用的函数fun3,函数fun3调用函数fun1,这样函数fun1、fun2和fun3之间形成的是多函数递归调用链。
具体地,确定待解析软件的原始函数调用链的步骤包括:
步骤S101,获取并扫描待解析软件的软件代码,确定所述软件代码中的函数集合和函数调用关系;
在该步骤中,函数调用链递归解除系统在确定待解析软件后,获取并扫描待解析软件的软件代码,软件代码包括待解析软件的二进制文件、源码等,确定软件代码中的函数集合和函数调用关系;如:待解析软件的软件代码如下:
#include"stdio.h"
void fun3(int);
void fun1( int n )
{
fun3(n-2 );
}
void fun2( int n )
{
fun1(n-1 );
}
void fun3( int n )
{
if(n<=0 )
return;
printf("n=%d\n",n );
fun2(n-1 );
}
int main( void )
{
fun3(50);
}
函数调用链递归解除系统对软件代码进行扫描,确定函数集合为:main、fun1、fun2、fun3和printf,函数调用关系为:main调用fun3、fun3调用fun2和printf、fun2调用fun1、fun1调用fun3、printf没有调用任何函数。
步骤S102,根据所述函数调用关系,确定所述函数集合中的每个函数对应的被调用函数和/或调用者函数;
在该步骤中,函数调用链递归解除系统根据函数调用关系,确定函数集合中的每个函数对应的被调用函数和/或调用者函数;需要说明的是,被调用函数是指某个函数调用的函数,调用者函数是指调用某个函数的函数,软件代码中的每个函数通常都会具有被调用函数和调用者函数,但是对于软件代码上开头的函数不具有调用者函数,对于软件代码上结尾的函数不具有被调用函数;沿用上述例子,函数调用链递归解除系统确定函数调用关系为:main调用fun3、fun3调用fun2和printf、fun2调用fun1、fun1调用fun3、printf没有调用任何函数,因此可确定,main不具有调用者函数,main对应的被调用函数为fun3,fun3的调用者函数为main和fun1,fun3的被调用函数为fun2和printf,fun2的调用者函数为fun3,fun2的被调用函数为fun1,fun1的调用者函数为fun2,fun1的被调用函数为fun3,printf的调用者函数为fun3,printf不具有被调用函数。
步骤S103,根据所述被调用函数和所述调用者函数,确定所述待解析软件的原始函数调用链。
在该步骤中,函数调用链递归解除系统根据待解析软件的软件代码对应的函数集合中每个函数的被调用函数和调用者函数,确定待解析软件的原始函数调用链。沿用上述例子,函数调用链递归解除系统根据main不具有调用者函数,main对应的被调用函数为fun3,fun3的调用者函数为main和fun1,fun3的被调用函数为fun2和printf,fun2的调用者函数为fun3,fun2的被调用函数为fun1,fun1的调用者函数为fun2,fun1的被调用函数为fun3,printf的调用者函数为fun3,printf不具有被调用函数,确定待解析软件的原始函数调用链如图3所示。
具体地,在步骤S101至步骤S103中,沿用上述例子,函数调用链递归解除系统对待解析软件的软件代码进行扫描后,生成如下表格:
其中,函数信息:采用每个函数的函数名作为“函数信息”,每个函数信息唯一,因此,一个函数名如已采集过,就不再采集。函数名称只是用于标记函数的信息的一种,在二进制代码中,可能没有函数名,那么代表一个函数的可能就是一个地址。
序号:给每个函数标记的id,也就是用数字代表一个“函数信息”,这样会比用函数名称或地址拥有更快的计算速度和更少的空间消耗。
调用者函数序号:调用某个函数的函数的id,比如函数fun1,调用它的函数是fun2,fun2序号为3,因此fun1对应的调用者函数序号标记“3”。
被调用函数:扫描代码过程中,检测到每个函数调用的函数,放入此列,如fun1调用了fun3,fun3调用了printf、和fun2。例外的是,printf是外部函数库中实现的函数,因此printf不具有被调用函数,因此printf对应的“被调用函数”一列为空。如果“函数信息”列的是函数地址,那么“调用函数”的也应是函数地址。
被调用函数序号:被某个函数调用的函数的id。
需要说明的是,该表格是用于说明的一种展示形式,而在函数调用链递归解除系统中,该表格可以是以结构体、数组、类、字典等形式存储的。
函数调用链递归解除系统根据结构体、数组、类、字典等形式存储的上述表格中的数据和信息,确定待解析软件对应的原始函数调用链。
具体地,判断所述原始函数调用链上是否存在递归调用链的步骤包括:
步骤S104,获取所述原始函数调用链上不存在所述被调用函数的函数或不存在所述调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
在该步骤中,函数调用链递归解除系统在确定待解析软件的原始函数调用链后,获取原始函数调用链上不存在被调用函数的函数或不存在调用者函数的函数,并将不存在被调用函数的函数的原始函数层级或不存在调用者函数的函数的原始函数层级设定为初始层级;沿用上述例子,函数调用链递归解除系统可确定原始函数调用链上不存在被调用函数的函数为printf,将printf的原始函数层级设定为初始层级,也即printf的原始函数层级为1;或者,函数调用链递归解除系统可确定原始函数调用链上不存在调用者函数的函数为main,将main的原始函数层级设定为初始层级,也即main的原始函数层级为-1。
步骤S105,根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
在该步骤中,函数调用链递归解除系统以初始层级的函数为出发点,并根据原始函数调用链上的每个函数的调用者函数,沿着原始函数调用链进行遍历,确定原始函数调用链上的每个函数的原始函数层级;或者,函数调用链递归解除系统以初始层级的函数为出发点,并根据原始函数调用链上的每个函数的被调用函数,沿着原始函数调用链进行遍历,确定原始函数调用链上的每个函数的原始函数层级;如:沿用上述例子,原始函数调用链如图3所示,函数调用链递归解除系统原始函数调用链上不存在被调用函数的函数为printf,将printf的原始函数层级设定为初始层级,也即printf的原始函数层级为1,printf的调用者函数为fun3,设定fun3的原始函数层级为2,fun3的调用者函数为main和fun1,设定main和fun1的原始函数层级为3,main不具有调用者函数,fun1的调用者函数为fun2,设定fun2的原始函数层级为4,由于fun2的调用者函数为fun3,fun3的原始函数层级应被重新设定为5,但是fun3的原始函数层级已经被设定,因此不需要改变,至此,所有的函数对应的原始函数层级都确定了。同理,沿用上述例子,原始函数调用链如图3所示,函数调用链递归解除系统原始函数调用链上不存在调用者函数的函数为main,将main的原始函数层级设定为初始层级,也即main的原始函数层级为-1,main对应的被调用函数为fun3,设定fun3的原始函数层级为-2,fun3对应的被调用函数为fun2和printf,设定fun2和printf的原始函数层级为-3,printf不具有被调用函数,fun2的被调用函数为fun1,设定fun1的原始函数层级为-4,再对原始函数层级进行整理,确定printf的原始函数层级为1,fun3的原始函数层级为2,main和fun1的原始函数层级为3,fun2的原始函数层级为4。具体的原始函数调用链以及每个函数的原始函数层级如图4所示。
可以理解的是,函数调用链递归解除系统确定每个函数是原始函数层级后,存储在以结构体、数组、类、字典等形式存储的表格中,得到:
步骤S106,根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链。
在该步骤中,函数调用链递归解除系统在确定原始函数调用链中每个函数的原始函数层级后,根据原始函数层级和调用者函数,判断原始函数调用链上是否存在递归调用链;具体地,沿用上述例子,函数调用链递归解除系统根据原始函数层级和调用者函数,从低层到高层遍历原始函数调用链,从printf出发,printf序号为4,通过printf的调用者函数找到fun3,并传递调用链"4";fun3的序号是2,通过fun3的调用者函数找到fun1和main,并传递调用链"4,2";fun1的序号是1,通过fun1的调用者函数找到fun2,传递调用链"4,2,1";fun2的序号是3,通过fun2的调用者函数找到fun3,传递调用链"4,2,1,3";fun3的序号是2,由于传递调用链"4,2,1,3"中存在2,即fun3,判定为检查到递归调用链,根据调用链信息,是从2开始重复,因此存在递归调用链2,1,3,即函数fun3、fun1、fun2三个函数相互递归。
步骤S20,若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
在本实施例中,函数调用链递归解除系统若确定原始函数调用链上存在递归调用链,则对递归调用链上的每个函数的原始函数层级进行更新,得到递归调用链上的第一目标函数层级,并根据第一目标函数层级解除原始函数调用链中的函数递归调用关系,得到目标函数调用链。
具体地,对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级的步骤包括:
步骤S201,获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
在该步骤中,函数调用链递归解除系统获取递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;如:沿用上述例子,递归调用链为fun3、fun1、fun2,其中fun3的原始函数层级为2,fun1的原始函数层级为3,fun2的原始函数层级为4,将fun3、fun1、fun2的原始函数层级进行对比,确定第一最大原始函数层级为4.
步骤S202,将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
在该步骤中,函数调用链递归解除系统将递归调用链上的每个函数的原始函数层级更改为第一最大原始函数层级,并基于原始函数调用链上的第二最大原始函数层级,确定递归调用链上的每个函数的第一目标函数层级;如:沿用上述例子,将递归调用链上的fun3、fun1、fun2对应的原始函数层级都更改为4,此时,根据fun3的调用者函数找到main,由于fun3的原始函数层级更改为4,因此main的原始函数层级需要被更改为5,此时原始函数调用链上的第二最大原始函数层级为5,以第二最大原始函数层级5的函数为出发点,对原始函数调用链进行遍历,确定递归调用链上的每个函数的第一目标函数层级。具体的原始函数调用链以及每个函数的更改后的原始函数层级如图5所示。
进一步地,步骤S202包括:
步骤S2021,根据所述原始函数调用链上的第二最大原始函数层级和所述原始函数调用链对应的函数调用关系,依次更新所述原始函数调用链上的每个函数的函数层级;
步骤S2022,基于更新后的每个函数的函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
在步骤S2021至步骤S2022中,函数调用链递归解除系统根据原始函数调用链上的第二最大原始函数层级和原始函数调用链对应的函数调用关系,依次更新原始函数调用链上的每个函数的函数层级,基于更新后的每个函数的函数层级,确定递归调用链上的每个函数的第一目标函数层级;如:沿用上述例子,函数调用链递归解除系统将以第二最大原始函数层级5的函数为出发点,并基于每个函数的被调用函数,对原始函数调用链进行遍历,确定fun3的第一目标函数层级为4,确定fun2的第一目标函数层级为3,确定fun1的第一目标函数层级为2。具体的原始函数调用链以及每个函数的第一目标函数层级如图6所示。
具体地,根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链的步骤包括:
步骤S203,将所述递归调用链上的每个函数对应的所述第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;
在该步骤中,函数调用链递归解除系统在确定递归调用链上每个函数的第一目标函数层级后,将递归调用链上的每个函数对应的第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;如:沿用上述例子,如图6所示,递归调用链上的fun3的第一目标函数层级为4,fun2的第一目标函数层级为3,fun1的第一目标函数层级为2,将三个函数的第一目标函数层级进行对比,确定最小第一目标函数层级为2,最大第一目标函数层级为4。
步骤S204,解除所述递归调用链上的所述最小第一目标函数层级对应的函数和所述最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
在该步骤中,函数调用链递归解除系统解除递归调用链上的最小第一目标函数层级对应的函数和最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除原始函数调用链中的函数递归调用关系,得到目标函数调用链;可以理解的是,一般来说,正是由于最小第一目标函数层级对应的函数和最大第一目标函数层级对应的函数之间的函数递归调用关系,导致原始函数调用链中存在递归调用链,解除该调用关系后,原始函数调用链中不存在递归调用链,进而得到目标函数调用链。如:沿用上述例子,函数调用链递归解除系统将fun1和fun3之间的函数递归调用关系解除,得到如图7所示的目标函数调用链。
本实施例的函数调用链递归解除系统确定待解析软件的原始函数调用链,并判断原始函数调用链上是否存在递归调用链;若存在,则对递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据第一目标函数层级解除原始函数调用链中的函数递归调用关系,得到目标函数调用链;通过确定待解析软件的原始函数调用链上的递归调用链,并对递归调用链上的每个函数的原始函数层级进行更新,以解除原始函数调用链中的递归调用链的函数递归调用关系,使得原始函数调用链上的递归调用链被消除,进而防止对软件的函数调用链进行软件成分分析时出现函数递归的情况。
进一步地,参考图8,基于本发明函数调用链递归解除方法第一实施例,提出本发明函数调用链递归解除方法第二实施例。
函数调用链递归解除方法的第二实施例与函数调用链递归解除方法的第一实施例的区别在于,在得到目标函数调用链的步骤之后,包括:
步骤S30,将所述最小第一目标函数层级与预设最小函数层级进行对比;
步骤S40,若确定所述最小第一目标函数层级不等于所述预设最小函数层级,则计算所述最小第一目标函数层级和所述预设最小函数层级的层级差值,并根据所述层级差值,确定所述目标函数调用链上每个函数对应的第二目标函数层级。
在本实施例中,函数调用链递归解除系统将目标函数调用链中的最小第一目标函数层级与预设最小函数层级进行对比,若确定最小第一目标函数层级等于预设最小函数层级,则不需要修改目标函数调用链的第一目标函数层级;若确定最小第一目标函数层级不等于预设最小函数层级,则计算最小第一目标函数层级和预设最小函数层级的层级差值,并根据层级差值,修改目标函数调用链的第一目标函数层级,确定目标函数调用链上每个函数对应的第二目标函数层级。如:沿用上述例子,如图7所示,目标函数调用链中最小第一目标函数层级为2,预设最小函数层级通常为1,此时确定最小第一目标函数层级不等于预设最小函数层级,并计算出最小第一目标函数层级和预设最小函数层级的层级差值为1,将目标函数调用链上每个函数对应的第一目标函数层级都减去1,得到目标函数调用链上每个函数对应的第二目标函数层级,具体地目标函数调用链以及每个函数的第二目标函数层级如图9所示。
可选地,函数调用链递归解除系统直接确定目标函数调用链中不存在被调用函数的函数,将不存在被调用函数的函数的第二目标函数层级设定为1,再基于每个函数的调用关系,依次确定目标函数调用链中其他函数的第二目标函数层级,具体的目标函数调用链以及每个函数的另一种第二目标函数层级如图10所示。
本实施例中函数调用链递归解除系统将最小第一目标函数层级与预设最小函数层级进行对比;若确定最小第一目标函数层级不等于预设最小函数层级,则计算最小第一目标函数层级和预设最小函数层级的层级差值,并根据层级差值,确定目标函数调用链上每个函数对应的第二目标函数层级,使得目标函数调用链上的每个函数的函数层级符合要求,便于后续对软件的函数调用链进行软件成分分析。
本发明还提供一种函数调用链递归解除装置。本发明函数调用链递归解除装置包括:
判断模块,用于确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
解除模块,用于若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
进一步地,所述判断模块还包括确定模块,所述确定模块用于:
获取并扫描待解析软件的软件代码,确定所述软件代码中的函数集合和函数调用关系;
根据所述函数调用关系,确定所述函数集合中的每个函数对应的被调用函数和/或调用者函数;
根据所述被调用函数和所述调用者函数,确定所述待解析软件的原始函数调用链。
进一步地,所述判断模块还用于:
获取所述原始函数调用链上不存在所述被调用函数的函数或不存在所述调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链。
进一步地,所述解除模块还包括更新模块,所述更新模块还用于:
获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
进一步地,所述更新模块还用于:
根据所述原始函数调用链上的第二最大原始函数层级和所述原始函数调用链对应的函数调用关系,依次更新所述原始函数调用链上的每个函数的函数层级;
基于更新后的每个函数的函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
进一步地,所述解除模块还用于:
将所述递归调用链上的每个函数对应的所述第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;
解除所述递归调用链上的所述最小第一目标函数层级对应的函数和所述最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
进一步地,所述解除模块还包括确定模块,所述确定模块用于:
将所述最小第一目标函数层级与预设最小函数层级进行对比;
若确定所述最小第一目标函数层级不等于所述预设最小函数层级,则计算所述最小第一目标函数层级和所述预设最小函数层级的层级差值,并根据所述层级差值,确定所述目标函数调用链上每个函数对应的第二目标函数层级。
本发明还提供一种函数调用链递归解除系统。
函数调用链递归解除系统包括:存储器、处理器及储存在所述存储器上并可在所述处理器上运行的函数调用链递归解除程序,所述函数调用链递归解除程序被所述处理器执行时实现如上所述的函数调用链递归解除方法的步骤。
其中,在所述处理器上运行的函数调用链递归解除程序被执行时所实现的方法可参照本发明函数调用链递归解除方法各个实施例,此处不再赘述。
本发明还提供一种可读存储介质。
该可读存储介质上储存有函数调用链递归解除程序,所述函数调用链递归解除程序被处理器执行时实现如上所述的函数调用链递归解除方法的步骤。
其中,在所述处理器上运行的函数调用链递归解除程序被执行时所实现的方法可参照本发明函数调用链递归解除方法各个实施例,此处不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品储存在如上所述的一个储存介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书与附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (8)
1.一种函数调用链递归解除方法,其特征在于,所述函数调用链递归解除方法包括如下步骤:
确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链;
其中,所述判断所述原始函数调用链上是否存在递归调用链的步骤包括:
获取所述原始函数调用链上不存在被调用函数的函数或不存在调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链;
其中,所述对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级的步骤包括:
获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
2.如权利要求1所述的函数调用链递归解除方法,其特征在于,所述确定待解析软件的原始函数调用链的步骤包括:
获取并扫描待解析软件的软件代码,确定所述软件代码中的函数集合和函数调用关系;
根据所述函数调用关系,确定所述函数集合中的每个函数对应的被调用函数和/或调用者函数;
根据所述被调用函数和所述调用者函数,确定所述待解析软件的原始函数调用链。
3.如权利要求1中所述的函数调用链递归解除方法,其特征在于,所述基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级的步骤包括:
根据所述原始函数调用链上的第二最大原始函数层级和所述原始函数调用链对应的函数调用关系,依次更新所述原始函数调用链上的每个函数的函数层级;
基于更新后的每个函数的函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
4.如权利要求1中所述的函数调用链递归解除方法,其特征在于,所述根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链的步骤包括:
将所述递归调用链上的每个函数对应的所述第一目标函数层级进行对比,确定最小第一目标函数层级和最大第一目标函数层级;
解除所述递归调用链上的所述最小第一目标函数层级对应的函数和所述最大第一目标函数层级对应的函数之间的函数递归调用关系,以解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链。
5.如权利要求4所述的函数调用链递归解除方法,其特征在于,所述得到目标函数调用链的步骤之后,包括:
将所述最小第一目标函数层级与预设最小函数层级进行对比;
若确定所述最小第一目标函数层级不等于所述预设最小函数层级,则计算所述最小第一目标函数层级和所述预设最小函数层级的层级差值,并根据所述层级差值,确定所述目标函数调用链上每个函数对应的第二目标函数层级。
6.一种函数调用链递归解除装置,其特征在于,所述函数调用链递归解除装置包括:
判断模块,用于确定待解析软件的原始函数调用链,并判断所述原始函数调用链上是否存在递归调用链;
解除模块,用于若存在,则对所述递归调用链上的每个函数的原始函数层级进行更新,得到第一目标函数层级,并根据所述第一目标函数层级解除所述原始函数调用链中的函数递归调用关系,得到目标函数调用链;
所述判断模块,还用于获取所述原始函数调用链上不存在被调用函数的函数或不存在调用者函数的函数,并将不存在所述被调用函数的函数或不存在所述调用者函数的函数设定为初始层级;
根据所述初始层级以及所述被调用函数,或所述初始层级以及所述调用者函数,确定所述原始函数调用链上的每个函数的原始函数层级;
根据所述原始函数层级和所述调用者函数,判断所述原始函数调用链上是否存在递归调用链;
所述解除模块,还用于获取所述递归调用链上的每个函数的原始函数层级,并将每个函数的原始函数层级进行对比,确定第一最大原始函数层级;
将每个函数的原始函数层级更改为所述第一最大原始函数层级,并基于所述原始函数调用链上的第二最大原始函数层级,确定所述递归调用链上的每个函数的第一目标函数层级。
7.一种函数调用链递归解除系统,其特征在于,所述函数调用链递归解除系统包括:存储器、处理器及储存在所述存储器上并可在所述处理器上运行的函数调用链递归解除程序,所述函数调用链递归解除程序被所述处理器执行时实现如权利要求1至5中任一项所述的函数调用链递归解除方法的步骤。
8.一种可读存储介质,其特征在于,所述可读存储介质上储存有函数调用链递归解除程序,所述函数调用链递归解除程序被处理器执行时实现如权利要求1至5中任一项所述的函数调用链递归解除方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310104095.0A CN115794122B (zh) | 2023-02-13 | 2023-02-13 | 函数调用链递归解除方法、装置、系统与可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310104095.0A CN115794122B (zh) | 2023-02-13 | 2023-02-13 | 函数调用链递归解除方法、装置、系统与可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115794122A CN115794122A (zh) | 2023-03-14 |
CN115794122B true CN115794122B (zh) | 2023-06-02 |
Family
ID=85430973
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310104095.0A Active CN115794122B (zh) | 2023-02-13 | 2023-02-13 | 函数调用链递归解除方法、装置、系统与可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115794122B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116841622B (zh) * | 2023-09-01 | 2023-11-24 | 上海燧原智能科技有限公司 | 一种地址自增访存指令的生成方法、装置、设备及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407968A (zh) * | 2014-10-30 | 2015-03-11 | 北京控制工程研究所 | 一种通过静态分析测算代码指令最长运行时间的方法 |
CN108089841A (zh) * | 2016-11-17 | 2018-05-29 | 北京仿真中心 | 一种基于相关关系的软件需求优先级设定方法 |
CN111523784A (zh) * | 2020-04-16 | 2020-08-11 | 广州拉卡拉信息技术有限公司 | 自动执行路径的监控方法及装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104899147B (zh) * | 2015-06-19 | 2017-11-28 | 北京理工大学 | 一种面向安全检查的代码静态分析方法 |
CN111858123B (zh) * | 2020-07-29 | 2023-09-26 | 中国工商银行股份有限公司 | 基于有向图网络的故障根因分析方法和装置 |
CN115129936A (zh) * | 2021-03-24 | 2022-09-30 | 北京金山云网络技术有限公司 | 有向图生成方法、装置、电子设备和计算机可读介质 |
CN112947896B (zh) * | 2021-03-26 | 2023-10-27 | 中国航空无线电电子研究所 | 一种基于有向图的组件依赖分析方法 |
-
2023
- 2023-02-13 CN CN202310104095.0A patent/CN115794122B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407968A (zh) * | 2014-10-30 | 2015-03-11 | 北京控制工程研究所 | 一种通过静态分析测算代码指令最长运行时间的方法 |
CN108089841A (zh) * | 2016-11-17 | 2018-05-29 | 北京仿真中心 | 一种基于相关关系的软件需求优先级设定方法 |
CN111523784A (zh) * | 2020-04-16 | 2020-08-11 | 广州拉卡拉信息技术有限公司 | 自动执行路径的监控方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN115794122A (zh) | 2023-03-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111026797A (zh) | 业务数据处理方法、服务器及存储介质 | |
CN115794122B (zh) | 函数调用链递归解除方法、装置、系统与可读存储介质 | |
US20060168376A1 (en) | Usage of keyboard driver in extensible firmware interface for adding new hot keys at firmware level | |
CN112817657B (zh) | 一种应用程序启动项加载方法、装置、系统及存储介质 | |
CN108415998B (zh) | 应用依赖关系更新方法、终端、设备及存储介质 | |
CN112612502A (zh) | 补丁生成方法、装置、设备及存储介质 | |
CN108984223B (zh) | 一种程序调用解耦方法、装置、电子设备及存储介质 | |
CN110941443B (zh) | 修改sdk中文件名的方法、装置及电子设备 | |
CN110442353B (zh) | 一种安装包管理的方法、装置及电子设备 | |
CN115794214A (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
CN115080984A (zh) | 第三方库文件漏洞检测方法、装置、电子设备及存储介质 | |
CN115795193A (zh) | 页面数据提取方法、页面自动化测试方法 | |
CN111488569B (zh) | 一种权限确定、管理方法、装置、设备及介质 | |
CN112799703A (zh) | 资源文件的处理方法、装置、客户端及存储介质 | |
CN110309000B (zh) | 应用更新提示方法及终端设备 | |
CN113126982A (zh) | 一种应用程序生成、运行方法及装置 | |
CN112130860A (zh) | Json对象解析方法、装置、电子设备及存储介质 | |
CN112114864A (zh) | cocoapods代码拉取优化方法及系统 | |
CN111736847B (zh) | 脚本语言映射方法、电子设备及可读存储介质 | |
CN110719274A (zh) | 网络安全控制方法、装置、设备及存储介质 | |
CN111428234A (zh) | 应用程序的进程拦截方法、终端及存储介质 | |
CN111045657B (zh) | 程序代码的运行方法和运行装置以及编译方法和编译装置 | |
CN115543403B (zh) | 一种系统升级方法及装置 | |
CN114816558B (zh) | 一种脚本注入方法、设备及计算机可读存储介质 | |
US11893120B1 (en) | Apparatus and method for efficient vulnerability detection in dependency trees |
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 |