Jimple

Jimple IR

like Java, but simple -> Jimple

JimpleSoot采用的中间表示形式IRSoot是在IR的基础上进行程序分析的。

JVM字节码是基于栈的语言,不能直观地知道其操作码的意图,而模拟栈的执行相对困难;而Java源代码有着嵌套的结构,也不适合做程序分析。

Jimple IR 作为一种带类型的三地址码(typed 3 Address Code)结合了两者的优点:

  • 局部变量,无栈操作,可读性比字节码强

  • this和形参有特殊的变量表示

  • 只有简单语句,平坦结构非嵌套

三地址码:左边最多一个引用,右边最多两个引用

更多参考:sable-thesis.pdf (washington.edu)

Jimple中签名(Signature)用于全局唯一表示一个类/方法/字段,在Soot中分别由SootClassSootMethodSootField表示,对应的签名分别为ClassTypeMethodSignatureFieldSignature

Jimple Stmt

Branching Stmts

模拟语句间的条件/无条件跳转,CFG中有多个后继节点

image-20241002204912641

JGotoStmt

无条件跳转到目标语句

第8行和第12行的goto语句都是JGotoStmt的实例

JIfStmt

第一个后继节点为紧跟着的语句(条件为真),第二个后继节点为分支语句(条件为假)

打印得到:

getCondition获取条件表达式

getTargetStmts即为goto后面跟着的标签指向的语句。

JSwitchStmt

getValues:case语句匹配的值(List<IntConstant>

getKey:switch语句要匹配的目标(Immediate

FallsThrough Stmts

这些语句只有一个后继节点

image-20241002212316303

JInvokeStmt

转换控制流到另一个方法直到方法调用返回。

virtualinvokespecialinvoke

JAssignStmt

rhs(right hand-side)赋值给lhs(left hand-side)

lhs可以是变量、字段、数组的引用(LValue

rhs可以是表达式(Expr)、变量(Local)、引用(Ref)、常量(Constant)(Value

image-20241002220555999
image-20241002220713676

getLeftOpgetRightOp用于获取lhs和rhs

JIdentityStmt

类似JAssignStmt,但是是处理一些隐式赋值

  • JParameterRef将形参赋值给变量,@parameter0: int表示第一个形参,类型为int

  • JCaughtExceptionRef将异常赋值给变量,如@caughtexception: java.lang.NullpointerException

  • JThisRefthis赋值给变量

JEnterMonitorStmt & JExitMonitorStmt

标记synchronized代码块的入口和出口

Other Stmts

JReturnStmt & JReturnVoidStmt

结束当前方法的控制流并返回一个值给调用者

JReturnStmtreturn xxx;

JReturnVoidStmtreturn;

JThrowStmt

如果抛出的异常没有被Trap捕捉,结束当前方法的执行,并跳转到异常处理器。

throw xxx;

Good Tip

很多SootUp的API都会返回Stmt接口,可以利用instanceof来判断它的子类

但这会造成大量的if-else语句,总归不太优雅。

因此SootUp提供了另一种处理方式,实现一个AbstractStmtVisitor子类

Jimple Values

Immediate

立即数,包括Local(变量)和Constant(常量)

Local

Local是作用域在当前方法中的变量,可以通过JIdentityStmtJAssignStmtValue赋值给Local

Constant

表示实际的值,如一个具体的数字或字符串

常量通常赋值给LocalRef(即lhs可能的情况)

Expr

表达式是一种能够被计算并返回值的语言结构

  • AbstracBinopExpr二元表达式

  • AbstracUnopExpr一元表达式

  • AbstractInvokeExpr调用表达式

image-20241002225346421

Ref

JArrayRef

数组索引来引用

JFieldRef

SootField的引用

  • JStaticFieldRef:静态字段

  • JInstanceFieldRef:实例字段

IdentityRef

用于隐式赋值(JIdentityStmt)的引用

  • JThisRef

  • JCaughtExceptionRef

  • JParameterRef

Good Tip

Stmts类似,很多SootUp的API返回Value接口,可以利用instanceof判断它的子类

也可以实现一个AbstractValueVisitor的子类

如果只需要处理Value的子集,也可以考虑实现ImmediateVisitorConstantVisitorExprVisitorRefVisitor

Jimple Type

PrimaryType

  • BooleanType

  • ByteType

  • CharType

  • ShortType

  • IntType

  • LongType

  • DoubleType

  • FloatType

ReferenceType

  • (Java)ClassType

  • ArrayType

  • NullType

VoidType

  • VoidType

Jimple Trap

Trap是用于模拟异常流的机制(try-catch-finally结构)

其定义了捕捉的异常类型、捕捉的范围(from-to)、以及处理异常的代码(handler

调用Body#getTraps可获取

Last updated

Was this helpful?