一种面向目标代码的程序静态分析系统技术领域
本发明涉及一种面向目标代码的程序静态分析系统。
背景技术
目前,基于源代码的程序静态分析技术,都是建立在假定的程序运行物理环境基
础之上。而通过抽象和假定的环境系统往往不能完全反映现实操作中的具体问题与情况,
而这样一个基于较好假定环境的工作方式在一定情况下将致使一些关键性质与行为无法
得到体现与保障。目标代码是编译器处理源代码后产生的代码,是在机器CPU上实际执行的
代码,包含完整的程序运行物理环境信息,具有无可替代的与实际运行情况高度一致的特
点。因此,使用面向目标代码的程序分析技术,在目标代码上进行程序分析,将可以避开诸
如编译错误和高层抽象错误等一系列问题,确保最终交付软件的正确性。
本发明提出了一种面向目标代码的程序静态分析系统,根据实际执行的二进制代
码,对程序行为进行分析,比面向源码的分析工具具有更高的保真度。
发明内容
本发明提出了一种面向目标代码的程序静态分析系统,包括:
反编译模块,用于拆解待分析目标代码文件的封装格式,反汇编目标代码,生成基
本的控制流图结构以及其他相关的信息;
中间表示精化模块,对反编译得来的信息进行处理获取更多程序细节,生成相应
的数据结构并进行精化操作;
程序分析模块,根据反编译模块和中间表示精化模块输出的信息生成待分析程序
的中间表示形式;
可视化模块,用于分析过程中各种图形和其他信息的可视化显示。
优选地,所述反编译模块包括拆装器子模块、反汇编引擎子模块、流图构建器子模
块。
优选地,所述拆装器子模块用于解除目标代码封装,其支持常用的目标代码封装
格式。
优选地,所述反汇编引擎子模块,用于将解除封装格式后的目标代码转换为汇编
代码,并且生成程序细节信息。
优选地,所述流图构建器子模块,根据反汇编引擎子模块生成的信息,构建程序基
本的控制流图。
优选地,所述中间表示精化模块包括类型发现子模块、别名分析子模块、关系分析
子模块;在分析过程中,所述类型发现子模块、别名分析子模块、关系分析子模块被迭代调
用。
优选地,所述程序分析模块包括程序图构建子模块、程序结构浏览子模块。
优选地,所述程序图构建子模块,用于生成待分析程序的中间表示形式,所述中间
表示形式包括抽象语法树、控制流图、函数调用图和系统依赖图。
优选地,所述程序结构浏览子模块,用于浏览生成的程序图形和分析得到的程序
结构。
本发明的有益效果包括:
目标代码比源代码更容易获得,相比于面向源码的程序静态分析系统,本系统的
适用范围更广;目标代码包含程序实际执行的全部信息,面向目标代码的程序分析技术比
面向源码的程序分析技术得到的结果更精确;在目标代码上执行程序分析,可以避免诸如
编译错误和高层抽象错误等一些列问题,确保最终交付程序的正确性。
附图说明
图1是本发明面向目标代码的程序静态分析系统结构图;
图2是使用本发明对ELF格式的目标代码进行静态分析的原型工具系统结构图。
具体实施方式
如图1所示,本发明公开了一种面向目标代码的程序静态分析系统,所述系统包
括:反编译模块、中间表示精化模块、程序分析模块及可视化模块。其中反编译模块以待分
析的目标代码文件作为输入,对输入文件进行拆封装格式、反编译操作,生成汇编代码、控
制流图及过程边界等信息并作为该模块的输出;中间表示精化模块根据反编译模块生成的
信息,生成相应的数据结构并进行精化操作;程序分析模块根据反编译模块和中间表示精
化模块输出的信息生成待分析程序的几种中间表示形式,包括抽象语法树、控制流图、函数
调用图和系统依赖图;可视化模块并不直接进行分析工作,而是用于分析过程中各种图形
和其他信息的可视化显示。
本发明提出的所述面向目标代码的程序静态分析系统中,所述反编译模块包括拆
装器子模块、反汇编引擎子模块、流图构建器子模块。所述拆装器子模块用于解除目标代码
封装,支持常用的目标代码封装格式,如ELF、COFF、PE等。所述反汇编引擎子模块,用于将解
除封装格式后的目标代码转换为汇编代码,并且生成函数边界、静态已知内存地址和偏移
量等程序细节信息。所述流图构建器子模块,根据反汇编引擎子模块生成的信息,构建程序
基本的控制流图。
本发明提出的所述面向目标代码的程序静态分析系统中,所述中间表示精化模块
包括类型发现子模块、别名分析子模块、关系分析子模块。在分析过程中,所述类型发现子
模块、别名分析子模块、关系分析子模块会被迭代调用,随着迭代次数的增加,所获得的程
序信息越来越多,在此基础上生成的控制流图等程序图也越来越完整。
本发明提出的所述面向目标代码的程序静态分析系统中,所述程序分析模块包括
程序图构建子模块、程序结构浏览子模块。所述程序图构建子模块,用于生成待分析程序的
几种中间表示形式,包括抽象语法树、控制流图、函数调用图和系统依赖图。所述程序结构
浏览子模块,用于浏览生成的程序图形和分析得到的程序结构。
具体而言,反编译模块用于拆解待分析目标代码文件的封装格式,反汇编目标代
码,生成基本的控制流图结构以及其他相关的信息(如函数边界信息、静态已知内存地址和
偏移量等)。封装格式是可执行文件的内容组织方式,只有按照这种组织方式才能找到可执
行程序指令的起始和中止位置,才能保证下一步反汇编操作的正确性。反汇编操作将二进
制指令翻译成其对应的汇编代码,同时计算出静态已知内存地址和偏移量等相关信息。根
据翻译出来的信息,流图构建器子模块对程序进行基本块划分,构建控制流图,生成调用关
系。
中间表示精化模块,在反编译模块产生的信息基础上进行分析计算,得到诸如变
量别名、类型、结构等信息,使得反编译模块中流图构建器子模块生成的控制流图更加完
整。在反编译阶段,可以从可执行文件中恢复出粗粒度的变量信息,这对于程序分析来说远
远不够。中间表示精化模块会被反复的迭代调用,直到计算出的程序信息足够精细。在得到
反编译模块传过来的信息后,中间表示精化模块会首先进行类型发现操作,识别出程序中
的聚类结构(如结构体和数组),然后进行别名分析,将变量的别名识别出来,再进行关系分
析,如此循环迭代,直到达到最够的精度为止。此时,比较完整地控制流图上,每个节点都会
有变量的使用(used)集、消除(killed)集、可能消除(may-killed)集等信息。
可视化模块,用于分析过程中各种图形和其他信息的可视化显示。控制流图、调用
关系图、程序依赖图等的显示,都借助于此模块,甚至中间表示精化模块的运行过程也可以
通过此模块展现给用户。虽然此模块并不参与程序分析过程,但却直接与用户交互,向用户
呈现分析过程与结果。
下面具体讲述本发明所述面向目标代码的程序静态分析系统。
实施例1
实施例以本发明面向目标代码的程序静态分析系统的原型工具为例,实现对ELF
格式的目标代码的静态分析。
ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文
件格式。ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header
table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含
全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各
部分的位置、大小等信息由ELF头中的各项值来决定。
下面详细介绍使用本发明的原型工具对ELF格式的目标代码进行静态分析。原型
工具系统结构图如图2所示。
原型工具将目前已存在的工具IDA Pro(商业化逆向工程工具)和CodeSurfer集成
在一起,将IDA Pro作为反汇编引擎,将CodeSurfer作为程序分析图构建器和浏览器。
首先待分析的ELF文件将作为输入文件输入到IDA Pro中,IDA Pro中的反编译引
擎会根据静态已知地址和栈帧偏移量将目标代码中的一部分变量恢复出来。当然,此时恢
复的变量信息比较粗糙,比如数组和结构体等聚类结构无法被识别并恢复出来。在这些信
息的基础上,可以使用流图构建器子模块构建目标代码不完全的控制流图。
然后,反编译模块的信息被传送到中间表示精化模块中。通过反复迭代中间表示
精化模块中各种操作,数组和结构体等聚类结构变量被逐渐恢复出来,据此就能构建较为
完全的控制流图等程序结构图。在此模块结束后,可以得到控制流图中每个节点的变量的
使用(used)集、消除(killed)集、可能消除(may-killed)集等信息。
最后,使用CodeSurfer将这些结构展现出来,可以浏览的程序结构图包括:抽象语
法树、控制流图、函数调用图和系统依赖图。在此基础上可以进行更进一步的分析。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,
任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,
都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范
围为准。