Soot中的结构
本篇内容简单概括一下:soot中存在的主要对象、soot的执行流。
Soot中提供了几种对象,分别是:Scene、SootClass、SootMethod、SootField、Body。表示的意义如下所示:
Scene:Scene表示完整的分析环境,可以通过Scene.v()调用设置Options的API,也可以获取一些过程间分析的信息,如call graphs和points-to information(指向性分析)。如果分析的是Java工程,可以获取待分析的工程中存在哪些类。
SootClass:表示soot加载的待分析的类或者soot创建的类。如果分析的是Java源码,可以理解为SootClass对象代表Java源码中的某个类。
SootMethod:表示SootClass中的单个方法。SootField:表示SootClass中的某个字段。
Body:表示方法主体,由Locals链(body.getLoclas())、Units链(body.getUnits())、Traps链(body.getTraps())组成。Locals链存储方法中的变量定义、Units链存储方法中的句子、Traps链存储方法中发生异常的语句。如下代码片段:
public int bar(){
Foo r0;
int i0,$i1;
r0:=@this:Foo;//IdentityStmt
i0:=@parameter():int;//IdentityStmt
$i1=i0+21;//AssignStmt
Return $i1;//ReturnStmt
}
Body.getLocals()得到的链存储的内容就是:Foor0;int i0,$i1;
Body.getUnits()得到的链存储的内容就是:r0:=…;…Return$i1;
Stmt与Unit
Stmt与Unit都表示方法中的一个句子。interface Unit继承于interface Stmt;同样AssignStmt、IdentityStmt、IfStmt、RetrunVoidStmt、NopStmt等也继承于interface Stmt。它们的不同在于:Unit注重于句子的构成、而AssignStmt这些则注重于是哪种句式。需要注意的是:AssignStmt表示赋值语句;而IdentityStmt表示将参数赋值给Local这样的语句。下面是Unit对象提供的一些关键API:
public List<ValueBox> getUseBoxes();//返回Unit中使用的Value的引用
public List<ValueBox> getDefBoxes();//返回Unit中定义的Value的引用
public List<ValueBox> getUseAndDefBox();//返回Unit中定义并使用的Value的引用
public List geUnitBoxes();//获得被这个unit跳转到的UnitxBox的List
public List getBoxesPointingTothis();//获得该unit作为跳转对象时,所有跳转本身的UnitBox
public boolean fallsThrough();//如果接下来执行后面挨着的unit,则为true
public boolean branches();//如果执行时会跳转到其他别的unit,则返回true。如:IfStmt、GotoStmt
public void rediectJumpsToThisTo(Unit newLocation);//该方法把跳转到该unit重定向到newLocation
注:一般Value指的是Local(变量)、Expr(表达式)、Constant(常量)。
Soot的中间语言:
soot可以生成四种不同的中间语言:grimple、shimple、jimple、baf。其中一般采用的过程内/过程间分析都在在jimple中间语言上进行的。中间语言的特点灯具体信息可以查看