Jimple in Soot

Posted by kingkk on 2019-11-21

前言

还是一篇类似于笔记一样的东西,我不保证百分百的准确,只是以一种自己能看懂的方式,记录一些自己理解的东西。

主要记录下jimple,也就是Soot中最擅长处理的一种中间代码。(图来源网络)

可以看到还算是一种人类比较好理解的中间代码,并且将一些编译中做的操作给显示的显现了出来(因为本来就是从java字节码反编译过来的)

Soot中对这种中间代码建立了一套比较完整的体系来描述,方便人们通过程序来分析代码。

几个主要结构

jimple的主要数据结构位于soot.jimple,但这里主要是定义好的一些接口,具体的实现类位于soot.jimple.internal中,通过IDEA生的关系图可以大概看到对应关系,这篇笔记也主要围绕这个关系图展开。

Stmt

应该就是statement语句的意思,有很多继承他的类,用来描述不同的语句。

AbstractDefinitionStmt

指一个赋值语句

这个语句的左边通常是一个变量

右边可能是任何其他东西,例如语句,表达式,另一个变量,一些常量等等

JAssignStmt

一个正常的赋值语句,例如,我们将一个变量赋值给变量$r5

1
$r5 = newarray (java.lang.Object)[0]

JIdentityStmt

指的是一些非显式的内部赋值语句

例如在真正执行代码时,程序会帮你把从参数传入的变量,赋值给一个临时变量,给函数内部调用

1
r1 := @parameter0: java.lang.String

再例如class中指向本身的this指针,都会进行一次非显示的赋值操作

1
r0 := @this: com.kingkk.test.Controller

JInvokeStmt

当一个变量,调用本身的方法

1
specialinvoke $r4.<org.springframework.web.client.RestTemplate: void <init>()>()

AbstractSwitchStmt

switch语句主要由于JVM对于不同的Switch语句,会生成不同的操作指令,从而也就有了两种Switch语句

JLookupSwitchStmt

对应LookupSwitch

JTableSwitchStmt

对应TableSwitch

JIfStmt

if语句

JBreakpointStmt

break语句

JRetStmt

return 语句

JReturnVoidStmt

return void

JGotoStmt

goto语句

JNopStmt

我也不知道..

AbstractOpStmt

这个类下面的我也不太熟,先列出来

JThrowStmt

这是throw语句(已验证

JExitMonitorStmt

JEnterMonitorStmt

JRetStmt

Expr

应该就是expression表达式的意思

AbstractInvokeExpr

只一个调用了函数的表达式,比如 user.setName("kingkk")

里面很多主要是根据JVM的操作指令来进行的描述

JStaticInvokeExpr

主要指的是一个static静态方法的调用

JDynamicInvokeExpr

一般是一些invoke的动态调用?(我也不是特别懂

AbstractInstanceInvokeExpr

指的是一个变量调用自身的方法,但根据情况,还可以细分

JVirtualInvokeExpr

调用自身的方法

JInterfaceInvokeExpr

调用接口方法

JSpecialInvokeExpr

一般是一些初始化、父类、私有等方法

AbstractBinopExpr

一些二进制的数字操作

例如加减乘除,逻辑且或非,一些比较操作,以及一些位运算,这里就不具体列了

JNewExpr

new 一个类表达式

JNewArrayExpr

new 一个数组

JNewMultiArrayExpr

应该是指一个多维数组

JCastExpr

强制类型转换

JInstanceOfExpr

instanceof

AbstractUnopExpr

这下面的类我也不太清楚

JNegExpr

JLengthExpr

其余一些

其余剩下的一下常用的,就统一写这了

Constant

常量

StringConstant

字符串常量

NumberConstant

数字常量

IdentityRef

本身的一些引用

ParameterRef

函数参数

ThisRef

this指针

CaughtExceptionRef

捕获到的异常

JimpleLocal

Local变量