一种内存访问异常的检测方法及装置的制造方法_2

文档序号:8319069阅读:来源:国知局
功能特征,建立指令行为级模拟 器;
[0048] 建立单元,用于建立所述指令行为级模拟器的过程中,针对条件判断类及分支跳 转类指令进行行为级建模时,添加先进后出的堆栈结构;所述堆栈结构用于保存所述条件 判断类及分支跳转类指令的内存地址、寄存器内的数据的逆状态。
[0049] 优选地,所述构建模块,包括:
[0050] 内存泄露检测单元,用于对程序进行虚拟执行,判断是否出现条件判断类及分支 跳转类指令,如果出现,保存所述条件判断类及分支跳转类指令的内存地址、寄存器内的数 据的逆状态,并进行入栈;统计当前执行路径下申请和释放的动态内存的字节数,统计对内 存的写操作,并把对内存的修改写入栈顶记录所对应的内存状态修改链表内;当程序执行 到出口函数时,检查申请和释放的动态内存的字节数是否相同,并根据内存地址,查找导致 内存泄露的动态内存分配库函数;检测完成后,从所述栈结构内读取一条记录,并对虚拟机 的程序指针、内存、寄存器进行恢复;程序运行到栈空为止,实现对动态内存分配造成的内 存泄露的检测操作;
[0051]内存越界检测单元,用于获得所述第一列表文件内的静态数组占用以及动态申请 的内存的内存记录,在链接期对静态分配的全局数据、局部静态数组分配内存地址,在运行 期通过压栈操作计算存储于程序栈内的局部未初始化数组的栈地址的偏移量,并通过动态 内存分配库函数的返回值获取动态内存分配的内存块;每一条独立的加载、保存指令在函 数内的基本块中首次被执行时,记录访问的内存地址以及所在的内存块,当下一次访问中 的目标内存地址不在所述内存块内时,判定为内存访问越界,实现对程序运行时的内存访 问越界的检测操作。
[0052] 应用本申请的技术方案,对源代码进行排查和词法分析、语法分析以及语义分析, 生成控制流图、数据依赖图、第一列表文件和第二列表文件;所述第一列表文件中包括所述 源代码内的静态数组占用的内存的静态内存信息,或所述源代码内的动态分配的内存的动 态内存信息;所述第二列表文件中包括所述源代码内的动态内存分配库函数的函数信息; 根据所述控制流图构建所述源代码的全局函数调用图,根据所述全局函数调用图、所述第 二列表文件和所述数据依赖图,对所述源代码进行动态内存分配的匹配性检测;构建虚拟 执行平台,根据所述第一列表文件、所述控制流图和所述数据依赖图提取执行路径,实现对 动态内存分配造成的内存泄露以及程序运行时的内存访问越界的检测操作。这样,通过分 析和构建源代码的第一列表文件、第二列表文件、控制流图、数据依赖图和全局函数调用 图,进行动态内存申请、释放的匹配,并构建虚拟执行平台抽取执行路径,可以充分挖掘源 代码中存在的内存访问异常,通过建模和虚拟执行可以高效地实现对于内存访问异常的检 测操作。
【附图说明】
[0053] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下, 还可以根据这些附图获得其他的附图。
[0054] 图1为本申请实施例提供的一种内存访问异常的检测方法的流程图;
[0055] 图2为本申请实施例提供的另一种内存访问异常的检测方法的流程图;
[0056] 图3为本申请实施例提供的又一种内存访问异常的检测方法的流程图;
[0057] 图4为本申请实施例提供的再一种内存访问异常的检测方法的流程图;
[0058] 图5为本申请实施例提供的再一种内存访问异常的检测方法的流程图;
[0059] 图6为本申请实施例提供的一种内存访问异常的检测装置的结构示意图。
【具体实施方式】
[0060] 相关术语解释:
[0061] 动态检测:对于内存访问异常的动态检测方法,需要在程序中插入动态检测代码 或断言,在程序的执行过程中及时发现缓冲区溢出漏洞;
[0062] 控制流图(Control flow graph,CFG)是用在编译器中的一个抽象数据结构。它是 一个过程或程序的抽象表现,由编译器在内部维护。每个在控制流图中的节点代表一个基 本块,例如,没有任何跳转或跳转目标的基本块;跳转目标以一个块开始,和以一个块结束。 每条在控制流图中的有向边,用于代表控制流中的跳转方向,或基本块之间的跳转关系。函 数调用图(Func Call Graph,FCG):上述CFG内的节点通常是指发生分支的基本块,而FCG 内的节点即是独立的函数;
[0063] 数据依赖图(data cbpendence)是指语句之间存在的数据约束关系,如果两个运 算操作之间不占用同一变量,又或者它们只读同一变量进行连续的读写,那么执行结果与 它们的执行顺序无关,数据依赖图(Data Dependence Graph,DDG)就是描述了不同语句间, 同一变量或数据之间的数据依赖关系;
[0064] 虚拟执行:通常是指在模拟环境下,对目标机器平台的执行,常见的工具包括模拟 器、虚拟机等,其中,虚拟机通常还涉及硬件资源的调度与分配,而模拟器通常是纯软件实 施。
[0065] 为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实 施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施 例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通 技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护 的范围。
[0066] 为了使本技术领域的人员更好地理解本申请方案,使本申请的上述目的、特征和 优点能够更加明显易懂,下面结合附图和【具体实施方式】对本申请作进一步详细的说明。
[0067] 图1为本申请实施例提供的一种内存访问异常的检测方法的流程图。
[0068] 参照图1所示,本申请实施例提供的内存访问异常的检测方法,包括:
[0069] 步骤Sll :对源代码进行排查和词法分析、语法分析以及语义分析,生成控制流 图、数据依赖图、第一列表文件和第二列表文件;所述第一列表文件中包括所述源代码内 的静态数组占用的内存的静态内存信息,或所述源代码内的动态分配的内存的动态内存信 息;所述第二列表文件中包括所述源代码内的动态内存分配库函数的函数信息;
[0070] 在本申请实施例中,本申请提供的内存访问异常的检测方法,参照图2,所述对源 代码进行排查和词法分析、语法分析以及语义分析,生成控制流图、数据依赖图、第一列表 文件和第二列表文件,包括:
[0071] Slll :调用轻量级静态检测工具对源代码进行初步排查;
[0072] S112:对所述源代码进行词法、语法分析,对所述源代码内的静态数组占用、动态 申请的内存所占用的字节数、名称进行标记,生成第一列表文件,并对动态内存分配库函数 所在的源文件及函数名称、调用参数进行标记,生成第二列表文件;
[0073] S113:根据所述源代码的分支跳转和函数调用关系,将所述源代码切分为多个基 本块,并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图,并根据所述源 代码的变量之间的数据依赖关系,生成数据依赖图。
[0074] 在本发明提出的技术方案中,对源代码进行预处理和词法分析、语法分析以及语 义分析,生成控制流图、数据依赖图,是结合传统编译技术上前端分析实现。在本发明的一 个应用实例中,是在开源编译编译框架GCC(GNU C Compiler)的基础上实施,但并不局限于 此,诸如开源分析工具Splint等均可实现替代功能。
[0075] 具体的,调用Splint等轻量级静态检测工具对代码进行初步排查;在对源代码 进行词法、语法等分析的过程中,对源程序内静态数组占用、动态申请的内存所占用的字节 数、名称等进行标记,并以列表的形式进行输出,第一列表文件;在对源代码进行词法、语法 等分析的过程中,还对malloc、free等动态内存分配相关的库函数所在源文件及函数名 称、调用参数等进行标记,并同样以列表的形式进行输出,形成第二列表文件;GCC编译框 架内在前端分析结束后,生成目标源文件的控制流图CFG,CFG上的各节点对应于程序内唯 一的基本块,因此,CFG不仅反映了函数之间的调用关系,还刻画了文件内函数之间的调用 关系。
[0076] 步骤S12 :根据所述控制流图构建所述源代码的全局函数调用图,根据所述全局 函数调用图、所述第二列表文件和所述数据依赖图,对所述源代码进行动态内存分配的匹 配性检测;
[0077] 本申请实施例提供的一种内存访问异常的检测方法,如图3所示,所述根据所述 控制流图构建所述源代码的全局函数调用图,包括:
[0078] S121 :提取所述控制流图内的函数的内入口基本块、出口基本块,统计所述入口基 本块的入度和所述出口基本块的出度,并合并所述入口基本块和所述出口基本块对应的节 点,构建节点之间的连接关系,为每一个独立源程序生成一个函数调用图;
[0079] 根据特定的应用场景,本发明还需在CFG的基础上构建用于直观刻画函数之间调 用关系的全局函数调用图;删除CFG内除具体函数内入口基本块、出口基本块的其它节点, 统计入口基本的入度,以及出口基本块的出度,合并入口、出口基本块对应的节点,并出现 构建节点之间的连接关系,即构成了一个独立源程序的单个源文件的函数调用图。
[0080] S122 :遍历第一函数调用图内存在出度且在所述第一函数调用图内无后继节点的 节点,判断与第二函数调用图内的全局函数节点是否存在调用关系,如果存在,则添加从第 一函数调用图到第二函数调用图的有向边;遍历第二函数调用图内存在出度且在所述第二 函数调用图内无后继节点的节点,判断与第一函数调用图内的全局函数节点是否存在调用 关系,如果存在,则添加从第二函数调用图到第一函数调用图的有向边;依次处理每个函 数调用图,查找到所有节点的后续节点,并删除标准库函数的后续节点,生成全局函数调用 图。
[0081] -个完整的应用程序可以是由多个源文件组成,比如{Prj:Srcl, Src2,. . . Srcn}, 其中Srci,i = 1,2. . .,n代表一个独立的源程序,那么,经编译后可生成的单个源文件的函 数调用图的集合为CgsetlCgl, Cg2, ···,Cgn}。
[0082] 为了生成全局函数调用图,本发明还对单个源文件的函数调用图集合Cgset内的 元素进行迭代操作。以元素 Cgi、Cgj为例,其中i乒j, i, j = 1,2. . .,η。首先,遍历Cgi内 存在出度,但在Cgi内未找到后继节点的节点,判断它们与Cgj内全局函数节点是否存在调 用关系,如果有,则添加 i - j的有向边。然后,遍历Cgj内存在出度,但在Cgj内未找到后 继节点的节点,判断它们与Cgi内全局函数节点是否存在调用关系,如果有,则添加 j - i 的有向边,最后,依次处理各个元素,直到所有节点的后续节点,除标准库函数外的后续节 点全部找到为止,并生成全局函数调用图CallGraph。
[0083] 它具备以下属性:G(CallGraph) = (V(G),E(G),Cp(G)),其中,节点集合 V(G)= {vl, v2, v3
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1