claripy是一个符号求解引擎,而此次学习重点关注值集分析领域。要想改进利用这部分功能,还是需要深入分析代码,了解其实现细节及处理逻辑。

(一)首先对claripy的各个包做了简单的分析

Ast包

抽象语法树包创建base基类,一个关于参数的操作树。不能直接初始化,二十使用一个构造函数构造叶节点,然后建立更复杂的表达式。

AST对象有hash识别方法,意味着两个对象可能一样。这可以节省内存。

angr-claripy源码分析(一)

 

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包

前端类,继承关系如下

angr-claripy源码分析(一)

 

Utils包(utils龙套)

如OrderedSet提供去重以及常规操作(包括O(1)添加、删除和查找以及O(n)迭代相同的运行时间。

Vsa包

值集分析相关类,继承关系如下:

angr-claripy源码分析(一)

相关文章:

  • 2021-12-20
  • 2021-09-21
  • 2021-05-09
  • 2021-12-26
  • 2021-06-02
  • 2022-01-23
  • 2021-10-23
  • 2021-06-15
猜你喜欢
  • 2021-12-31
  • 2021-07-26
  • 2021-07-15
  • 2021-08-27
  • 2021-09-30
  • 2021-04-09
  • 2021-10-22
相关资源
相似解决方案