angr源码分析——CFGFast 快速构建控制流图

本文分析了angr库中用于快速构建控制流图(CFG)的CFGFast方法。与CFGAccurate不同,CFGFast不依赖于模拟执行,而是采用启发式方法和轻量级分析。它通过主动和被动扫描识别函数,适用于全面分析二进制文件。CFGFast的参数详细解释了其工作原理,包括符号、函数序言扫描、间接跳转解析等功能。通过对 ForwardAnalysis 和 CFGBase 的初始化及参数配置,逐步构建控制流图。
摘要由CSDN通过智能技术生成

有时我们需要对一个二进制文件做一个全面的分析,然而使用CFGAccurate一般都需要提供一个start_state作为起始的状态点进行分析,这就导致分析并不全面。为了获得一个高代码覆盖率的CFG,我们可以使用CFGFast。下面分析一下CFGFast的源码,了解其恢复原理,然后进行自己的改进吧。

CFGFast在给定的二进制文件中识别函数,并以非常快的方式构建一个控制流图:与CFGAccurate不同,它不依赖于模拟程序执行,跟踪状态,执行等昂贵的数据流分析,CFGFast将只执行轻量分析和一些启发式,并有一些强烈的假设。为了识别尽可能多的函数,CFGFast执行如下操作:
1.Active scanning
如果二进制有“function symbols”,那么它们将是代码扫描的起始点。
如果二进制没有任何“function symbol”,CFGFast将首先对整个二进制执行一个函数序言扫描,并以这些看起来像函数起始地址的位置开始。
否则,就以二进制的入口点开始进行扫描。
2.Passive scanning
在所有的主动扫描结束后,CFGFast将会执行一个整体的image扫描,扫描所有的代码片段。

由于在这里使用的这些技术的性质,通常不需要一个基本地址来使用这种分析例程。然而,使用正确的基址,CFG的恢复几乎总是会产生更好的结果。一种称为“GirlScout”的自定义分析是专门用来恢复二进制块的基本地址的(原来有可以自动回复基址的技术咯)。在确定基本地址之后,你可能想要通过创建一个新的Project对象来重新加载二进制文件,然后重新恢复CFG。

CFGFast的参数说明
        :param binary:恢复CFG的二进制文件。默认情况下使用主二进制文件。
      :param iterable regions:描述内存的(开始地址,结束地址)形式的元组列表,CFG应涵盖的区域。
        :param bool pickle_intermediate_results:如果我们想要存储中间结果。(哦,可以存放中间结果,这个中间结果包括什么?以什么方式存储的呢?)
      :param bool symbols:从二进制文件中的符号开始获取函数。
        :param bool function_prologues:扫描函数序言的二进制文件,并将这些位置用作函数开始
        :param bool resolve_indirect_jumps:尝试解决间接跳转。这是解决跳转目标所必需的跳转表等
        :param bool force_segment:强制CFGFast依赖二进制段而不是段。
      :param bool force_complete_scan:对二进制文件执行完整扫描并最大化识别的数量代码块。
        :param bool collect_data_references:CFGFast是否应该收集来自单个基本块的数据引用。
        :param bool extra_cross_references:如果我们应该收集程序中所有地方的数据引用,则为true即访问每个内存数据项,这需要更多的内存,并且是明显较慢。将它设置为False意味着每个存储器数据条目都有最多一个参考(这是最初的一个参考)。
        :param bool normalize:规范CFG以及CFG恢复后的所有函数图。
        :param bool start_at_entry:在此项目的入口点开始CFG恢复。将其设置为False避免CFGFast查看入口点作为其中一个起点代码扫描。
        :param list function_starts:额外功能起点的列表。 CFGFast将尝试恢复扫描来自列表中的每个地址。
        :param list extra_memory_regions:显示额外内存的2元组列表(起始地址,结束地址)区域。内部的整数将被视为指针。
        :param list indirect_jump_resolvers:间接跳转解析器的自定义列表。如果此列表是无或空的,特定于此体系结构和二进制的缺省间接跳转解析器类型将被加载。
        :param base_state:用作所有内存负载的支持者的状态
        :param int start :(已弃用)CFG恢复的起始地址。
        :param int end :(已弃用)CFG恢复的结束地址。
        :param CFGArchOptions arch_options:体系结构特定的选项。
        :param dict extra_arch_options:kwargs中的任何键值对都将被视为架构特定选项,并且将用于在self._arch_options中设置选项值。
        angr.Analysis需要的额外参数:
        :param progress_callback:指定回调函数以获取CFG恢复期间的进度。
        :param bool show_progressbar:CFGFast是否应该在CFG恢复期间显示进度条。

        :返回:无

下面分析CFGFast的恢复流程吧!

首先初始化ForwardAnalysis和CFGBase。
我们知道CFGAccurate与CFGFast都是继承的它们。
然后初始化各个参数。
首先是regions,它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值