Soot 静态分析框架Soot的核心
Posted raintungli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Soot 静态分析框架Soot的核心相关的知识,希望对你有一定的参考价值。
2. Soot核心Body
Body 是对应的是Java一个函数体,Body是Soot的核心,Graph、Flow的构建都是基于Body进行分析,当然你可以基于不同的IR语言构建不同的Body,soot提供了JimpleBody,ShimpleBody, GrimpBody,当然soot主要是基于Jimple进行分析,在流程中构建的是JimpleBody,其它的Body的构建需要通过开关来控制
Soot提供了 ShimpleBody与JimpleBody的相互转换
以及JimpleBody到GrimpBody的转换
2.1 Trap
Trap 多对应的就是Java字节码中的异常Table
我们以Jimple为例子来解释
2.2 Local:
Local 对应的是Java字节码中的局部函数
2.2.1 IR 的Jimple
我们从上面的例子可以看到Jimple的一些语言特点:
- 基于栈
java语言的字节码表示本来就是栈的,而象Dalvik 是基于寄存器的,在这点上Jimple基于栈
2.有类型
每一个参数都定义了Type,并且类型精度没有丢失,比如int $i0
3. 基于三地址分析
三地址解析中会出现很多的中间变量
三地址同时会拆解一些高级特性,被分解成多个单位,包含一些低级操作,支持低端指令
一般而言,三地址代码将包含大部分低级操作,即目标机所支持的指令。
先看一个例子:
int i ,j; i = 2; j = 2*i + 8; |
转化为:
int i, j, temp$0, temp$1, temp$2, temp$3;
temp$0 = 2; i = temp$0; temp$1 = 2 * i; temp$2 = temp$1; temp$3 = temp$2 + 8; j = temp$3;
|
多个操作转化成了三地址解析,通过temp来赋值
我们来看Java的字节码的操作:
0: iconst_2 1: istore_1 2: iconst_2 3: iload_1 4: imul 5: iload_1 6: iadd 7: istore_2 |
在Java字节码中也是低级操作,但没有使用三地址方式,使用栈的方式来解决临时变量的问题。
Jimple是直接翻译的字节码的操作,并没有自己拆解复杂语句到低级操作
2.2.2 IR 的Shimple
Shimple 与Jimple的区别:SSA static single assignment form静态单赋值,可用于流敏感操作
将程式码转换为SSA形式,最简单的方法,就是将每个被赋值的变数,以一个新的变数来取代,而新的变数名称则为一个带着版号的旧变数
int i = i +100 |
i0 i0_0 i0_0=i0+100 |
2.3 Soot Stmt
Unit是Soot的单元, Stmt 继承Unit代表着执行的语句,Soot将执行指令分成多个类型
过程内控制流
IfStmt , GotoStmt , SwitchStmt
过程间的控制流:
InvokeStmt ,ReturnStmt,ReturnVoidStmt., ThrowStmt
监控语句:MonitorStmt
赋值语句:DefinitionStmt
其它类型:NopStmt, BreakponitStmt
已经不使用的语句RetStmt
2.4 Soot box
盒子(Boxes)
一个盒子(Box)提供了一个间接访问soot (Unit,Value)的入口,类似于Java的一个引用,当Unit包含另一个Unit的时候,需要通过Box来访问,Soot 里提供了两种类型的Box, 一个是ValueBox一个是UnitBox
2.4.1 UnitBox
一个UnixBox包含着一个Unit操作,一个Unit的操作会包含着多个UnitBox(有些类型的Unit会包含其他Unit的引用,那么这时候就需要包含Unixbox),比如说,GotoStmt 需要知道目标的Unit是什么,所以一个Unit会包含其它的UnitBox,通过 UnitBox获取下一个Unit
2.4.2 ValueBox
与Unit类似,我们通常也需要指向Value的box。这被表示为ValueBox类。对于一个Unit,我们能够得到一系列的ValueBox ,包含了在Unit中使用的值以及定义的值, 一个Valuebox对应这一个Value,而一个value可以对应多个ValueBox
比如上图的i0<0的表达式就是包含一个valuebox, conditionexprbox,里面包含着LtExpr的value,而LtExpr又包含这op1Box左边和op2Box右边两个ValueBox, op1Box的valuebox又包含着i0这个local的本地value, 以及op2Box的ValueBox又包含着0这个常量Value
Unit 包含着多个UnitBox, ValueBox, 而UnitBox,ValueBox又指向独立的Unit和Value, 这里看来Box 更象一个指针,指向Value和Unit
中间表达式的适配
Soot 对每个IR Jimple, Shimple等构建了每个语言自己的Unit,Stmt,ValueBox,Value,以便于各种不同的IR的分析
2.4.3 Value
Value数据,常见的比如local 变量名, constant 常量
一个ValueBox就包含着Value,在上面的例子里i1=0 等于是一个Stmt, i0是一个Valuebox,里面包含这i0这个local 的value
以上是关于Soot 静态分析框架Soot的核心的主要内容,如果未能解决你的问题,请参考以下文章