asmtools修改class文件

1.asmtools安装

参考阿里云虚机环境配置

2.asmtools修改class文件

Foo.java:

public class Foo {    
  public static void main(String[] args) {
    boolean flag = true;
    if (flag)   {
        System.out.println("Hello, Java!");
    }
    if (flag == true) {
        System.out.println("Hello, JVM!");
    }
  }
}

jasm格式的字节码:

super public class Foo
    version 52:0
{


public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial   Method java/lang/Object."<init>":"()V";
        return;
}

public static Method main:"([Ljava/lang/String;)V"
    stack 2 locals 2
{
        iconst_1;
        istore_1;
        iload_1;
        ifeq    L14;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Hello, Java!";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
    L14:    stack_frame_type append;
        locals_map int;
        iload_1;
        iconst_1;
        if_icmpne   L27;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Hello, JVM!";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
    L27:    stack_frame_type same;
        return;
}

} // end Class Foo

修改前执行:

[root@iz2ze8a01m28p14ttwjg27z java_workdir]# java Foo
Hello, Java!
Hello, JVM!

修改前Foo.class反编译的结果:

import java.io.PrintStream;

public class Foo
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 1;
    if (i != 0) {
      System.out.println("Hello, Java!");
    }
    if (i == 1) {
      System.out.println("Hello, JVM!");
    }
  }
}

其中boolean当做int进行处理。

使用asmtools进行修改:
1)class->jasm

java -cp asmtools.jar org.openjdk.asmtools.jdis.Main Foo.class > Foo.jasm.1
或者
java -jar asmtools.jar jdis Foo.class > Foo.jasm.1

2)对jasm文件进行修改

awk 'NR==1,/iconst_1/{sub(/iconst_1/,"iconst_2")} 1' Foo.jasm.1 > Foo.jasm

3)jasm->class

java -cp asmtools.jar org.openjdk.asmtools.jasm.Main Foo.jasm
或者
java -jar asmtools.jar jasm Foo.jasm

此时class文件已经被修改了,修改后执行:

[root@iz2ze8a01m28p14ttwjg27z java_workdir]# java Foo
Hello, Java!

修改后Foo.class的编译结果:

import java.io.PrintStream;

public class Foo
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 2;
    if (i != 0) {
      System.out.println("Hello, Java!");
    }
    if (i == 1) {
      System.out.println("Hello, JVM!");
    }
  }
}

修改后的jasm的字节码:

super public class Foo
    version 52:0
{


public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial   Method java/lang/Object."<init>":"()V";
        return;
}

public static Method main:"([Ljava/lang/String;)V"
    stack 2 locals 2
{
        iconst_2;
        istore_1;
        iload_1;
        ifeq    L14;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Hello, Java!";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
    L14:    stack_frame_type append;
        locals_map int;
        iload_1;
        iconst_1;
        if_icmpne   L27;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Hello, JVM!";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
    L27:    stack_frame_type same;
        return;
}

} // end Class Foo

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容