一种栈安全检测方法与系统的制作方法

文档序号:6636011阅读:123来源:国知局
一种栈安全检测方法与系统的制作方法
【专利摘要】本发明提供一种栈安全检测方法及系统。栈安全检测方法包括:加载可执行文件;以所述可执行文件的入口函数为起点获取可执行文件的函数调用树,并判断是否存在函数环路调用;当可执行文件的函数调用树中存在所述函数环路调用时,标识可执行文件存在函数环路调用。栈安全检测系统包括:可执行文件加载模块,用于加载待分析的可执行文件;函数调用分析模块,与可执行文件加载模块相连,用于以所述可执行文件的入口函数为起点获取可执行文件的函数调用树,并判断所述函数调用树中是否存在函数调用环路;当可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。本发明的技术方案用于系统任务栈溢出问题的定位分析。
【专利说明】一种栈安全检测方法与系统

【技术领域】
[0001]本发明涉及一种计算机【技术领域】,特别是涉及一种栈安全检测方法与系统。

【背景技术】
[0002]在计算机科学领域中,’调用栈’(Call Stack)是用于存储子程序信息的一类栈,别称执行栈(execut1n stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),在英语中亦经常简称为“栈”(“the stack”)。调用栈的维护对多数软件的正常运转有着重要意义,但一般高级语言都会隐藏其细节并自动进行维护。
[0003]嵌入式系统中每一个任务的栈空间都很小,在系统运行过程中很容易产生任务栈溢出导致系统复位,影响系统的稳定性。系统运行过程中一个任务的栈溢出通常由两个原因引起:一是调用的函数层次过深或者调用的函数申请的栈空间太大。二是函数调用环路,如递归调用。以上两个原因以第二个原因导致系统复位更为常见,因此在嵌入式系统的开发过程中都会尽量避免直接或者间接的函数递归调用。
[0004]鉴于此,为了确定或避免函数调用环路引发栈溢出问题,如何对系统加载运行的映像文件进行函数调用环路检测成为了本领域技术人员亟待解决的问题。


【发明内容】

[0005]鉴于以上所述现有技术的缺点,本发明的目的在于提供一种栈安全检测方法及系统,用于解决现有技术中运行映像文件出现函数调用环路而引发的栈溢出难以定位的问题。
[0006]为实现上述目的及其他相关目的,本发明提供一种栈安全检测方法,所述栈安全检测方法包括:加载可执行文件;以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断是否存在函数环路调用;当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。
[0007]可选地,所述获取所述可执行文件的函数调用树的具体实现包括:以所述可执行文件的入口函数为起点,通过反汇编分析方法递归获取所述可执行文件中的一个函数所调用的所有子函数,以获取函数调用树。
[0008]可选地,所述反汇编分析方法与所述可执行文件的机器语言一一对应。
[0009]可选地,所述判断是否存在函数环路调用的具体实现为:检测函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。
[0010]可选地,所述可执行文件包括嵌入式系统中的映像文件。
[0011]本发明还提供一种栈安全检测系统,所述栈安全检测系统包括:可执行文件加载模块,用于加载待分析的可执行文件;函数调用分析模块,与所述可执行文件加载模块相连,用于以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断所述函数调用树中是否存在函数调用环路;当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。
[0012]可选地,所述函数调用分析模块包括反汇编单元,所述反汇编单元用于获取所述可执行文件的一个函数所调用的所有子函数;所述调用分析函数通过所述反汇编单元获取所述可执行文件的函数调用树。
[0013]可选地,所述反汇编单元与所述可执行文件的机器语言一一对应。
[0014]可选地,所述判断是否存在函数环路调用的具体实现为:检测函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。
[0015]可选地,所述可执行文件包括嵌入式系统中的映像文件。
[0016]如上所述,本发明的一种栈安全检测方法及系统,具有以下有益效果:通过一种简单且容易实现的技术方案,运用反汇编手段分析系统的可加载映像文件,检测出任务中存在的环路调用点,为系统任务栈使用或者任务栈溢出问题的定位分析提供有效的数据,可以加快相关问题的定位。

【专利附图】

【附图说明】
[0017]图1显示为本发明的一种栈安全检测方法的一实施例的方法示意图。
[0018]图2显示为本发明的一种栈安全检测方法的一实施例的方法步骤示意图。
[0019]图3显示为本发明的一种栈安全检测方法的一实施例的方法步骤示意图。
[0020]图4显示为本发明的一种栈安全检测方法的一实施例的方法步骤示意图。
[0021]图5显示为本发明的一种栈安全检测方法的一实施例的方法步骤示意图。
[0022]图6显示为本发明的一种栈安全检测系统的一实施例的模块示意图。
[0023]元件标号说明
[0024]I栈安全检测系统
[0025]11可执行文件加载模块
[0026]12函数调用分析模块
[0027]SI ?S3 步骤

【具体实施方式】
[0028]以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的【具体实施方式】加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
[0029]需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0030]本发明提供一种栈安全检测方法。在一个实施例中,如图1所示,所述栈安全检测方法包括:
[0031 ] 步骤SI,加载可执行文件。在一个实施例中,所述可执行文件为嵌入式系统中的映像文件。
[0032]步骤S2,以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断是否存在函数环路调用。所述获取所述可执行文件的函数调用树的具体实现包括:以所述可执行文件的入口函数为起点,通过反汇编分析方法递归获取所述可执行文件中的一个函数所调用的所有子函数,以获取函数调用树。具体地,所述反汇编分析方法与所述可执行文件的机器语言对应。在一个实施例中,所述反汇编分析方法有多个,分别与不同的所述可执行文件的机器语言一一对应,根据加载的可执行文件的机器语言使用不同的反汇编分析方法。所述判断是否存在函数环路调用的具体实现为:检测函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。
[0033]步骤S3,当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。在一个实施例中,所述栈安全检测方法在所述函数调用树形成过程中,判断是否存在函数环路调用,如果存在,则结束所述函数调用树的获取,标识所述可执行文件存在函数环路调用。
[0034]在一个实施例中,假定所述可执行文件的源码如图2所示,所述可执行文件的源码为sample.C。在sample, c中各存在两个函数调用环路,如下:一是直接递归调用:task_entry->f_l O ->f_l O ; 二是间接递归调用:task_entry->f_2 O->f_3 O->f_4 O->f_2 O。所述sample, c被编译链接系统可加载映像文件vxWorks.gz中,task_entry是任务的入口函数。本方法加载映像文件vxWorks.gz并以任务入口函数(task_entry)为起点,对可加载映像文件(vxWorks.gz)的代码段进行反汇编分析。分析后得到的结果如图3所示,从图3中可以看到,通过对vxWorks.gz文件代码段的反汇编分析可以知道task_entry调用了子函数f_l、f_2、memcmp> memset。同样的方法分别对f_l、f_2、memcmp> memset进行反汇编分析,同样得到这些函数所调用的子函数,最终得到如图4所示的任务的函数调用树。对图4中的函数调用树检测每一个函数所调用的子函数节点是否在任务入口函数到此函数的运行路径上出现过,如果有出现过则是存在递归调用,即存在函数环路调用。检测结果如图5所示,函数调用树中存在两个调用环路:一是函数调用路径(task_entry->f_l->f_l),最后的函数节点(f_l)能在其上一层的调用路径(taSk_entry->f_l)上找到,则认为存在调用环路(递归调用)。二是函数调用路径(task_entry->f_2->f_3->f_4->f_2),最后的函数节点(f_2)能在其上一层的调用路径(taSk_entry->f_2->f_3->f_4)上找到,则认为存在调用环路。这时就可以标识所述可执行文件存在函数环路调用。
[0035]本发明还提供一种栈安全检测系统。在一个实施例中,如图6所示,所述栈安全检测系统I包括可执行文件加载模块11和函数调用分析模块12。其中:
[0036]可执行文件加载模块11用于加载待分析的可执行文件。在一个实施例中,所述可执行文件包括嵌入式系统中的映像文件。
[0037]函数调用分析模块12与所述可执行文件加载模块11相连,用于以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断所述函数调用树中是否存在函数调用环路;当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。所述判断是否存在函数环路调用的具体实现为:检测函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。在一个实施例中,所述函数调用分析模块12包括反汇编单元,所述反汇编单元用于获取所述可执行文件的一个函数所调用的所有子函数;所述调用分析函数通过所述反汇编单元获取所述可执行文件的函数调用树。所述反汇编单元与所述可执行文件的机器语言一一对应。所述反汇编分析方法可以有多个,分别与不同的所述可执行文件的机器语言一一对应,根据加载的可执行文件的机器语言使用不同的反汇编分析方法。
[0038]在一个实施例中,在所述调用分析模块12获取所述函数调用树的过程中,判断是否存在函数环路调用,如果存在,则结束所述函数调用树的获取,标识所述可执行文件存在函数环路调用。
[0039]综上所述,本发明一种栈安全检测方法及系统,具有以下有益效果:通过一种简单且容易实现的技术方案,运用反汇编手段分析系统的可加载映像文件,检测出任务中存在的环路调用点,为系统任务栈使用或者任务栈溢出问题的定位分析提供有效的数据,可以加快相关问题的定位。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0040]上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属【技术领域】中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
【权利要求】
1.一种栈安全检测方法,其特征在于,所述栈安全检测方法包括: 加载可执行文件; 以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断是否存在函数环路调用; 当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。
2.根据权利要求1所述的栈安全检测方法,其特征在于:所述获取所述可执行文件的函数调用树的具体实现包括:以所述可执行文件的入口函数为起点,通过反汇编分析方法递归获取所述可执行文件中的一个函数所调用的所有子函数,以获取函数调用树。
3.根据权利要求2所述的栈安全检测方法,其特征在于:所述反汇编分析方法与所述可执行文件的机器语言 对应。
4.根据权利要求1所述的栈安全检测方法,其特征在于:所述判断是否存在函数环路调用的具体实现为:检测所述函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。
5.根据权利要求1所述的栈安全检测方法,其特征在于:所述可执行文件包括嵌入式系统中的映像文件。
6.一种栈安全检测系统,其特征在于:所述栈安全检测系统包括: 可执行文件加载模块,用于加载待分析的可执行文件; 函数调用分析模块,与所述可执行文件加载模块相连,用于以所述可执行文件的入口函数为起点获取所述可执行文件的函数调用树,并判断所述函数调用树中是否存在函数调用环路;当所述可执行文件的函数调用树中存在所述函数环路调用时,标识所述可执行文件存在函数环路调用。
7.根据权利要求6所述的栈安全检测系统,其特征在于:所述函数调用分析模块包括反汇编单元,所述反汇编单元用于获取所述可执行文件的一个函数所调用的所有子函数;所述调用分析函数通过所述反汇编单元获取所述可执行文件的函数调用树。
8.根据权利要求7所述的栈安全检测系统,其特征在于:所述反汇编单元与所述可执行文件的机器语言 对应。
9.根据权利要求6所述的栈安全检测系统,其特征在于:所述判断是否存在函数环路调用的具体实现为:检测函数调用树中每一个函数所调用的子函数节点是否在所述可执行文件入口函数到所述函数的运行路径上出现过,如果有出现过则为存在函数环路调用。
10.根据权利要求6所述的栈安全检测系统,其特征在于:所述可执行文件包括嵌入式系统中的映像文件。
【文档编号】G06F11/36GK104331370SQ201410696490
【公开日】2015年2月4日 申请日期:2014年11月26日 优先权日:2014年11月26日
【发明者】李智荣 申请人:上海斐讯数据通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1