CN107015904A - 堆栈的保护方法及装置 - Google Patents
堆栈的保护方法及装置 Download PDFInfo
- Publication number
- CN107015904A CN107015904A CN201610058946.2A CN201610058946A CN107015904A CN 107015904 A CN107015904 A CN 107015904A CN 201610058946 A CN201610058946 A CN 201610058946A CN 107015904 A CN107015904 A CN 107015904A
- Authority
- CN
- China
- Prior art keywords
- storehouse
- entities
- stack
- symbol
- executable file
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种堆栈的保护方法及装置,其中,该方法包括:获取可执行文件中每个函数占用的最大堆栈数值,其中,可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;依据最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值;获取用于标识一个或多个实体的符号,并依据符号分别获取一个或多个实体堆栈配置的配置值;在配置值小于计算值时,输出配置值与计算值的比较结果。通过本发明,解决了相关技术中采用动态堆栈检测导致检测滞后,而采用静态堆栈检测的分析是在堆栈内存占用方面的问题,从而方便快捷的实现了对堆栈溢出的检测。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种堆栈的保护方法及装置。
背景技术
在可执行程序运行过程中,程序运行所使用的堆栈是一种很重要的资源,如果堆栈溢出,将会带来不可预期、无法挽回的运行异常。因此,对堆栈的保护和检测技术就显得相当重要。
目前,在堆栈检测方面,相关技术中采用以下两种方式进行堆栈检测:
1、动态堆栈检测:动态检测是在程序运行过程中采取一定的手段进行堆栈溢出或者即将溢出预警检测,对程序已经运行到的最大深度所用的堆栈大小检测是直接准确的。但如果一旦发现了溢出,往往需要更换新的程序版本进行解决,即检测是滞后的;并且这种检测只能解决被发现故障的溢出部分,还可能存在程序里没有执行到的一些不能发现的溢出隐患,不是完整性检查。
例如,申请号为:200710003510.4的发明专利《一种检测堆栈帧破坏的方法》提供了一种动态检测堆栈是否被破坏的方法,其采用的手段是:通过编译器在函数中插桩,在入桩函数将堆栈帧备份到栈顶,在出桩函数中判断当前堆栈帧是否一致,从而判定任务堆栈是否被破坏。类似的动态检测方案:最大的问题就是滞后,即版本已经正式环境运行产生溢出了才能知道存在溢出。
2、静态堆栈检测:静态检测主要指程序还没有部署运行时就提前对其进行检测,这样无需实际程序部署环境,只需要普通的电脑就能进行检测。常见的检查手段:可以在编译使用一些编译选项检查,但一般是只是函数级别,并且不是所有编译器都支持;或者使用类似Valgrind工具的massif子功能进行堆栈分析,但其重点还是在堆栈内存占用方面,对堆栈溢出帮助甚微;唯一可能可以准确分析堆栈溢出的是一款商用分析工具stackAnalyzer。这款软件是一个需要付费的商用产品,价格较高,无法对其原理、准确性等进行估用,没有太多应用和指导价值。
针对相关技术中采用动态堆栈检测导致检测滞后,而采用静态堆栈检测的分析是在堆栈内存占用方面的问题,目前尚未存在有效的解决方案。
发明内容
本发明提供了一种堆栈的保护方法及装置,以至少解决相关技术中采用动态堆栈检测导致检测滞后,而采用静态堆栈检测的分析是在堆栈内存占用方面的问题。
根据本发明的一个方面,提供了一种堆栈的保护方法,包括:获取可执行文件中每个函数占用的最大堆栈数值,其中,所述可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值;获取用于标识所述一个或多个实体的符号,并依据所述符号分别获取所述一个或多个实体堆栈配置的配置值;在所述配置值小于所述计算值时,输出所述配置值与所述计算值的比较结果。
进一步地,所述获取可执行文件中每个函数占用的最大堆栈数值包括:获取与所述可执行文件对应的汇编源码;扫描所述汇编源码得到所述可执行文件中每个函数占用的所述最大堆栈数值。
进一步地,所述依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值包括:查找所述可执行文件中所述函数与子函数之间的调用关系,并依据所述调用关系构造函数调用树;遍历所述函数调用树分别得到所述一个或多个实体在所述函数调用树上占用的最大堆栈计算值。
进一步地,获取用于标识所述一个或多个实体的符号包括:从所述可执行文件的符号表中获取与所述一个或多个实体定义对应的符号;依据所述符号分别获取所述一个或多个实体堆栈配置的配置值包括:提取所述符号占用的字段大小,并依据所述字段大小查找到与所述字段大小对应的实体;提取查找到的实体的堆栈配置的配置值。
进一步地,多个所述实体之间配置有只读内存区域。
根据本发明的另一个方面,提供了一种堆栈的保护装置,包括:获取模块,用于获取可执行文件中每个函数占用的最大堆栈数值,其中,所述可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;计算模块,用于依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值;处理模块,用于获取用于标识所述一个或多个实体的符号,并依据所述符号分别获取所述一个或多个实体堆栈配置的配置值;输出模块,用于在所述配置值小于所述计算值时,输出所述配置值与所述计算值的比较结果。
进一步地,所述获取模块包括:第一获取单元,用于获取与所述可执行文件对应的汇编源码;扫描单元,用于扫描所述汇编源码得到所述可执行文件中每个函数占用的所述最大堆栈数值。
进一步地,所述计算模块包括:第一处理单元,用于查找所述可执行文件中所述函数与子函数之间的调用关系,并依据所述调用关系构造函数调用树;遍历单元,用于遍历所述函数调用树分别得到所述一个或多个实体在所述函数调用树上占用的最大堆栈计算值。
进一步地,所述处理模块包括:第二获取单元,用于从所述可执行文件的符号表中获取与所述一个或多个实体定义对应的符号;第二处理单元,用于提取所述符号占用的字段大小,并依据所述字段大小查找到与所述字段大小对应的实体;提取单元,用于提取查找到的实体的堆栈配置的配置值。
进一步地,多个所述实体之间配置有只读内存区域。
在本发明中,采用获取可执行文件中每个函数占用的最大堆栈数值,进而以及该最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值,此外还能获取到一个或多个实体堆栈配置的配置值,通过比较该计算值和配置值,确认是否存在溢出风险,如果配置值小于计算值,则输出配置值与计算值的比较结果,从而解决了相关技术中采用动态堆栈检测导致检测滞后,而采用静态堆栈检测的分析是在堆栈内存占用方面的问题,从而方便快捷的实现了对堆栈溢出的检测。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的堆栈的保护方法的流程图;
图2是根据本发明实施例的堆栈的保护装置的结构框图;
图3是根据本发明实施例的堆栈的保护装置的可选结构框图一;
图4是根据本发明实施例的堆栈的保护装置的可选结构框图二;
图5是根据本发明实施例的堆栈的保护装置的可选结构框图三;
图6是根据本发明可选实施例的自有调度实体架构图;
图7是根据本发明可选实施例的自有调度实体数据结构框图;
图8是根据本发明可选实施例的堆栈结构示意图;
图9是根据本发明可选实施例的自有调度实体运行方法的流程图;
图10是根据本发明可选实施例的静态堆栈检测装置流程示意图。
具体实施方式
本实施例技术方案的功能概述:在相关技术中当函数调用过深或局部变量过大等情况导致占用堆栈过多时分配的堆栈会被溢出,产生异常,本实施例采用了根据可执行程序文件(Executable and Linking Format,简称为ELF)获得对应的汇编源码,扫描汇编源码分析计算出每个函数最大堆栈占用;另外,在自有调度实体设计时从ELF文件符号表扫描获得每个自有调度实体的堆栈配置值,根据入口开始的调用路径计算出自有调度实体最大深度的堆栈占用值。然后比较各个自有调度实体的堆栈配置值与对应最大堆栈占用计算值,如果配置值小于计数值,则存在溢出风险,并输出该溢出风险的信息,从而实现了对自有调度实体的堆栈溢出检测。
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
在本实施例中提供了一种堆栈的保护方法,图1是根据本发明实施例的堆栈的保护方法的流程图,如图1所示,该流程包括如下步骤:
步骤S102:获取可执行文件中每个函数占用的最大堆栈数值,其中,可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;
步骤S104:依据最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值;
步骤S106:获取用于标识一个或多个实体的符号,并依据符号分别获取一个或多个实体堆栈配置的配置值;
步骤S108:在配置值小于计算值时,输出配置值与计算值的比较结果。
通过上述步骤S102至步骤S108可知,在本实施例中采用获取可执行文件中每个函数占用的最大堆栈数值,进而以及该最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值,此外还能获取到一个或多个实体堆栈配置的配置值,通过比较该计算值和配置值,确认是否存在溢出风险,如果配置值小于计算值,则输出配置值与计算值的比较结果,从而解决了相关技术中采用动态堆栈检测导致检测滞后,而采用静态堆栈检测的分析是在堆栈内存占用方面的问题,从而方便快捷的实现了对堆栈溢出的检测。
对于本实施例中步骤S102中涉及到的获取可执行文件中每个函数占用的最大堆栈数值的方式,在本实施例的可选实施方式中,可以通过如下方式来实现:
步骤S102-1:获取与可执行文件对应的汇编源码;
步骤S102-2:扫描汇编源码得到可执行文件中每个函数占用的最大堆栈数值。
对于上述步骤S102-1和步骤S102-2,在具体应用场景中可以是:首先利用各中央处理器(Central Processing Unit,简称为CPU)体系的objdump从可执行ELF文件获取对应的汇编源码,研究各CPU体系(X86\ARM\PPC\MIPS等)汇编源码及堆栈结构特点,分析每个函数在其CPU体系上的准确堆栈占用方式,也就是说,扫描每个函数的每一行汇编源码,并根据每个CPU体系特点分析出每个函数准确的堆栈占用大小,从而得到每个函数占用最大堆栈数值。
对于本实施例中步骤S104中涉及到的依据最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值的方式,在本实施例的可选实施方式中,可以通过如下方式来实现:
步骤S104-1:查找可执行文件中函数与子函数之间的调用关系,并依据调用关系构造函数调用树;
步骤S104-2:遍历函数调用树分别得到一个或多个实体在函数调用树上占用的最大堆栈计算值。
对于上述步骤S104-1和步骤S104-2在本实施的具体应用场景中可以是:根据函数里的call等函数调用指令,搜寻出函数子函数调用关系(包括函数指针、递归和普通子函数都进行相应的识别),并构建函数子函数树,进而从每个Job入口函数开始遍历函数调用树,累加、排序出每个Job调用数上最大栈计算值,该值即为计算出的Job最大堆栈占用计算值。
对于本实施例中步骤S106中涉及到的获取用于标识一个或多个实体的符号的方式,可以通过如下方式来实现:从可执行文件的符号表中获取与一个或多个实体定义对应的符号;
而对于本实施例中步骤S106中涉及到的依据符号分别获取一个或多个实体堆栈配置的配置值的方式,可以通过如下方式来实现:提取符号占用的字段大小,并依据字段大小查找到与字段大小对应的实体;提取查找到的实体的堆栈配置的配置值。
而对于本实施例步骤S106中涉及到的方式,在本实施例的具体应用场景中可以是:编码时利用实体的数据结构为每个进程的实体定义一个全局数组符号,比如命名为g_atJobRegTbl[],在ELF的扫描时从符号表里找到g_atJobRegTbl符号并提取出的该符号的占用的大小字段,校验该字段是本实施例中实体数据结构整数倍,则可判断该符号是实体注册表符号,然后逐一提取每个实体的实体堆栈大小字段,即获取到了对应实体的堆栈配置值。
此外,需要说明的是,本实施例中的多个实体之间配置有只读内存区域,该只读内存区域用于降低堆栈溢出的相互影响。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
在本实施例中还提供了一种堆栈的保护装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图2是根据本发明实施例的堆栈的保护装置的结构框图,如图2所示,该装置包括:获取模块22,用于获取可执行文件中每个函数占用的最大堆栈数值,其中,可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;计算模块24,与获取模块22耦合连接,用于依据最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值;处理模块26,与计算模块24耦合连接,用于获取用于标识一个或多个实体的符号,并依据符号分别获取一个或多个实体堆栈配置的配置值;输出模块28,与处理模块26耦合连接,用于在配置值小于计算值时,输出配置值与计算值的比较结果。
图3是根据本发明实施例的堆栈的保护装置的可选结构框图一,如图3所示,该获取模块22包括:第一获取单元32,用于获取与可执行文件对应的汇编源码;扫描单元34,与第一获取单元32耦合连接,用于扫描汇编源码得到可执行文件中每个函数占用的最大堆栈数值。
图4是根据本发明实施例的堆栈的保护装置的可选结构框图二,如图4所示,该计算模块24包括:第一处理单元42,用于查找可执行文件中函数与子函数之间的调用关系,并依据调用关系构造函数调用树;遍历单元44,与第一处理单元42耦合连接,用于遍历函数调用树分别得到一个或多个实体在函数调用树上占用的最大堆栈计算值。
图5是根据本发明实施例的堆栈的保护装置的可选结构框图三,如图5所示,该处理模块26包括:第二获取单元52,用于从可执行文件的符号表中获取与一个或多个实体定义对应的符号;第二处理单元54,与第二获取单元52耦合连接,用于提取符号占用的字段大小,并依据字段大小查找到与字段大小对应的实体;提取单元56,与第二处理单元54耦合连接,用于提取查找到的实体的堆栈配置的配置值。
可选地,本实施例中涉及到的多个实体之间配置有只读内存区域。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述模块分别位于多个处理器中。
下面结合本发明的可选实施例对本发明进行举例说明;
可执行程序执行线索主要在线程上下文,线程有自己的运行堆栈,当函数调用过深或局部变量过大等情况导致占用堆栈过多时分配的堆栈会被溢出,产生异常;基于此本可选实施例提供了一种自有调度实体堆栈保护方法及其堆栈检测装置,在程序中设计一批调度管理线程,在这些管理线程下还下挂有自有调度实体(对应于本实施例中上述的实体),给每个实体分配一段堆内存,用作该自有调度实体运行堆栈,每个实体的堆栈大小可指定配置。同时,在自有调度实体间设置只读内存区域隔离保护,降低堆栈溢出的相互影响。自有调度实体入口之后的函数调用堆栈都设计在本可选实施例中分配的堆内存上运行,当运行到某自有调度实体入口时,保存其归属调度管理线程上下文,堆栈切换到自有调度实体运行,自有调度实体运行完成后,恢复调度管理线程上下文,切换回调度管理线程运行。
此外,本可选实施例中静态堆栈检测装置的检测流程为:根据可执行程序文件ELF获得对应的汇编源码,扫描汇编源码分析计算出每个函数最大堆栈占用,同时根据call等指令调用关系构建函数子函数调用关系树;在自有调度实体设计时应考虑如何能从ELF文件符号表扫描获得每个自有调度实体的堆栈配置值、自有调度实体入口等信息。根据入口开始的调用路径计算出自有调度实体最大深度的堆栈占用值。然后比较各个自有调度实体的堆栈配置值与对应最大堆栈占用计算值,如果配置值小于计数值,则存在溢出风险,对存在溢出风险的自有调度实体信息和其他有用信息输出到一些指定文件。从而本可选实施例实现了对自有调度实体的堆栈溢出检测,对代码堆栈隐患和改进优化提供了有效信息。
可见,本可选实施例把真正业务编码运行的程序部分进行了隔离保护;同时,通过提供的静态堆栈检测装置,在程序版本编译生成后,直接使用该检测装置即可得到业务代码存在的堆栈溢出风险隐患,业务编码者则可根据相关输出信息在产品发布前就能合理调整堆栈配置并能有针对性的重点优化一些堆栈占用较大的函数等。
下面结合附图说明本可选实施例所采用的实施方法:
图6是根据本发明可选实施例的自有调度实体架构图,如图6所示,可执行程序执行线索主要在线程上下文,在程序中设计一批管理管理线程(如ScheA\ScheB),在这些管理线程下,本可选实施例中的设计下挂有自有调度实体(在本可选实施例中称之为Job)。
图7是根据本发明可选实施例的自有调度实体数据结构框图,如图7所示,该实体数据结构包括:自有调度实体堆栈配置值、自有调度实体入口、自有调度实体栈顶指针、自有调度实体栈底指针、自有调度实体归属调度管理线程栈顶指针等;其中,a、堆栈配置值,自有调度实体入口在静态堆栈检测装置的ELF扫描时会用到;b、自有调度实体栈顶指针、自有调度实体栈底指针、自有调度实体归属调度管理线程栈顶指针等在堆栈运行切换时使用到。
图8是根据本发明可选实施例的堆栈结构示意图,如图8所示,左边是一个可执行程序的进程地址空间,地址从低到高分别为.text,.data,.bss,heap,stack等部分;其中,堆内存heap从低往高分配,程序运行堆栈stack从高往低走,操作系统线程使用stack部分的堆栈。
在一个可执行程序进程中本可选实施例根据形如图8的数据结构定义一个Job配置表全局变量,每个Job堆栈大小可指定配置,上电初始化时,本可选实施例可以根据每个Job堆栈大小配置值从heap里分配一段堆内存,用作该Job运行堆栈。Job的函数入口,栈底指针,栈顶指针等都在初始化时进行了赋值。在后面堆栈检测装置,本可选实施例可以从ELF文件分析时提取出来这些信息帮助堆栈检测分析。
需要说明的是,Job间增加保护页进行保护,当发生栈溢出或其他越界时触发异常。小内存设备会存在内存占用问题,应设计为可选配。
图9是根据本发明可选实施例的自有调度实体运行方法的流程图,如图9所示,该方法的步骤包括:
步骤S902:调度任务压栈并存重要寄存器数据;
步骤S904:堆栈指针指向待运行Job堆栈地址;
步骤S906:运行Job;
步骤S908:堆栈指针指回任务堆栈地址;
步骤S910:出栈并写回重要寄存器数据。
当运行到某Job入口时,保存调度管理线程上下文,堆栈切换到自有调度实体即Job运行,运行完成切换回归属调度管理线程。因此,业务代码堆栈占用大小都在当前Job自己的堆栈部分,不会对main、调度管理线程的堆栈产生影响,起到了隔离作用。
图10是根据本发明可选实施例的静态堆栈检测装置流程示意图,如图10所示,该检测装置检测流程的步骤包括:
步骤S1002:获取汇编源码;
其中,利用各CPU体系的objdump从可执行ELF文件获取对应的汇编源码;
步骤S1004:计算每个函数最大堆栈占用;
其中,研究各CPU体系(X86\ARM\PPC\MIPS等)汇编源码及堆栈结构特点,分析每个函数在其CPU体系上的准确堆栈占用方法。也就是说,扫描函数汇编指令,根据指令特点分析是否占用堆栈,并进行累加计算。
以X86\X86_64体系函数最大栈计算方法为例,根据X86汇编源码指令分析和栈帧结构,提供了下计算方法:
#if(_CPU_TYPE==_CPU_X86)
#define ASM_FLAG"elf32-i386"
#define REG_SIZE 4
#define REG_NUM 8
#define ESP"esp"
#elif(_CPU_TYPE==_CPU_X86_64)
#define REG_SIZE 8
#define REG_NUM 12
#define ESP"rsp"
#endif
func_stack_size大小即方法中的每个函数栈的计算值:
func_stack_size=push_ebp+push_ret+add_stack+cur_stack+pop_stack
说明:
push_ebp=REG_SIZE//第一条是push指令时增加该值;
push_ret=REG_SIZE//有子函数调用的计1次,只计1次;
add_stack=汇编使用“add负数sp”分配局部变量空间的计算;
cur_stack=xxx//第一次搜索到sub xxx,esp时提取出xxx,只计算一次;
pop_stack=每次REG_SIZE累加//pop,popl,popa,popad等相关指令时累加,不超过(REG_NUM*REG_SIZE+REG_SIZE)。
步骤S1006:扫描每个函数的每一行汇编源码,并根据每个CPU体系特点分析出每个函数准确的堆栈占用大小;
其中,PPC\MIPS等CPU如果强制使用了-mlongcall支持了长跳转指令,仅仅根据静态汇编无法准确分析是函数指针还是普通子函数调用,因此在待分析的ELF文件编译时应去掉类似的编译选项提高准确性。
步骤S1008:构造函数调用树;
其中,根据函数里的call等函数调用指令,搜寻出函数子函数调用关系(包括函数指针、递归和普通子函数都进行相应的识别),并构建函数子函数树,在计算Job入口开始的函数调用最大深度时使用。
步骤S1010:获取Job堆栈配置值和计算值;
其中,编码时利用图7结构为每个进程的Job实体定义一个全局数组符号,比如命名为g_atJobRegTbl[],在ELF的扫描时从符号表里找到g_atJobRegTbl符号并比较提取出的该符号的占用的大小字段,校验该字段是图7数据结构整数倍,则可判断该符号是Job注册表符号,然后逐一提取每个Job的Job堆栈大小字段,即获取到了对应Job的堆栈配置值;同时,从每个Job入口函数开始遍历函数调用树,累加、排序出每个Job调用数上最大栈计算值,该值即为计算出的Job最大堆栈占用计算值。比较每个Job堆栈配置值和计算值,当存在Job配置值小于对应的计算值时说明存在堆栈溢出风险。
其中,a、对函数指针的处理:汇编里不能知道具体使用了哪个回调函数,选取回调函数路径里最大的一个;
b、对递归的处理:汇编里不能识别出递归的次数,本可选实施例提供了在第一次检测时每个递归函数默认计算M次,并把递归函数都输出到递归函数统计文件。如果用户需要更准确的次数计算,根据每个递归函数的特点配置需要计算的次数到配置文件,再执行下一次检测时检测程序会读取该配置文件的各个递归函数的次数进行计算;
步骤S1012:、信息输出;
其中,当存在比较的Job配置值小于对应的计算值时说明存在堆栈溢出风险,把他输出到指定文件供分析;同时还可以对所有函数堆栈占用进行排序、递归函数、函数指针等分析,也输出到指定文件,输出的这些信息可为溢出风险处理提供有效的改进参考数据。
步骤S1014:运行检测装置;
其中,当程序版本编译生成后,无需实际程序部署运行环境,直接使用检测装置和待检测版本程序分析即可执行前面描述的检测流程步骤,检测完成后输出业务代码存在的堆栈溢出风险隐患,并能根据输入信息很简单的查看到如何调整堆栈配置和以及哪些函数代码是需要重点优化的方法。
由本可选实施例可知,把业务代码运行堆栈进行了安全隔离,且本可选实施例提供的检测装置检测过程可以做到完全自动化,以及产品迭代过程中堆栈相关的故障能够第一时间得到纠正,极大的降低了产品开发成本和运行风险。
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的程序代码:
S1:获取可执行文件中每个函数占用的最大堆栈数值,其中,可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;
S2:依据最大堆栈数值计算出一个或多个实体分别占用的最大堆栈计算值;
S3:获取用于标识一个或多个实体的符号,并依据符号分别获取一个或多个实体堆栈配置的配置值;
S4:在配置值小于计算值时,输出配置值与计算值的比较结果。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种堆栈的保护方法,其特征在于,包括:
获取可执行文件中每个函数占用的最大堆栈数值,其中,所述可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;
依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值;
获取用于标识所述一个或多个实体的符号,并依据所述符号分别获取所述一个或多个实体堆栈配置的配置值;
在所述配置值小于所述计算值时,输出所述配置值与所述计算值的比较结果。
2.根据权利要求1所述的方法,其特征在于,所述获取可执行文件中每个函数占用的最大堆栈数值包括:
获取与所述可执行文件对应的汇编源码;
扫描所述汇编源码得到所述可执行文件中每个函数占用的所述最大堆栈数值。
3.根据权利要求1所述的方法,其特征在于,所述依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值包括:
查找所述可执行文件中所述函数与子函数之间的调用关系,并依据所述调用关系构造函数调用树;
遍历所述函数调用树分别得到所述一个或多个实体在所述函数调用树上占用的最大堆栈计算值。
4.根据权利要求1所述的方法,其特征在于,
获取用于标识所述一个或多个实体的符号包括:从所述可执行文件的符号表中获取与所述一个或多个实体定义对应的符号;
依据所述符号分别获取所述一个或多个实体堆栈配置的配置值包括:提取所述符号占用的字段大小,并依据所述字段大小查找到与所述字段大小对应的实体;提取查找到的实体的堆栈配置的配置值。
5.根据权利要求1至4任一项所述的方法,其特征在于,多个所述实体之间配置有只读内存区域。
6.一种堆栈的保护装置,其特征在于,包括:
获取模块,用于获取可执行文件中每个函数占用的最大堆栈数值,其中,所述可执行文件中配置有多个线程,每个线程下挂有一个或多个用于运行堆栈的实体;
计算模块,用于依据所述最大堆栈数值计算出所述一个或多个实体分别占用的最大堆栈计算值;
处理模块,用于获取用于标识所述一个或多个实体的符号,并依据所述符号分别获取所述一个或多个实体堆栈配置的配置值;
输出模块,用于在所述配置值小于所述计算值时,输出所述配置值与所述计算值的比较结果。
7.根据权利要求6所述的装置,其特征在于,所述获取模块包括:
第一获取单元,用于获取与所述可执行文件对应的汇编源码;
扫描单元,用于扫描所述汇编源码得到所述可执行文件中每个函数占用的所述最大堆栈数值。
8.根据权利要求6所述的装置,其特征在于,所述计算模块包括:
第一处理单元,用于查找所述可执行文件中所述函数与子函数之间的调用关系,并依据所述调用关系构造函数调用树;
遍历单元,用于遍历所述函数调用树分别得到所述一个或多个实体在所述函数调用树上占用的最大堆栈计算值。
9.根据权利要求6所述的装置,其特征在于,所述处理模块包括:
第二获取单元,用于从所述可执行文件的符号表中获取与所述一个或多个实体定义对应的符号;
第二处理单元,用于提取所述符号占用的字段大小,并依据所述字段大小查找到与所述字段大小对应的实体;
提取单元,用于提取查找到的实体的堆栈配置的配置值。
10.根据权利要求6至9任一项所述的装置,其特征在于,多个所述实体之间配置有只读内存区域。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610058946.2A CN107015904B (zh) | 2016-01-28 | 2016-01-28 | 堆栈的保护方法及装置 |
PCT/CN2017/070868 WO2017128952A1 (zh) | 2016-01-28 | 2017-01-11 | 堆栈的保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610058946.2A CN107015904B (zh) | 2016-01-28 | 2016-01-28 | 堆栈的保护方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107015904A true CN107015904A (zh) | 2017-08-04 |
CN107015904B CN107015904B (zh) | 2022-04-19 |
Family
ID=59397343
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610058946.2A Active CN107015904B (zh) | 2016-01-28 | 2016-01-28 | 堆栈的保护方法及装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN107015904B (zh) |
WO (1) | WO2017128952A1 (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107632936A (zh) * | 2017-09-22 | 2018-01-26 | 迈普通信技术股份有限公司 | 堆栈保护方法及装置 |
CN110084042A (zh) * | 2019-05-11 | 2019-08-02 | 肖银皓 | 一种应用程序堆栈静态分析方法及系统 |
CN111061512A (zh) * | 2019-12-06 | 2020-04-24 | 湖北文理学院 | 分支指令的处理方法、装置、设备和存储介质 |
CN111159051A (zh) * | 2019-12-31 | 2020-05-15 | 北京天融信网络安全技术有限公司 | 死锁检测方法、装置、电子设备及可读存储介质 |
CN111273980A (zh) * | 2020-01-14 | 2020-06-12 | 中国平安财产保险股份有限公司 | 界面线程可视化方法、装置、计算机设备及存储介质 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113312054A (zh) * | 2021-05-27 | 2021-08-27 | 长沙海格北斗信息技术有限公司 | 针对嵌入式软件架构的软件栈消耗分析方法及分析装置 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080140979A1 (en) * | 2006-12-12 | 2008-06-12 | Kim Sang Cheol | Method of allocating stack in multi-threaded sensor operating system environment |
CN101271408A (zh) * | 2008-05-07 | 2008-09-24 | 浙江大学 | 在嵌入式系统中分析堆栈使用的方法 |
CN101833476A (zh) * | 2010-05-28 | 2010-09-15 | 西安交通大学 | 基于cmp的推测多线程机制下的独立栈函数调用方法 |
CN101876923A (zh) * | 2009-11-27 | 2010-11-03 | 中国科学院声学研究所 | 一种用于精确估计嵌入式系统中堆栈需求量的方法 |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN103745153A (zh) * | 2013-12-30 | 2014-04-23 | 北京控制工程研究所 | 一种航天器软件空间使用安全性检查方法 |
CN103870244A (zh) * | 2014-02-21 | 2014-06-18 | 北京神舟航天软件技术有限公司 | 一种sparc平台任务栈溢出检测算法 |
CN104679645A (zh) * | 2013-11-28 | 2015-06-03 | 中国航空工业集团公司航空动力控制系统研究所 | 一种栈空间余量实时检测方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100131803A1 (en) * | 2008-11-25 | 2010-05-27 | Express Logic | Computation of stack usage in embedded computing systems |
US8326886B2 (en) * | 2010-01-21 | 2012-12-04 | Microsoft Corporation | Per-thread, per-instance data storage |
-
2016
- 2016-01-28 CN CN201610058946.2A patent/CN107015904B/zh active Active
-
2017
- 2017-01-11 WO PCT/CN2017/070868 patent/WO2017128952A1/zh active Application Filing
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080140979A1 (en) * | 2006-12-12 | 2008-06-12 | Kim Sang Cheol | Method of allocating stack in multi-threaded sensor operating system environment |
CN101271408A (zh) * | 2008-05-07 | 2008-09-24 | 浙江大学 | 在嵌入式系统中分析堆栈使用的方法 |
CN101876923A (zh) * | 2009-11-27 | 2010-11-03 | 中国科学院声学研究所 | 一种用于精确估计嵌入式系统中堆栈需求量的方法 |
CN101833476A (zh) * | 2010-05-28 | 2010-09-15 | 西安交通大学 | 基于cmp的推测多线程机制下的独立栈函数调用方法 |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN104679645A (zh) * | 2013-11-28 | 2015-06-03 | 中国航空工业集团公司航空动力控制系统研究所 | 一种栈空间余量实时检测方法 |
CN103745153A (zh) * | 2013-12-30 | 2014-04-23 | 北京控制工程研究所 | 一种航天器软件空间使用安全性检查方法 |
CN103870244A (zh) * | 2014-02-21 | 2014-06-18 | 北京神舟航天软件技术有限公司 | 一种sparc平台任务栈溢出检测算法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107632936A (zh) * | 2017-09-22 | 2018-01-26 | 迈普通信技术股份有限公司 | 堆栈保护方法及装置 |
CN107632936B (zh) * | 2017-09-22 | 2020-08-18 | 迈普通信技术股份有限公司 | 堆栈保护方法及装置 |
CN110084042A (zh) * | 2019-05-11 | 2019-08-02 | 肖银皓 | 一种应用程序堆栈静态分析方法及系统 |
CN111061512A (zh) * | 2019-12-06 | 2020-04-24 | 湖北文理学院 | 分支指令的处理方法、装置、设备和存储介质 |
CN111159051A (zh) * | 2019-12-31 | 2020-05-15 | 北京天融信网络安全技术有限公司 | 死锁检测方法、装置、电子设备及可读存储介质 |
CN111159051B (zh) * | 2019-12-31 | 2023-07-04 | 北京天融信网络安全技术有限公司 | 死锁检测方法、装置、电子设备及可读存储介质 |
CN111273980A (zh) * | 2020-01-14 | 2020-06-12 | 中国平安财产保险股份有限公司 | 界面线程可视化方法、装置、计算机设备及存储介质 |
CN111273980B (zh) * | 2020-01-14 | 2024-03-29 | 中国平安财产保险股份有限公司 | 界面线程可视化方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN107015904B (zh) | 2022-04-19 |
WO2017128952A1 (zh) | 2017-08-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107015904A (zh) | 堆栈的保护方法及装置 | |
US10198250B1 (en) | Partitioning based migration of systems to container and microservice based platforms | |
Watanabe et al. | Adapting a fault prediction model to allow inter languagereuse | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
JP5403362B2 (ja) | パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム | |
US11048798B2 (en) | Method for detecting libraries in program binaries | |
Fioravanti et al. | A study on fault-proneness detection of object-oriented systems | |
CN109525556A (zh) | 一种用于确定嵌入式系统固件中协议漏洞的轻量级方法及系统 | |
CN108734012A (zh) | 恶意软件识别方法、装置及电子设备 | |
CN106897072A (zh) | 业务工程调用方法、装置及电子设备 | |
CN110427755A (zh) | 一种识别脚本文件的方法及装置 | |
CN110147657A (zh) | 一种用户权限配置方法及装置 | |
CN108491228A (zh) | 一种二进制漏洞代码克隆检测方法及系统 | |
CN106453320A (zh) | 恶意样本的识别方法及装置 | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
CN108399321B (zh) | 基于动态指令依赖图胎记的软件局部抄袭检测方法 | |
CN113448985A (zh) | 一种api接口生成方法、调用方法、装置及电子设备 | |
CN116483888A (zh) | 程序评估方法及装置、电子设备和计算机可读存储介质 | |
US20110276948A1 (en) | Partition-based static analysis of computer software applications | |
CN110244954A (zh) | 一种应用程序的编译方法及设备 | |
CN105677827B (zh) | 一种表单的获取方法及装置 | |
CN109117139A (zh) | 一种软件构建方法及装置、服务器和可读存储介质 | |
US10585664B2 (en) | Span limited lexical analysis | |
CN115827423B (zh) | 基于多场景聚类的测试案例生成方法、装置、设备及介质 | |
CN117807474A (zh) | 数据分类方法、装置、设备及存储介质 |
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 |