还是一篇类似于笔记一样的东西,我不保证百分百的准确,只是以一种自己能看懂的方式,记录一些自己理解的东西。
主要记录下 jimple
,也就是Soot中最擅长处理的一种中间代码。(图来源网络)
可以看到还算是一种人类比较好理解的中间代码,并且将一些编译中做的操作给显示的显现了出来(因为本来就是从java字节码反编译过来的)
Soot中对这种中间代码建立了一套比较完整的体系来描述,方便人们通过程序来分析代码。
jimple
的主要数据结构位于 soot.jimple
,但这里主要是定义好的一些接口,具体的实现类位于 soot.jimple.internal
中,通过IDEA生的关系图可以大概看到对应关系,这篇笔记也主要围绕这个关系图展开。
应该就是 statement
语句的意思,有很多继承他的类,用来描述不同的语句。
指一个赋值语句
这个语句的左边通常是一个变量
右边可能是任何其他东西,例如语句,表达式,另一个变量,一些常量等等
一个 正常 的赋值语句,例如,我们将一个变量赋值给变量 $r5
$r5 = newarray (java.lang.Object)[0]
指的是一些非显式的内部赋值语句
例如在真正执行代码时,程序会帮你把从参数传入的变量,赋值给一个临时变量,给函数内部调用
r1 := @parameter0: java.lang.String
再例如class中指向本身的this指针,都会进行一次非显示的赋值操作
r0 := @this: com.kingkk.test.Controller
当一个变量,调用本身的方法
specialinvoke $r4.<org.springframework.web.client.RestTemplate: void <init>()>()
switch语句主要由于JVM对于不同的Switch语句,会生成不同的操作指令,从而也就有了两种Switch语句
对应LookupSwitch
对应TableSwitch
if语句
break语句
return 语句
return void
goto语句
我也不知道..
这个类下面的我也不太熟,先列出来
这是throw语句(已验证
应该就是 expression
表达式的意思
只一个调用了函数的表达式,比如 user.setName("kingkk")
里面很多主要是根据JVM的操作指令来进行的描述
主要指的是一个static静态方法的调用
一般是一些invoke的动态调用?(我也不是特别懂
指的是一个变量调用自身的方法,但根据情况,还可以细分
调用自身的方法
调用接口方法
一般是一些初始化、父类、私有等方法
一些二进制的数字操作
例如加减乘除,逻辑且或非,一些比较操作,以及一些位运算,这里就不具体列了
new 一个类表达式
new 一个数组
应该是指一个多维数组
强制类型转换
instanceof
这下面的类我也不太清楚
其余剩下的一下常用的,就统一写这了
常量
字符串常量
数字常量
本身的一些引用
函数参数
this指针
捕获到的异常