BAF码向jimple码转换
承接上一篇:字节码向BAF码转换
BAF码:
```
public class test extends java.lang.Object
{
public static void main(java.lang.String[])
{
word r0;
r0 := @parameter0: java.lang.String[];
staticget <java.lang.System: java.io.PrizzntStream out>;
push 1;
push 2;
add.i;
virtualinvoke <java.io.PrintStream: void println(int)>;
return;
}
public void <init>()
{
word r0;
r0 := @this: test;
load.r r0;
specialinvoke <java.lang.Object: void <init>()>;
return;
}
}
```
首先,经过计算栈空间直接转换
得到 详细的无类型jimple码:,$stack0#4
、、、
word r0; unkown r0,$stack0;
r0 := @parameter0: java.lang.String[]; java.lang.printlnString[] r0;java.io.PrintStream $r1;
r0 := @parameter0: java.lang.String[];
staticget <java.lang.System: java.io.PrizzntStream out>; $r1 = <java.lang.System.java.io.printlnStream Out>;
push 1; $stack0 = 1;
push 2; $stack1 = 2;
add.i; $stack0 = $stack0 + $stack1
virtualinvoke <java.io.PrintStream: void println(int)>; virtualinvoke<java.io.PrintStream: void println(int)>($stack0)
return;
word r0; test r0;
r0 := @this: test; r0:=@this:test;
load.r r0; $stack0 = r0;
specialinvoke <java.lang.Object: void <init>()>; specialinvoke <java.lang.Object:void <init>()>();
return;
、、、
经过局部分离:
得到详细的无类型jimple分组:
、、、
unkown r0,$stack0; unkown r0,$stack0,$stack1,$stack0#2,$stack#3;
r0 := @parameter0: java.lang.String[]; java.lang.printlnString[] r0;java.io.PrintStream $r1;
$i0 = $stack0;
r0 := @parameter0: java.lang.String[];
$r1 = <java.lang.System.java.io.printlnStream Out>; $r1 = <java.lang.System.java.io.printlnStream Out>;
$stack0 = 1; $stack0 = 1;
$stack1 = 2; $stack1 = 2;
$stack0 = $stack0 + $stack1 $stack0#2 = #stack0 + $stack1
virtualinvoke<java.io.PrintStream: void println(int)>($stack0) virtualinvoke<java.io.PrintStream: void println(int)>($stack0)
return
test r0; test r0;
r0:=@this:test; r0:=@this:test;
$stack0 = r0; $stack0#3 = r0;
specialinvoke <java.lang.Object:void <init>()>(); specialinvoke <java.lang.Object:void <init>()>();
return
、、、
接下来进行本地类型赋予:
、、、
unkown r0,$stack0,$stack1,$stack#2,$stack0#3; unkown r0,$stack0,$stack1,$stack#2,$stack0#3;
java.lang.printlnString[] r0;java.io.PrintStream $r1; java.lang.printlnString[] r0;java.io.PrintStream $r1;
$i0 = $stack0; int $i0;
r0 := @parameter0: java.lang.String[]; r0 := @parameter0: java.lang.String[];
$r1 = <java.lang.System.java.io.printlnStream Out>; $r1 = <java.lang.System.java.io.printlnStream Out>;
$stack0 = 1; int 1;
$stack1 = 2; int 2;
$stack0#2 = #stack0 + $stack $i0 = 1 + 2;
virtualinvoke<java.io.PrintStream: void println(int)>($stack0) virtualinvoke<java.io.PrintStream: void println(int)>($i0)
test r0; test r0;
r0:=@this:test; r0:=@this:test;
$stack0#3 = r0; $stack0#3 = r0;
specialinvoke r0.<java.lang.Object:void <init>()>(); specialinvoke r0.<java.lang.Object:void <init>()>();
、、、
最后,进行冗余代码的清理得到:
public class test extends java.lang.Object
{
public static void main(java.lang.String[])
{
java.lang.String[] r0;
java.io.PrintStream $r1;
int $i0;
r0 := @parameter0: java.lang.String[];
$r1 = <java.lang.System: java.io.PrintStream out>;
$i0 = 1 + 2;
virtualinvoke $r1.<java.io.PrintStream: void println(int)>($i0);
return;
}
public void <init>()
{
test r0;
r0 := @this: test;
specialinvoke r0.<java.lang.Object: void <init>()>();
return;
}
}
以上就是BAF转jimple的过程。