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格式的字節(jié)碼:
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
修改前執(zhí)行:
[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文件已經被修改了问慎,修改后執(zhí)行:
[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的字節(jié)碼:
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