美文网首页
BAF码向jimple码转换

BAF码向jimple码转换

作者: 转身一世铅华尽 | 来源:发表于2019-08-12 13:29 被阅读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的过程。

相关文章

  • BAF码向jimple码转换

    承接上一篇:字节码向BAF码转换 BAF码: ``` public class test extends java...

  • 字节码向BAF转换

  • .class字节码向BAF码的转换

    一个最简单的例子: 当经过编译为.class文件时,使用javap -v 的到它的字节码的近汇编码,javap的使...

  • BAF to Jimple

    first steps: next steps: next steps: next steps: the end ...

  • Jimple 学习

    jimple 是一种中间代码,用来简化分析,以及简化向 java 字节码的过渡。 jimple 是一种类型化的、三...

  • jimple to BAF to bytecode

    first steps:word r0,r1,stack1#1,l2,stack3#1r0:=@this.test...

  • 第二章 中间表示

    java字节码作为中间表示(使用javap命令查看) baf中间表示把200多种不同的字节码精简为60种没有常量池...

  • 转换函数

    类型转换函数 string CharToStr( int ACSII码 )将ASCII码转换成字符串 :: 输入...

  • java核心技术-java基础

    通过javac将java源码转化为字节码,通过jvm内嵌的解释器将字节码转换为机器码。

  • HHVM

    HHVM先把php代码转换成一种字节码中间格式,而且会缓存转换得到的字节码,然后使用JIT变压器转换并优化缓存的字...

网友评论

      本文标题:BAF码向jimple码转换

      本文链接:https://www.haomeiwen.com/subject/pzeyjctx.html