claripy是一个符号求解引擎,而此次学习重点关注值集分析领域。要想改进利用这部分功能,还是需要深入分析代码,了解其实现细节及处理逻辑。
(一)首先对claripy的各个包做了简单的分析
Ast包
抽象语法树包创建base基类,一个关于参数的操作树。不能直接初始化,二十使用一个构造函数构造叶节点,然后建立更复杂的表达式。
AST对象有hash识别方法,意味着两个对象可能一样。这可以节省内存。
Backends包
Backends是Claripy中干重活的,Claripy把ASTs展示出来,但是实际的计算还需要将ASTs变为后端自己可以handle的对象。
这提供了一个统一的外部接口,也允许了Claripy可以支持不同类型的计算。比如:
Ø 后端concrete为具体的Bit向量和Bool代数提供计算支持。
Ø 后端VSA给引入像SI这样的VSA结构。Backend_vsa.py
Ø 后端Z3提供支持符号变量和约束求解。
有一组backend期望实现的函数。对于所有的函数,共同的目的是要处理Claripy.ast.Base对象,同时私有的是对具体对象的处理。这里的区别在于公共的函数通常用func()而,私有的会用_func()。所有的这些函数返回的对象都是后端在私有方法中用过的对象,如果不是这样,就会返回一个backenderr。比如,Claripy将进入后端列表的下一个。
所有的backend必须实现convert()功能。这个函数接收一个Claripy.ast.base类,然后返回一个backend私有方法可以处理的对象。Backend同时也要实现一个_convert()功能,让他可以接收所有的非Claripy.ast.base类对象(比如一个整型或者一个其他backend类对象)。如果backend接收到一个convert()和_ convert()都不能转换成他内部可以使用的格式的话,那么就会返回一个backenderr。
Claripy是这么组织各个backend的:backend在他们的私有函数中,应该可以处理他们公私有函数返回的任何对象;同样,Claripy永远不会将一个对象传递给任何backend私有函数,这些backend公私有函数的返回值并不来自backend私有函数;唯一例外是_convert(),因为Claripy可以尝试将它感觉的任何东西添加到_convert()中,以查看backend是否可以处理这种类型的对象。
Frontend_mixins包
前端混合类,各种混合类,单独定义,没有继承关系
Frontends包
前端类,继承关系如下
Utils包(utils龙套)
如OrderedSet提供去重以及常规操作(包括O(1)添加、删除和查找以及O(n)迭代相同的运行时间。
Vsa包
值集分析相关类,继承关系如下: