一种使用多样本差异比对的软件故障分析方法

文档序号:6373582阅读:165来源:国知局
专利名称:一种使用多样本差异比对的软件故障分析方法
技术领域
本发明涉及一种计算机技术领域的软件分析方法,特别是涉及ー种使用多祥本差异比对的软件故障分析方法。
背景技术
软件故障分析是指在检测和发现软件中存在的逻辑和功能错误后,分析产生错误的原因。模糊测试是目前常用的发现软件错误的方法之一,原理是通过构造不同的输入,尝试触发程序执行的各种不同路径以暴露出程序潜在的安全问题。 软件故障分析的基础是软件分析技木。根据分析目标的不同,现有软件分析技术一般分为面向源代码的软件分析和面向可执行程序的软件分析。前者针对有源代码的程序,相对而言,分析准确性更高。但是现有软件多数不提供源代码,同吋,即使部分软件提供了源代码,也不能保证使用的可执行程序和源代码之间的对应关系。对于后者,首先将需要分析的ニ进制目标代码反汇编,得到汇编代码;然后对汇编代码进行切片,即对某些上下文关联密切、有意义的代码进行汇聚,降低其复杂性;最后对切片进行逻辑和功能分析,实现软件分析功能。在软件分析技术的基础上,软件故障分析以人工分析为主,并辅以一些自动化方法。在不同的应用环境下有不同的自动化方法,在自动定位故障原因方面,针对通过模糊测试找出的软件故障,目前有采用双样本差异比对的方法,例如BitBlaze系统。该方法通过对比两个类似样本的指令执行过程,能够定位出指令流分支点,进ー步的再从分支点的上下文环境分析导致产生分支的原因。这种方法对于分析由样本中单个数据变异导致的软件故障是有效的,但如果样本存在多个故障触发点,则只能定位到首个关键触发点,而较复杂的软件故障往往具有多个关键触发点,只定位单个点无法确定其中的核心差异。

发明内容
本发明针对目前双样本差异比对方法的不足,提出ー种使用多祥本差异比对的软件故障分析方法。有效解决了双样本差异比对方法对复杂故障无法定位的问题,使软件故障分析工作效率显著提高。本发明所采用的技术方案
1、将被分析程序进行反汇编和动态插桩;
2、追踪和记录待分析程序的执行指令流,构建程序的以基本块为最小単位的控制流图,基本块定义为执行指令流中上一个跳转指令到下一个跳转指令之间的指令集合;
3、选取数据处理入口点作为对比的基点,构建多祥本差异树模型,将多个样本两两分组做控制流图对比,找到其中的关键指令流分支点,获得错误数据输入点到各个差异点之间的关键路径。本发明的有益效果
I、本发明使用多祥本差异比对的软件故障分析方法,通过构建多祥本差异树模型,采用程序切片分析方法,能够快速定位错误数据注入点和异常触发点之间的关键路径,提高了软件故障分析的准确性。2、本发明使用多祥本差异比对的软件故障分析方法,有效解决了双样本差异比对方法对复杂故障无法定位的问题,使软件故障分析工作效率显著提高。


图I为3个不同样本的差异点示意 图2为将被分析程序进行基本块划分的流程 图3为将被分析程序进行动态插桩和指令流追踪的流程 图4为基于基本块差异点比对流程图。
具体实施例方式实施例一參见图1,本发明使用多祥本差异比对的软件故障分析方法,其步骤包括
1)将被分析程序进行反汇编和动态插桩;
2)追踪和记录待分析程序的执行指令流,构建程序的以基本块为最小単位的控制流图,基本块定义为执行指令流中上一个跳转指令到下一个跳转指令之间的指令集合;
3)选取数据处理入口点作为对比的基点,构建多祥本差异树模型,将多个样本两两分组做控制流图对比,找到其中的导致控制流走向不同分支的关键差异点,获得错误数据输入点到各个差异点之间的关键路径。实施例ニ 參见图2,本实施例的使用多样本差异比对的软件故障分析方法,与实施例一不同的是进ー步的,步骤I)中,对ニ进制数据流按照x86指令集规范,逆向还原为汇编代码,按照跳转指令将汇编代码划分为多个基本块,其流程如下
(I)对可执行文件的PE结构进行解析,包括可执行文件的加载基址、需要加载的模块名称、块表(Section Table)、文件大小、对齐方式、对齐粒度、输入表(Import Table)输出表(Export Table)等信息。(2)识别导入导出函数,将PE文件结构与反汇编输出的信息结合,识别出可执行文件的导入函数和导出函数,包括它们的函数名及其地址,并为指令流追踪提供数据。(3)识别程序的PE结构和函数调用关系,以跳转指令为特征划分ニ进制代码基本块,建立动态调试框架。基本块有多种划分原则,如根据交叉引用关系划分、根据跳转指令划分等。其中根据交叉引用关系划分基本块的方法分析反汇编代码之间的交叉引用关系,需要在分析完整个PE文件之后进行,并且速度较慢。这里采用根据跳转指令划分基本块的方法,以每个跳转指令如JMP、CALL、RET等为划分边界,速度较快,并且符合本方法的实际需求,也为步骤ニ的指令流追踪和记录提供了较为方便的方法。(4)识别函数调用关系
函数调用一般以CALL指令开始,以RET指令結束,因此以这两条指令为识别依据。实施例三參见图3,本实施例使用多样本差异比对的软件故障分析方法,与实施例ニ不同的是将被分析程序进行动态插桩的流程如下I)建立动态调试框架按照微软提供的Windows系统软件调试框架的规范建立标准的调试框架,框架内部设置内存断点、环境上下文取样、指令流按基本块进行追踪和记录调试特性;
2)指令流单步追踪、条件追踪和数据流读与追踪。具体包括如下步骤
(I)建立动态调试框架按照微软提供的Windows系统软件调试框架的规范建立标准的调试框架,框架内部根据实际需求增设各种调试特性,如内存断点、环境上下文取样、指令流按基本块进行追踪和记录等特性。(2)指令流单步追踪、条件追踪和数据流读与追踪 步骤101 :根据配置启动被调试进程,加入调试參数等信息;
步骤102 :设置用户指定的监视断点,通过SetInt3BreakPoint函数完成,该函数向指 定内存地址写入Oxcc字节,并保存原字节数据;
步骤103 :进入调试循环,等待调试事件。使用WaitForDebugEvent函数来等待并处理调试事件。dwDebugEventCode指定了发生的调试事件类型,主要处理其中的异常调试事件、进程创建和结束事件、线程创建和结束事件、DLL加载和卸载事件、调试字符串输出事件、系统调试事件等。步骤104 :根据不同的调试事件进入相应的处理例程。可分别处理以下事件
INT 3中断事件
还原断点处的指令数据,该数据在设置断点SetInt3BreakPoint函数中保存;记录断点的上下文环境信息,包括寄存器值、相关栈数据等,如果中断指令包含内存操作数,保存相关内存数据;设置DR6寄存器为单步运行。单步中断事件(SINGLE_STEP)
此中断专门用来实现内存断点和指令流记录功能,其中内存断点由DR1、DR2寄存器保存,指令流记录断点由DRO寄存器保存。如果是内存断点,记录内存数据;
如果是监视断点设置的单步中断,说明监视断点已经执行完成,恢复断点为Oxcc字
节;
如果是指令流记录断点,说明目前到达了ー个基本块的末尾,需要捜索下ー个基本块的边界。成果捜索到边界后,将硬件断点寄存器DRO重新设置为边界地址。异常事件
说明被调试进程发生了异常,需要记录异常的类型,如读写异常、非法指令异常等,以及异常的上下文环境,包括SHl链表、堆分配情况等。同时中断调试程序,退出调试循环。步骤105 :恢复进程继续执行。当程序使用WaitForDebugEvent函数获取了ー个事件并处理以后,被调试进程还处于挂起状态,需要调用ContinueDebugEvent函数恢复进程执行。如果被调试进程已结束,则退出循环。实施例四本实施例使用多样本差异比对的软件故障分析方法,与前述实施例不同的是步骤2)中,指令流记录和追踪的步骤如下
步骤201 :还原监视断点,如果不还原会影响到基本块的判断。
步骤202 :读取1024个字节的内存数据,一般ー个基本块大小不过超过1024个字
节,如果由特殊情况大于该大小,可重复读取。步骤203 :对读取的内存数据逐跳进行指令解析,如果有跳转指令,则找到基本块边界。跳转指令包括CALL/RET/JMP/INT/SYSENTER等。步骤204 :将下ー个基本块中的指令记录到CODEBLOCK链表中,该链表是ー个单向链表,集合了记录的所有指令流,并按调用关系确定父子函数的层次。步骤205 :恢复监视断点的INT 3指令。实施例五參见图4,本实施例使用多祥本差异比对的软件故障分析方法,与前述各实施例不同的是步骤3)中,
1)对于网络通信类程序,将recV、recVfr0m函数设置为基点;如果是文件处理类程序, 将createfile、readfile等函数设置为基点,选取数据处理入口点作为对比的基点;
2)分别依次读取两个不同样本的指令流记录文件,构建多祥本差异树模型;分别依次读取两个不同样本的指令流记录文件,如共有4个样本,则将样本1、2,样本1、3,和样本I、4,样本2、3,样本2、4,样本3、4各两两分为ー组;
3)对每ー组建立两个CODEBLOCK链表cl和c2,比较cl和c2的第一个基本块中的内容,包括(I)基本块起始地址,(2)指令操作码,(3)指令操作数的值,如果是寄存器操作,检查寄存器值是否相同,如果是内存操作,检查内存地址和地址指向的当前内容是否相同;如果相同,进入步骤4 ;否则进入步骤5 ;
4)根据当前基本块定位下ー个基本块,重复步骤3;
5)找到关键分支点,进行下一组比较;
6 )获得数据输入点到各个差异点之间的关键路径。
权利要求
1.ー种使用多祥本差异比对的软件故障分析方法,其步骤包括 1)将被分析程序进行反汇编和动态插桩; 2)追踪和记录待分析程序的执行指令流,构建程序的以基本块为最小単位的控制流图,基本块定义为执行指令流中上一个跳转指令到下一个跳转指令之间的指令集合; 3)选取数据处理入口点作为对比的基点,构建多祥本差异树模型,将多个样本两两分组做控制流图对比,找到其中的导致控制流走向不同分支的关键差异点,获得错误数据输入点到各个差异点之间的关键路径。
2.根据权利要求I所述的使用多祥本差异比对的软件故障分析方法,其特征是步骤I)中,对ニ进制数据流按照x86指令集规范,逆向还原为汇编代码,按照跳转指令将汇编代码划分为多个基本块的流程如下 1)对可执行文件的PE结构进行解析, 2)将PE文件结构与反汇编输出的信息结合,识别出可执行文件的导入函数和导出函数; 3)识别程序的PE结构和函数调用关系,以跳转指令为特征划分ニ进制代码基本块,建立动态调试框架。
3.根据权利要求2所述的使用多祥本差异比对的软件故障分析方法,其特征是将被分析程序进行动态插桩的流程如下 1)建立动态调试框架按照微软提供的Windows系统软件调试框架的规范建立标准的调试框架,框架内部设置内存断点、环境上下文取样、指令流按基本块进行追踪和记录调试特性; 2)指令流单步追踪、条件追踪和数据流读与追踪。
4.根据权利要求1、2或3所述的使用多祥本差异比对的软件故障分析方法,其特征是步骤2)中,指令流记录和追踪的步骤如下 1)还原监视断点, 2)读取ー个基本块的内存数据, 3 )对读取的内存数据逐条进行指令解析,如果有跳转指令,则找到基本块边界, 4)将下ー个基本块中的指令记录到C0DEBL0CK链表中,并按调用关系确定父子函数的层次, 5)恢复监视断点。
5.根据权利要求4所述的使用多祥本差异比对的软件故障分析方法,其特征是步骤3)中, 1)对于网络通信类程序,将数据包接收API函数设置为基点;如果是文件处理类程序,将文件内容读取API函数设置为基点,选取数据处理入口点作为对比的基点; 2)分别依次读取两个不同样本的指令流记录文件,构建多祥本差异树模型; 3)对每ー组建立两个C0DEBL0CK链表cl和c2,比较cl和c2的第一个基本块中的内容,包括(I)基本块起始地址,(2)指令操作码,(3)指令操作数的值,如果是寄存器操作,检查寄存器值是否相同,如果是内存操作,检查内存地址和地址指向的当前内容是否相同;如果相同,进入步骤4 ;否则进入步骤5 ; 4)根据当前基本块定位下ー个基本块,重复步骤3;.5)找到关键分支点,进行下一组比较; . 6 )获得数据输入点到各个差异点之间的关键路径。
6.根据权利要求1、2或3所述的使用多祥本差异比对的软件故障分析方法,其特征是步骤3)中, . 1)对于网络通信类程序,将数据包接收API函数设置为基点;如果是文件处理类程序,将文件内容读取API函数设置为基点,选取数据处理入口点作为对比的基点; .2)分别依次读取两个不同样本的指令流记录文件,构建多祥本差异树模型; .3)对每ー组建立两个CODEBLOCK链表cl和c2,比较cl和c2的第一个基本块中的内容,包括(I)基本块起始地址,(2)指令操作码,(3)指令操作数的值,如果是寄存器操作,检查寄存器值是否相同,如果是内存操作,检查内存地址和地址指向的当前内容是否相同;如果相同,进入步骤4 ;否则进入步骤5 ; . 4)根据当前基本块定位下ー个基本块,重复步骤3; . 5)找到关键分支点,进行下一组比较; .6 )获得数据输入点到各个差异点之间的关键路径。
全文摘要
本发明涉及一种计算机技术领域的软件分析方法,特别是涉及一种使用多样本差异比对的软件故障分析方法。其步骤包括1)将被分析程序进行反汇编和动态插桩;2)追踪和记录待分析程序的执行指令流,构建程序的以基本块为最小单位的控制流图;3)选取数据处理入口点作为对比的基点,构建多样本差异树模型,将多个样本两两分组做控制流图对比,找到其中的关键指令流分支点,获得错误数据输入点到各个差异点之间的关键路径。本发明软件故障分析方法有效解决了双样本差异比对方法对复杂故障无法定位的问题,使软件故障分析工作效率显著提高。
文档编号G06F11/36GK102789419SQ20121025170
公开日2012年11月21日 申请日期2012年7月20日 优先权日2012年7月20日
发明者任栋, 尹中旭, 张咪, 彭建山, 方圆, 杨欣, 王振兴, 魏强 申请人:中国人民解放军信息工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1