一种新的使用逆向扩展控制流图的静态函数识别方法

文档序号:6505744阅读:145来源:国知局
一种新的使用逆向扩展控制流图的静态函数识别方法
【专利摘要】一种新的使用逆向扩展控制流图的静态函数识别方法,属于软件逆向工程领域。所述方法包括如下步骤:步骤1:建立区域逆向扩展控制流图的集合;步骤2:对逆向扩展控制流图去噪,删除构建过程中搜索出的非编译器能生成的节点;步骤3:删除和合并逆向扩展控制流图;步骤4:在逆向扩展控制流图中识别函数入口;步骤5:得到指定区域中多个函数的识别结果。与传统方法不同,本发明以函数的返回指令作为识别特征,以函数返回指令节点作为逆向搜索起点构建逆向扩展控制流图,能够在指定二进制代码区域中识别多个函数,并且能够有效识别传统静态识别方法无法识别的无特定头字节特征及无交叉引用的函数。
【专利说明】一种新的使用逆向扩展控制流图的静态函数识别方法
【技术领域】
[0001]本发明属于软件逆向工程领域,涉及一种使用逆向扩展控制流图的静态函数识别方法。
【背景技术】
[0002]二进制代码审查是针对二进制代码进行的安全审计过程。一定规模的软件难免会使用第三方组件。而第三方组件往往缺乏源代码。如微软系统动态链接库。欲对这样的软件进行代码审查,逆向工程手段几乎是唯一选择。另一方面,当前恶意代码越发猖獗,严重威胁计算机系统安全,恶意代码的检测对于提高计算机系统安全尤为重要。但是绝大部分恶意代码是无法获取到源代码的,因此逆向工程几乎也是唯一的分析手段。
[0003]逆向工程的主要步骤为反汇编,识别函数及库函数、变量、结构体等高级语言元素。最后识别各函数的操作语义,通过分析函数间的交叉引用来进一步增强对整个程序语义的理解。由上述步骤可以看出,识别函数是整个逆向工程里至关重要的一个环节。传统静态识别方法使用函数开头字节特征及函数间交叉引用信息来识别函数。在二进制代码中往往大量存在无显著特征和交叉引用的函数,因此传统静态识别方法无法有效识别此类函数。

【发明内容】

[0004]为了解决在指定二进制代码区域中识别无显著特征和交叉引用的多个函数的问题,本发明提供了一种新的使用逆向扩展控制流图的静态函数识别方法。
[0005]本发明为解决其技术问题所采用的技术方案的基本思想是:对于指定的二进制代码区域,先假设所有符合函数返回指令(一般为RET指令)特征的地址都是函数返回地址,然后从这些函数返回地址自底向上构造对应的逆向扩展控制流图(Reverse ExtendedControl Flow Graph,RECFG)0所谓逆向扩展控制流图是指这样一种控制流图,节点代表指令,边代表指令控制依赖,但不同于传统的控制流图的是,它从函数返回指令节点逆向构建一个扩展的控制流图,图中节点的前驱为其前面所有可能存在的指令。图的逆向搜索起点是函数返回指令,它包含了待识别函数的控制流图,因此传统的控制流图是RECFG的子图。对于任意两个RECFG,它们有且仅有三种关系:1)相互独立,即它们是互不连通的图;2)同为一个图的子图,即它们同属一个函数;3)冲突,即一个图的搜索起点(函数返回指令)是另外一个图的某指令的操作数的一部分。对于符合关系2)的两个图,可以将它们合并。对于存在冲突关系的两个图,则采用多属性决策理想点法删除一个图,解决冲突。最终所有独立的RECFG都对应于一个函数。一个函数的入口点只有一个,它可能是一个RECFG中的任意节点。从该节点出发遍历RECFG得到的子图,实际是以此节点为入口点的函数控制流图。函数识别问题因此而转换为函数入口点的识别问题。最终根据每个节点对应的控制流图的属性,使用多属性决策理想点法识别出函数的入口点。
[0006]本发明的使用逆向扩展控制流图的静态函数识别方法,包括如下步骤: 步骤1:建立区域逆向扩展控制流图的集合;
步骤2:对逆向扩展控制流图去噪,删除构建RECFG过程中搜索出的非编译器能生成的节点;
步骤3:删除和合并逆向扩展控制流图;
步骤4:在逆向扩展控制流图中识别函数入口 ;
步骤5:得到指定区域中多个函数的识别结果。
[0007]与传统方法不同,本发明以函数的返回指令作为识别特征,以函数返回指令节点作为逆向搜索起点构建逆向扩展控制流图,能够在指定二进制代码区域中识别多个函数,并且能够有效识别传统静态识别方法无法识别的无特定头字节特征及无交叉引用的函数。
【专利附图】

【附图说明】
[0008]图1是本发明的流程示意图;
图2是逆向扩展控制流图构造算法;
图3是逆向扩展控制流图构造算法中的逆向搜索算法;
图4是逆向扩展控制流图示意图;
图5是图4的识别结果。
[0009]【具体实施方式】
下面结合附图对本发明的技术方案作进一步的说明,但并不局限如此,凡是对本发明技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,均应涵盖在本发明的保护范围中。
[0010]【具体实施方式】一:本实施方式中的使用逆向扩展控制流图的静态函数识别方法,首先对于指定的二进制代码区域,从所有符合函数返回指令特征的地址构建对应的逆向扩展控制流图;通过计算图的三个属性:指令长度总和、圈复杂度和全位数指令百分比,并使用多属性决策理想点法解决图中可能存在的冲突;最后将函数识别转换为函数入口点的识别问题,即对每个图的每个无前驱节点,计算其遍历得到的子图的三个属性,使用理想点法决策出函数入口点得到最终的函数识别结果。具体步骤如下:
步骤1:建立区域逆向扩展控制流图的集合:
对指定的代码区域,从所有符合函数返回指令特征的地址自底向上构造对应的逆向扩展控制流图(Reverse Extended Control Flow Graph,RECFG),形成区域逆向扩展控制流图的集合。
[0011]如图2所示,RECFG的构造过程分为两大步。第一步,逆向构造初始图:首先将搜索起点加入图中,反复对图中新加入的点搜索其所有可能的前驱。图3给出了搜索RECFG中一个点r所有可能前驱的算法,具体检测所有可能长度的指令是否为r的前驱:如果一个指令的字节与点r对应指令地址前(低地址)的相同长度的字节一致,则此指令为点r的一个前驱。第二步,对于图中的分支指令的跳转目标,使用现有常见的基于控制流的递归遍历方法,将从这些跳转目标开始的控制流图加入到当前RECFG中。图4给出了一个RECFG示意图。
[0012]逆向扩展控制流图RECFG是本发明提出的一种用于函数识别的中间表示,它是指这样一种控制流图,节点代表指令,边代表指令控制依赖,但不同于传统的控制流图的是,逆向扩展控制流图中节点的前驱为其前面所有可能存在的指令。
[0013]步骤2:对逆向扩展控制流图去噪,删除构建RECFG过程中搜索出的非编译器能生成的节点:
步骤21:删除非法条件分支指令,包括无前驱节点的条件分支指令、跳转目标为非法内存地址的条件分支指令、两条分支中存在字节重叠指令的条件分支指令;
步骤22:删除不以函数返回指令、跳转指令、CALL指令为结尾的路径;
步骤23:检查每条路径,删除成对指令不匹配的节点(如路径上有pushad无popad)及其所有前驱;
步骤24:删除高权限指令及其所有前驱,包括中断相关指令、停机指令、CPU特殊寄存器操作指令;
步骤25:删除无实际意义的指令,包括Ν0Ρ、断点指令、加O指令、减O指令、与O的逻辑或、移动次数为O的移位操作指令、源操作数和目的操作数相同的传送指令; 步骤26:将包含逆向搜索起点的子图作为新的逆向扩展控制流图;
步骤27:重复步骤26,直至图不再变化为止。
[0014]步骤3:删除和合并逆向扩展控制流图:
步骤31:枚举区域RECFG集合中任意两个RECFG,若一个图的逆向搜索起点(函数返回指令)在另一个图中,从区域RECFG集合中删除节点数较少的一个图;
步骤32:枚举区域RECFG集合中任意两个RECFG,若一个图的逆向搜索起点(函数返回指令)为另一图中某点对应指令的一部分,则根据图的指令长度总和、圈复杂度、全位数指令百分比,使用多属性决策理想点法删除相对较差的一个图。
[0015]步骤4:在逆向扩展控制流图中识别函数入口:
步骤41:从图中每个没有前驱的点出发遍历得到以此点为入口点的控制流图;
步骤42:根据图的指令长度总和、圈复杂度、全位数指令百分比,使用多属性决策理想点法决策出最优的控制流图作为函数的识别结果(如图5所示)。
[0016]步骤5:得到指定区域中多个函数的识别结果。
[0017]【具体实施方式】二:本实施方式与【具体实施方式】一不同的是,提供一种步骤32和步骤42所使用的多属性决策理想点法,其包括如下步骤:
(O计算决策矩阵:
取评价指标分别为:图的指令长度之和、圈复杂度、全位数指令百分比。其中,全位数指令是指CPU—次能处理的最大位数的指令。这3个评价指标的权重-(7=1,2,3)分别为
0.5、0.38、0.12。
[0018]假设有《个可选方案,则取3个评价指标的决策矩阵为:
【权利要求】
1.一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述方法包括如下步骤: 步骤1:建立区域逆向扩展控制流图的集合; 步骤2:对逆向扩展控制流图去噪,删除构建逆向扩展控制流图过程中搜索出的非编译器能生成的节点; 步骤3:删除和合并逆向扩展控制流图; 步骤4:在逆向扩展控制流图中识别函数入口 ; 步骤5:得到指定区域中多个函数的识别结果。
2.根据权利要求1所述的一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述步骤I的具体过程如下: 对指定的代码区域,从所有符合函数返回指令特征的地址自底向上构造对应的逆向扩展控制流图,形成区域逆向扩展控制流图的集合。
3.根据权利要求2所述的一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述逆向扩展控制流图的构造过程分为两步: 第一步,逆向构造初始图:首先将搜索起点加入图中,反复对图中新加入的点搜索其所有可能的前驱; 第二步,对于图中的分支指令的跳转目标,使用现有常见的基于控制流的递归遍历方法,将从这些跳转目标开始的控制流图加入到当前逆向扩展控制流图中。
4.根据权利要求1所 述的一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述步骤2用于逆向扩展控制流图去噪的步骤包括如下步骤: 步骤21:删除非法条件分支指令,包括无前驱节点的条件分支指令、跳转目标为非法内存地址的条件分支指令、两条分支中存在字节重叠指令的条件分支指令; 步骤22:删除不以函数返回指令、跳转指令、CALL指令为结尾的路径; 步骤23:检查每条路径,删除成对指令不匹配的节点及其所有前驱; 步骤24:删除高权限指令及其所有前驱,包括中断相关指令、停机指令、CPU特殊寄存器操作指令; 步骤25:删除无实际意义的指令,包括NOP、断点指令、加O指令、减O指令、与O的逻辑或、移动次数为O的移位操作指令、源操作数和目的操作数相同的传送指令; 步骤26:将包含逆向搜索起点的子图作为新的逆向扩展控制流图; 步骤27:重复步骤26,直至图不再变化为止。
5.根据权利要求1所述的一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述步骤3用于删除和合并逆向扩展控制流图的步骤包括如下步骤:步骤31:枚举区域逆向扩展控制流图集合中任意两个逆向扩展控制流图,若一个图的逆向搜索起点在另一个图中,从区域逆向扩展控制流图集合中删除节点数较少的一个图;步骤32:枚举区域逆向扩展控制流图集合中任意两个逆向扩展控制流图,若一个图的逆向搜索起点为另一图中某点对应指令的一部分,则根据图的指令长度总和、圈复杂度、全位数指令百分比,使用多属性决策理想点法删除相对较差的一个图。
6.根据权利要求1所述的一种新的使用逆向扩展控制流图的静态函数识别方法,其特征在于所述步骤4用于在一个逆向扩展控制流图中识别函数入口的步骤包括如下步骤:步骤41:从图中每个没有前驱的点出发遍历得到以此点为入口点的控制流图; 步骤42:根据图的指令长度总和、圈复杂度、全位数指令百分比,使用多属性决策理想点法决策出最优的控制流图作.为函数的识别结果。
【文档编号】G06F9/44GK103440122SQ201310291941
【公开日】2013年12月11日 申请日期:2013年7月12日 优先权日:2013年7月12日
【发明者】邱景, 苏小红, 马培军, 赵玲玲, 王甜甜 申请人:哈尔滨工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1