BAF码向jimple码转换

2019-08-12  本文已影响0人  转身一世铅华尽

承接上一篇:字节码向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的过程。

上一篇 下一篇

猜你喜欢

热点阅读