一种面向C++二进制文件的控制流图生成方法及电子装置制造方法及图纸

技术编号:33546872 阅读:51 留言:0更新日期:2022-05-26 22:41
本发明专利技术提供一种面向C++二进制文件的控制流图生成方法及电子装置,包括:从C++二进制文件中提取虚函数表与符号表;依据所述符号表获取每一虚函数表中的析构函数,并将虚函数表与相应析构函数进行配对;对每一虚函数表进行交叉引用查询,得到构造函数;通过构造函数、析构函数与直接或间接调用构造函数或析构函数的函数,生成控制流图。本发明专利技术采用过程间的方法来解决数据间接引用的问题,从而可以识别虚继承;以构造函数或析构函数为起点,从整体角度进行分析,构造对象内存布局,从而可以抵抗构造函数内联带来的影响;只对构造函数和析构函数及其相关的函数生成控制流图,适用于分析大型的C++二进制文件。型的C++二进制文件。型的C++二进制文件。

【技术实现步骤摘要】
一种面向C++二进制文件的控制流图生成方法及电子装置


[0001]本专利技术属于软件逆向分析
,具体涉及一种面向C++二进制文件的控制流图生成方法及电子装置。

技术介绍

[0002]控制流图(Control Flow Graph,CFG)是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向,也能反映一个过程的实时执行过程。
[0003]从Frances E.Allen于1970年提出控制流图的概念之后,控制流图成为了编译器优化和静态分析的重要工具。面对无法获取源码的程序,研究人员不得不需要通过逆向工程的手段对程序代码进行分析。而在分析过程中,一个精确而完善的控制流图能过帮助研究人员对程序结构进行直观的认识,以辅助其进一步的深入分析与理解。
[0004]为获取更利于分析的控制流图,众多科研人员对此进行了研究。例如中国专利申请CN106775913A公开的一种目标代码控制流图生成方法、中国专利申请CN103577242A公开的针对已调度汇编代码的控制流图重构方法、中国专利申请CN108958793A公开的一种基于改进GN算法的程序控制流图划分方法及中国专利申请CN109408034公开的一种面向对象程序的控制流图构造方法等。
[0005]C++语言由于其高性能、稳定和多态的特性,一直是大型商业软件的主流选择。由TIOBE发布的2002年到现在的编程语言热度发展趋势统计图可知,C++语言一直稳定在前三的位置。但由于现有控制流图的生成方案中,由于下述原因导致控制流图的建立不准确,无法分析大型的二进制文件:
[0006]1)现有方法将虚函数表与构造函数进行配对,在编译优化的情况下,基类的构造函数可能内联进派生类的构造函数中,或者构造函数全部内联进普通函数中,这样将导致该配对方法失效;
[0007]2)现有方法根据连续地址空间上的OffsetToTop字段来进行虚函数表的合并,并且一个虚函数表只与一个类绑定,然而在编译优化的情况下此类方法并不适用;这是因为在编译优化的情况下,同一个类的不同虚函数表可能分布在不连续的地址空间;不同的类可能共享相同的虚函数表,因此会导致类的缺失;
[0008]3)现有方法通过遍历所有函数来搜索构造函数,这在面对大型二进制文件时会显著增加分析时间的开销;
[0009]4)现有方法无法处理数据间接引用的问题,导致无法处理虚基类表读写操作分别在不同函数的情况,进而无法识别虚继承,从而在编译优化的情况下,构造函数内联情况会扰乱控制流的分析;
[0010]5)现有方法会对所有函数生成CFG,这在分析大型二进制文件时会极大的增加时间开销。

技术实现思路

[0011]为解决上述问题,本专利技术提出一种面向C++二进制文件的控制流图生成方法及电子装置,依据C++二进制接口(ABI)实现的特点,依据构造函数与析构函数,生成一种能够反映C++二进制文件中虚继承关系的控制流图。
[0012]为达到上述目的,本专利技术采用以下技术方案:
[0013]一种面向C++二进制文件的控制流图生成方法,其步骤包括:
[0014]1)从C++二进制文件中提取虚函数表与符号表;
[0015]2)依据所述符号表获取每一虚函数表中的析构函数,并将虚函数表与相应析构函数进行配对;
[0016]3)对每一虚函数表进行交叉引用查询,得到构造函数;
[0017]4)通过构造函数、析构函数与直接或间接调用构造函数或析构函数的函数,生成控制流图。
[0018]进一步地,通过以下步骤提取虚函数表:
[0019]1)运行时类型信息;
[0020]2)依据运行时类型信息指针获取的附加信息,得到虚函数表信息。
[0021]进一步地,通过以下步骤提取符号表:
[0022]1)通过虚函数表,得到虚函数表地址与虚函数表包含的虚函数地址;
[0023]2)通过C++二进制文件中提取的虚基类表,得到虚基类表地址与虚基类表字段内容;
[0024]3)根据虚函数表地址、虚函数地址、虚基类表地址与虚基类表字段内容,得到符号表。
[0025]进一步地,通过以下策略获取每一虚函数表中的析构函数:
[0026]1)遍历每一虚函数表中的函数,得到具有虚函数表内存覆写操作的第一函数;
[0027]2)依据所述符号表,获取第一函数的第一后面指令或调用第一函数的上层函数的第二后面指令中具有delete操作的第一函数,得到析构函数。
[0028]进一步地,覆写操作包括:mov qword[rsi+0x8]或vftptr;delete操作包括:call delete()。
[0029]进一步地,通过以下步骤获取所述构造函数:
[0030]1)交叉引用查询每一虚函数表,排除掉析构函数,获取第三函数;
[0031]2)遍历第三函数,获取具有虚函数表内存覆写操作的第四函数;
[0032]3)获取第四函数的第一前序指令和调用第三函数的上层函数的第二前序指令中具有new操作的第四函数,得到构造函数。
[0033]进一步地,覆写操作包括:mov qword[rsi+0x8]或vftptr;new操作包括:call new()。
[0034]进一步地,通过以下步骤生成控制流图:
[0035]1)根据跳转语句,对构造函数地址与析构函数地址组成的集合中每一函数进行基本块划分;
[0036]2)将包含直接跳转语句或条件跳转语句的基本块,与跳转目标所在的基本块连接;
[0037]3)将包含非系统调用的call指令的基本块与相应call指令指向函数地址所在的基本块连接,其中将不存在集合中的相应call指令指向函数地址所在的基本块,添加进集合;
[0038]4)若跳转语句的跳转目标地址在已分析基本块中,且不是已分析基本块的起始地址或结束地址,则将该已分析基本块对于跳转目标地址进行分割;
[0039]5)分别对循环结构的走向循环路径分支与无返回的路径结构的走向路径分支进行标记。
[0040]一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述所述的方法。
[0041]一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机以执行上述所述的方法。
[0042]与现有技术相比,本专利技术方法的优点是:
[0043]1)由于为了防止内存泄漏,析构函数一般被设置为虚函数,即析构函数不存在函数内联问题,而本专利技术通过将虚函数表与析构函数进行配对,保证了配对的有效性;
[0044]2)本专利技术通过析构函数来合并虚函数表,而且不限于一对一的匹配,也可以一对多匹配;
[0045]3)本专利技术采用启发式搜索构造函数的方法,对虚函数表进行交叉引用本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种面向C++二进制文件的控制流图生成方法,其步骤包括:1)从C++二进制文件中提取虚函数表与符号表;2)依据所述符号表获取每一虚函数表中的析构函数,并将虚函数表与相应析构函数进行配对;3)对每一虚函数表进行交叉引用查询,得到构造函数;4)通过构造函数、析构函数与直接或间接调用构造函数或析构函数的函数,生成控制流图。2.如权利要求1所述的方法,其特征在于,通过以下步骤提取虚函数表:1)运行时类型信息;2)依据运行时类型信息指针获取的附加信息,得到虚函数表信息。3.如权利要求1所述的方法,其特征在于,通过以下步骤提取符号表:1)通过虚函数表,得到虚函数表地址与虚函数表包含的虚函数地址;2)通过C++二进制文件中提取的虚基类表,得到虚基类表地址与虚基类表字段内容;3)根据虚函数表地址、虚函数地址、虚基类表地址与虚基类表字段内容,得到符号表。4.如权利要求1所述的方法,其特征在于,通过以下策略获取每一虚函数表中的析构函数:1)遍历每一虚函数表中的函数,得到具有虚函数表内存覆写操作的第一函数;2)依据所述符号表,获取第一函数的第一后面指令或调用第一函数的上层函数的第二后面指令中具有delete操作的第一函数,得到析构函数。5.如权利要求4所述的方法,其特征在于,覆写操作包括:mov qword[rsi+0x8]或vftptr;delete操作包括:call delete()。6.如权利要求1所述的方法,其特征在于,通过以下步骤获取所述构造函数:1)交叉引用查询每一虚函数...

【专利技术属性】
技术研发人员:龚晓锐
申请(专利权)人:中国科学院信息工程研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1