背景
近期要抓一個apk的藍牙包,抓是抓到了,但是命令挺多的,流程方面還得反編譯代碼會處理快一點,反編譯出來有一些代碼沒有反編譯出來,是jvm字節碼,要先了解jvm字節碼,爲此要研究下java反彙編代碼,把反彙編用法記錄下來。
創建測試代碼
public class Math {
public static int xadd(int a, int b){
return a+b;
}
public static void main(String[] args){
int a, b,c ,d,e,f;
a=1;
b=2;
c=(a+b)*10;
f = a*b;
d = xadd(a,b);
e = xadd(1,2);
}
}
編譯java程序
在命令行中執行編譯,得到class文件
javac Math.java
反編譯生成的class文件得到彙編程序
javap -c Math
public class Math {
public Math();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static int xadd(int, int);
Code:
0: iload_0
1: iload_1
2: iadd
3: ireturn
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: bipush 10
9: imul
10: istore_3
11: iload_1
12: iload_2
13: imul
14: istore 6
16: iload_1
17: iload_2
18: invokestatic #2 // Method xadd:(II)I
21: istore 4
23: iconst_1
24: iconst_2
25: invokestatic #2 // Method xadd:(II)I
28: istore 5
30: return
對比java程序和彙編,快速提高看彙編能力
剩下就是對彙編中的入棧出棧,賦值和調用分析了,拋去複雜的程序,可以較爲快的對待彙編程序分析了。