一种使用收缩执行依赖图识别库函数的方法

文档序号:6519125阅读:265来源:国知局
一种使用收缩执行依赖图识别库函数的方法
【专利摘要】一种使用收缩执行依赖图识别库函数的方法,属于软件逆向工程领域。所述方法为:1)对目标函数和库函数建立执行依赖图(EDG);2)对EDG的局部EDG序列化,得到特征值序列和有序邻接矩阵;3)参照库函数EDG将目标函数和库函数EDG中有唯一点序列且不包含库函数EDG首尾的局部EDG收缩成点;4)判断库函数收缩EDG是否是目标函数收缩EDG的同构子图;5)验证识别结果是否有效。本方法不但能准确识别完整库函数,还能识别传统方法不能识别的多态及非连续字节的内联库函数,并有效缩短识别时间。
【专利说明】一种使用收缩执行依赖图识别库函数的方法
【技术领域】
[0001]本发明属于软件逆向工程领域,涉及一种使用收缩执行依赖图识别库函数的方法。
【背景技术】
[0002]逆向工程在二进制代码审查、恶意代码分析、移植代码等方面具有非常重要的应用。库函数识别是整个逆向工程里至关重要的一个环节。它不但可以大大简化分析人员的工作量,还可以用来挖掘分析人员感兴趣的代码,辅助分析人员理解二进制代码。传统库函数识别方法使用函数头字节特征造成识别率偏低,而且也无法识别内联库函数。另外库函数的实例可能是多态的或者其字节是不连续的,对于这样的库函数,传统的库函数识别方法是无法处理的。
[0003]库函数的识别是逆向工程中的关键技术。库函数识别的难点在于库函数实例的字节可能是非连续的,并且代码中的操作数可能也与库函数不同。

【发明内容】

[0004]为了解决上述两个难点,本发明提出了一种通过判断执行依赖图子图同构来识别内联库函数的新方法。
[0005]本发明提出的使用收缩执行依赖图识别库函数的方法,包括如下步骤:
步骤1:构建目标函数和库函数的执行依赖图;
步骤2:对执行依赖图中的局部执行依赖图进行序列化,得到点特征值序列和存储边信息的有序邻接矩阵;
步骤3:参照库函数执行依赖图将目标函数和库函数执行依赖图中有唯一确定的点序列且不包含库函数执行依赖图首尾的局部执行依赖图收缩成一个点;
步骤4:判断库函数的收缩执行依赖图是否是目标函数收缩执行依赖图的同构子图,其中对于未收缩的点仅比较其特征值,对于收缩的点不仅比较其特征值序列,还比较其有序邻接矩阵;
步骤5:验证目标函数收缩执行依赖图中识别出的与库函数收缩执行依赖图同构的子图是否是有效的识别结果。
[0006]执行依赖图(Execution Dependence Graph, EDG)是本发明提出的一种综合程序依赖图与控制流图的新的混合表示。通过EDG,将库函数识别问题转化为子图同构测试问题。子图同构测试是NP难问题。使用EDG的库函数识别方法,在识别复杂库函数时往往不能在规定时间内结束。在EDG的基础上,本发明提出了一种改进的EDG,即收缩执行依赖图(Contracted Execution Dependence Graph, CEDG)。一个基本块的 EDG 称为局部 EDG。一个局部EDG序列化后,若唯一对应于一个点序列,则此局部EDG的同构判断可以通过比较特征值序列和有序0-1邻接矩阵来完成。利用此特性,在EDG子图同构测试中,参照库函数执行依赖图将目标函数和库函数执行依赖图中有唯一确定的点序列且不包含库函数执行依赖图首尾的局部执行依赖图收缩成一个点。按这种方法收缩后的EDG,称为收缩执行依赖图(CEDG),然后对目标函数的CEDG和库函数的CEDG进行子图同构测试。特别的,对于完整库函数识别,因目标函数和库函数指令数相等而只需进行图同构测试,因此,库函数和目标函数的所有局部EDG都可以收缩。
[0007]本方法不但能准确识别完整库函数,还能识别传统方法不能识别的多态及非连续字节的内联库函数,并有效缩短识别时间。收缩执行依赖图方法可以在维持与不收缩方法准确率与查全率一致的情况下,有效缩短识别时间。
【专利附图】

【附图说明】
[0008]图1是本发明的流程示意图。
[0009]图2是目标函数执行依赖图示意图。
[0010]图3是库函数执行依赖图示意图。
[0011]图4是目标函数收缩执行依赖图示意图。
[0012]图5是库函数收缩执行依赖图示意图。
[0013]图6是识别结果验证不通过示意图一。
[0014]图7是识别结果验证不通过示意图二。
【具体实施方式】
[0015]下面结合附图对本发明的技术方案作 进一步的说明,但并不局限于此,凡是对本发明技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,均应涵盖在本发明的保护范围中。
[0016]【具体实施方式】一:本实施方式中的使用收缩执行依赖图识别库函数的方法,首先对目标函数和库函数建立执行依赖图;然后对执行依赖图的基本块内依赖图进行序列化;如果一个基本块内依赖图有唯一确定的点序列,则在执行依赖图中将其收缩成一个点;判断库函数的执行依赖图是否是目标函数执行依赖图的同构子图;最后验证识别结果是否有效。如图1-5所示,具体步骤如下:
步骤1:构建目标函数和库函数的执行依赖图:
执行依赖图(EDG)是本发明提出的一个综合程序依赖图与控制流图的新的混合表示。节点代表指令,边代表指令执行依赖(包括数据依赖和控制依赖)。其中数据依赖边只存在于基本块(单进单出的连续指令序列)内,控制依赖边不仅存在于基本块内,还存在于基本块间。
[0017]步骤11:对函数进行反汇编,计算指令读写集合及特征值;
步骤12:划分基本块(单进单出的连续指令序列),然后进行控制流分析,得到控制流
图;
步骤13:对基本块内的指令进行数据和控制依赖分析;
步骤14:对基本块间的末尾指令和开头指令的控制依赖分析,即对任意块末尾指令Vj与任意块开头指令如果^是&的跳转目标,或者^是条件跳转Vj的下一条指令,或者^是跳转目标且紧接Vj之后,则Vj和6存在控制依赖;
步骤15:对基本块内的执行依赖进行简化,对任意三个点V1', Vj, 若V1'与Vj, Vj与Vk,Vi与Vk有依赖,则EDG中删去(匕.,Vk)。
[0018]步骤2:对执行依赖图中局部EDG进行序列化,得到特征值序列和有序邻接矩阵: 步骤21:选取局部EDG中所有无前驱的点;
步骤22:将第一步选取的点按其对应的指令特征值从小到大的顺序进行排序后输出到点序列中;
步骤23:从局部EDG中删除第一步选取的点及其关联的边;
步骤24:重复步骤21、22、23,直至局部EDG中没有点为止;
步骤25:将点序列中的点替换为点的特征值得到特征值序列;
步骤26:遍历点序列中任意第i个和第J'个点是否在局部EDG中存在边,如果存在,则将有序邻接矩阵的第i行J'列元素标记为1,否则标记为O。
[0019]步骤3:参照库函数执行依赖图将目标函数和库函数执行依赖图中可以整体比较的局部执行依赖图收缩成一个点;
步骤4:判断库函数的收缩执行依赖图是否是目标函数收缩执行依赖图的同构子图,其中未收缩的点比较特征值,收缩的点比较特征值序列及有序邻接矩阵;
步骤5:判断目标函数收缩执行依赖图中识别出的与库函数收缩执行依赖图同构的子图是否是有效的识别结果。
[0020]【具体实施方式】二:本实施方式与【具体实施方式】一不同的是,步骤11中指令读写集合是指寄存器、标记寄存器各个标记位和内存。为避免复杂的指针别名分析,所有内存地址统一为一虚拟变量VMEM。
[0021]【具体实施方式】三:本实施方式与【具体实施方式】一不同的是,步骤11中指令特征值的计算具体步骤如下:
(1)指令标准化。标准化结果为二元组SR=(m, r),其中》为指令助记符为操作数特征值,其取值见表1:
【权利要求】
1.一种使用收缩执行依赖图识别库函数的方法,其特征在于所述方法步骤如下: 步骤1:构建目标函数和库函数的执行依赖图; 步骤2:对执行依赖图中的局部执行依赖图进行序列化,得到点特征值序列和存储边信息的有序邻接矩阵; 步骤3:参照库函数执行依赖图将目标函数和库函数执行依赖图中有唯一确定的点序列且不包含库函数执行依赖图首尾的局部执行依赖图收缩成一个点; 步骤4:判断库函数的收缩执行依赖图是否是目标函数收缩执行依赖图的同构子图,其中对于未收缩的点仅比较其特征值,对于收缩的点不仅比较其特征值序列,还比较其有序邻接矩阵; 步骤5:验证目标函数收缩执行依赖图中识别出的与库函数收缩执行依赖图同构的子图是否是有效的识别结果。
2.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述执行依赖图是依赖图与控制流图的混合表示,节点代表指令,边代表指令执行依赖。
3.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤I的具体步骤如下: 步骤11:对函数进行反汇编,计算指令读写集合及特征值; 步骤12:划分基本块,然后进行控制流分析,得到控制流图; 步骤13:对基本块内的指令进行数据和控制依赖分析; 步骤14:对基本块间的 末尾指令和开头指令的控制依赖分析,即对任意块末尾指令Vj与任意块开头指令如果^是&的跳转目标,或者^是条件跳转Vj的下一条指令,或者^是跳转目标且紧接Vj之后,则Vj和6存在控制依赖; 步骤15:对基本块内的执行依赖进行简化,对任意三个点V1', Vj, 若V1'与Vj, Vj与Vi, V1与^有依赖,则执行依赖图中删去(^,Vk)。
4.根据权利要求3所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤13包括如下步骤: (1)对基本块内任意两条指令Ki,,如果
5.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤11中指令读写集合是指寄存器、标记寄存器各个标记位和内存。
6.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤2的具体步骤如下: 步骤21:选取局部执行依赖图中所有无前驱的点; 步骤22:将第一步选取的点按其对应的指令特征值从小到大的顺序进行排序后输出到点序列中; 步骤23:从局部执行依赖图中删除第一步选取的点及其关联的边;步骤24:重复步骤21、22、23,直至局部执行依赖图中没有点为止; 步骤25:将点序列中的点替换为点的特征值得到特征值序列; 步骤26:遍历点序列中任意第i个和第j个点是否在局部执行依赖图中存在边,如果存在,则将有序邻接矩阵的第i行J列元素标记为1,否则标记为O。
7.根据权利要求3所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤11中指令特征值的计算具体步骤如下: (1)指令标准化:标准化结果为二元组SR=(m, r),其中》为指令助记符,r为操作数特征值; (2)标准化结果哈希化:先计算字符串哈希函数Zfei如,该函数的输入《是一个指令助记符,输出是与其他指令助记符不冲突的16位整数;然后,通过招作幻=Hash (m) / (r?16)将该16位整数与左移16位的r值组合成一个32位的整数作为标准化后指令的特征值。
8.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤3中的收缩执行依赖图算法输入欲收缩的执行依赖图G1和参照执行依赖图&,输出收缩后的执行依赖图,具体步骤如下: (1)标记&中的所有局部执行依赖图为收缩,除了没有唯一确定的点序列的局部执行依赖图以外; (2)识别G1中的包含任一G2头的所有指令的局部执行依赖图,所谓头是指没有前驱的局部执行依赖图; (3)识别G中的包含任一&尾的所有指令的局部执行依赖图,所谓尾是指没有后继的局部执行依赖图; (4)检查步骤(2)和步骤(3)中识别出的局部执行依赖图之间的连通性,连通的局部执行依赖图标记为不收缩; (5)将G7中标记为收缩的局部执行依赖图替换为一个点,原来指向局部执行依赖图入口的边改为指向替换点,原来从局部EDG出口的出发的边改为从替换点出发。
9.根据权利要求1所述的一种使用收缩执行依赖图识别库函数的方法,其特征在于所述步骤5的具体步骤如下: (O依次选取一个目标函数执行依赖图中的但不在库函数实例中的点; (2)如果此点在实例的地址范围之外,若实例中存在一点有控制依赖于此点,则返回FALSE,否则返回TRUE ; (3)如果此点在实例的地址范围之内,实例中存在一点有数据依赖于此点,但此点没有数据依赖于实例中其他点,则返回TRUE,否则返回FALSE。
【文档编号】G06F21/14GK103577728SQ201310572174
【公开日】2014年2月12日 申请日期:2013年11月16日 优先权日:2013年11月16日
【发明者】邱景, 苏小红, 马培军, 赵玲玲, 王甜甜 申请人:哈尔滨工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1