这是什么迷惑
What kind of obfuscation is this
我看到一些 Java 应用程序有这样的代码:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2 // Method printOne:()V
3: invokestatic #2 // Method printOne:()V
6: invokestatic #3 // Method printTwo:()V
9: return
public static void printOne();
Code:
0: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #5 // String Hello World
5: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void printTwo();
Code:
0: invokestatic #2 // Method printOne:()V
3: invokestatic #2 // Method printOne:()V
6: return
}
而且我想知道这是哪种混淆,以及可以像那样混淆 JAR 文件的工具是什么。
运行 javap -c
在已编译的 java class 上你会得到 java 字节码。这不是混淆,而是反编译。来自 IBM 的一个很好的资源是 Java bytecode:Understanding bytecode makes you a better programmer
这就是 javac
生成的 - java 代码的编译器。将其转换为代码实际上非常容易:
public class Test {
// an implicit constructor:
public Test(){
}
public static void testOne(){
System.out.println("Hello World");
}
public static String testTwo(){
testOne();
testOne();
}
}
我看到一些 Java 应用程序有这样的代码:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2 // Method printOne:()V
3: invokestatic #2 // Method printOne:()V
6: invokestatic #3 // Method printTwo:()V
9: return
public static void printOne();
Code:
0: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #5 // String Hello World
5: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void printTwo();
Code:
0: invokestatic #2 // Method printOne:()V
3: invokestatic #2 // Method printOne:()V
6: return
}
而且我想知道这是哪种混淆,以及可以像那样混淆 JAR 文件的工具是什么。
运行 javap -c
在已编译的 java class 上你会得到 java 字节码。这不是混淆,而是反编译。来自 IBM 的一个很好的资源是 Java bytecode:Understanding bytecode makes you a better programmer
这就是 javac
生成的 - java 代码的编译器。将其转换为代码实际上非常容易:
public class Test {
// an implicit constructor:
public Test(){
}
public static void testOne(){
System.out.println("Hello World");
}
public static String testTwo(){
testOne();
testOne();
}
}