[发明专利]一种动态的二进制代码测试用例生成方法有效
申请号: | 201210243495.1 | 申请日: | 2012-07-13 |
公开(公告)号: | CN102799529A | 公开(公告)日: | 2012-11-28 |
发明(设计)人: | 李舟军;马金鑫;忽朝俭;章张锴 | 申请(专利权)人: | 北京航空航天大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京慧泉知识产权代理有限公司 11232 | 代理人: | 王顺荣;唐爱华 |
地址: | 100191*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 动态 二进制 代码 测试 生成 方法 | ||
技术领域
本发明涉及到一种动态的二进制代码测试用例生成方法,可直接运行于Windows平台,且不需要被测试程序的源码,可在运行时生成新的输入以探测新的路径,适用于软件测试、漏洞挖掘、逆向工程等领域。
背景技术
传统软件测试方法一般使用黑盒Fuzz测试,通过构造一组随机输入传递给程序,直到程序崩溃。这种方法较盲目,既无法获知哪些程序路径已经被执行,也无法有导向性地构造输入,使程序可执行到未被遍历过的路径。测试过程中的大部分时间都在重复执行着同样的路径,使测试时间成本过高。源码级的测试可以帮助程序员发现很多由于代码风格或错误的语法语义引起的BUG,但存在几个缺点:1)无法发现程序运行时的BUG;2)在很多情况下,源码并不是可及的;3)需对每一类程序设计语言分别考虑。
对于软件测试、漏洞挖掘等领域,往往需要考虑代码覆盖问题,尽可能多地覆盖二进制代码的执行路径,可以提高发现程序代码中BUG的可能性。然而,由于二进制代码中的分支数量非常多,使获取某一执行路径所对应的输入成为最难的研究问题之一。为解决这个问题,学术界提出了一种新的概念,符号执行,即把输入作为符号,然后通过静态解释源码的形式来收集约束,遇到分支时,同时展开两条路径,继续向下进行。符号执行的误报率极低,但是也存在一些弊端:需要对未解释的函数进行建模,状态空间过大,效率较低。
近年来,国外出现了一些基于动态执行路径,符号与具体执行混合的方法所实现的工具,如DART、CUTE、Sage、Catchconv、Fuzzgrind等。其中,DART与CUTE同宗,它们使用同样的中间语言、插装方式及求解方法。Catchconv与Fuzzgrind为开源工具,都使用Valgrind作为其插装框架,只有微软的Sage是运行在Windows上,但未发布出来。在Linux下,大多数软件都为开源软件,可以使用很多源代码分析工具来检查源码中的错误,且在普通用户操作系统中,Windows系统占绝大比例,且大多程序都是源码无法获取,因此,Windows平台下的二进制代码路径探测的意义更为重大。
本发明沿用这些工具的基本思想,即符号执行与具体执行结合的思路,采用了一种新的实现方案,实现动态的二进制代码插装工具收集二进制代码的运行时信息,使用VEX中间语言描述路径约束,使用STP定理证明器作为求解器,把这几种现有的工具有机结合起来,再辅助以提出的路径约束变异算法及同级分支路径变异策略,实现了Windows下动态的二进制代码测试用例自动生成工具。
发明内容
有鉴于此,本发明的目的就是提供一种动态的二进制代码测试用例生成方法,它是在Windows平台构建一种可以自动化地探测二进制代码执行路径的方案,通过对二进制代码执行过程的观察,获得其执行的路径约束。再使用求解器计算执行其它路径的输入,从而达到提高路径覆盖率的目的。
为达到上述目的,本发明的技术方案是这样实现的:
一种动态的二进制代码测试用例生成方法,该方法的步骤包括:
步骤A.实现二进制代码运行时的动态插装框架。可以观察二进制的执行过程;
步骤B.根据动态插装框架收集到的动态运行时信息,如指令、寄存器、内存访问等信息,把二进制代码翻译成中间语言。
步骤C.根据动态插装框架中记录的输入点信息,将输入点作为符号,传播与输入点相关的执行过程,在每个分支处收集路径约束。
步骤D.将收集到的路径约束,通过变异路径算法得到新的路径约束,将该路径约束转化为求解器可识别的查询语句。
步骤E.使用求解器计算新路径约束中,输入需满足的条件,再借助动态插装框架把新产生的输入交给二进制代码再次执行。
其中,步骤A中所述的二进制代码为Windows平台下的x86机器代码;所述的二进制代码的动态插装框架,包括:
A1.在每条指令执行完成后插装;
A2.在每个线程开始时插装;
A3.在每个动态链接库被加载时插装;
A4.记录每条指令的执行上下文;
A5.记录每次内存访问信息;
A6.记录分支指令是否被执行;
其中,步骤B所述的中间语言中,包括三种存储介质:
B11.临时变量,在每个基本块中临时申请,用于实现静态单赋值,为寄存器与内存间的媒介;
B12.寄存器,与机器指令中的寄存器相同,读写寄存器使用中间语言中的Get和Put操作完成;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京航空航天大学,未经北京航空航天大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210243495.1/2.html,转载请声明来源钻瓜专利网。
- 上一篇:老龄人专用镜笔组合
- 下一篇:一种多功能自动无尘粉笔