前言
还是一篇类似于笔记一样的东西,我不保证百分百的准确,只是以一种自己能看懂的方式,记录一些自己理解的东西。
主要记录下jimple
,也就是Soot中最擅长处理的一种中间代码。(图来源网络)
可以看到还算是一种人类比较好理解的中间代码,并且将一些编译中做的操作给显示的显现了出来(因为本来就是从java字节码反编译过来的)
Soot中对这种中间代码建立了一套比较完整的体系来描述,方便人们通过程序来分析代码。
几个主要结构
jimple
的主要数据结构位于soot.jimple
,但这里主要是定义好的一些接口,具体的实现类位于soot.jimple.internal
中,通过IDEA生的关系图可以大概看到对应关系,这篇笔记也主要围绕这个关系图展开。
Stmt
应该就是statement
语句的意思,有很多继承他的类,用来描述不同的语句。
AbstractDefinitionStmt
指一个赋值语句
这个语句的左边通常是一个变量
右边可能是任何其他东西,例如语句,表达式,另一个变量,一些常量等等
JAssignStmt
一个正常的赋值语句,例如,我们将一个变量赋值给变量$r5
1 |
JIdentityStmt
指的是一些非显式的内部赋值语句
例如在真正执行代码时,程序会帮你把从参数传入的变量,赋值给一个临时变量,给函数内部调用
1 | r1 := 0: 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变量