为什么研究这个类呢?原因是在对程序进行符号执行时,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, <