angr源码分析——Simulation Engines

本文介绍了angr中的Simulation Engines,特别是SimEngineVEX和SimEngineUnicorn的工作原理。SimEngineVEX基于VEX,用于IRSB的执行,而SimEngineUnicorn使用Unicorn引擎进行具体执行。执行流程始于SimEngine的successors()函数,实际操作在process()方法中完成。文章鼓励读者通过深入研究process()函数来理解angr的模拟执行机制。
摘要由CSDN通过智能技术生成
为什么研究这个类呢?原因是在对程序进行符号执行时,step()调用的实际上就是project.factory.successors()函数,而这个函数代码为
    def successors(self, *args, **kwargs):
        """
        Perform execution using any applicable engine. Enumerate the current engines and use the
        first one that works. Return a SimSuccessors object classifying the results of the run.
        :param state:           The state to analyze
        :param addr:            optional, an address to execute at instead of the state's ip
        :param jumpkind:        optional, the jumpkind of the previous exit
        :param inline:          This is an inline execution. Do not bother copying the state.
        Additional keyword arguments will be passed directly into each engine's process method.
        """
        return self.project.engines.successors(*args, **kwargs)

所以实际上,最终调用的是engines中的successors()函数对状态进行操作。因此,通过深入研究engines可以了解angr是如何操作states对程序进行模拟执行的。

(这里有个问题,现在还没想明白:为什么调用的是engines.successors,在successors的初始化函数中,并没有调用engines.process方法,但是参数最终都会传给process方法,那么从哪里调用的process呢???)

下面是SimEngine的一些方法。

process(state*args**kwargs)

执行一个状态。
我们只在子类里面重写此方法以提供正确的方法签名和文档。我们应该重写_prcess方法来进行实际的执行操作。
参数:
state -将要执行的状态。这个在修改前被复制。
inline -这是一个内联执行。不影响复制状态。
force_addr -强制执行,假装我们正在这个具体地址运行。
返回值:一个SimSuccessors对象对执行的successor状态进行分类。

check(state<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值