在這裡講述的其實是java反編譯,主要是因為我是反編譯人家的app源碼入手的,就自然的掛起了羊頭。
眾所周知,通過dex2jar能將Android app的dex解析為class文件jar包,然後通過jd等反編譯工具查看源代碼,貌似很容易就能對別人的勞動成果拿來主義,可果真如此理想麼? 本著實事求是的原則,自己親手試了下,結果自然是杯具的。
Android APK反編譯圖文詳解 http://www.linuxidc.com/Linux/2014-03/97827.htm
以下是反編譯出的結果,我們簡單的以一個方法為例:
public double getCORRLN(double[] paramArrayOfDouble)
{
double d1 = 0.0D;
double d2 = 0.0D;
double d3 = 0.0D;
double d4 = 0.0D;
double[] arrayOfDouble1 = new double[this.grayLevel];
double[] arrayOfDouble2 = new double[this.grayLevel];
int i = 0;
int k;
label42: int m;
if (i >= this.grayLevel)
{
k = 0;
if (k < 32)
break label171;
m = 0;
if (m < 32)
break label201;
}
for (int i1 = 0; ; i1++)
{
if (i1 >= 32)
{
if ((d3 != 0.0D) && (d4 != 0.0D))
this.CORRLN = ((this.CORRLN - d1 * d2) / Math.sqrt(d3 * d4));
return this.CORRLN;
for (int j = 0; ; j++)
{
if (j >= this.grayLevel)
{
d1 += (i + 1) * arrayOfDouble1[i];
i++;
break;
}
arrayOfDouble1[i] += paramArrayOfDouble[(j + i * this.grayLevel)];
}
label171: d3 += Math.pow(k + 1 - d1, 2.0D) * arrayOfDouble1[k];
k++;
break label42;
label201: for (int n = 0; ; n++)
{
if (n >= 32)
{
d2 += (m + 1) * arrayOfDouble2[m];
m++;
break;
}
arrayOfDouble2[m] += paramArrayOfDouble[(m + n * this.grayLevel)];
}
}
d4 += Math.pow(i1 + 1 - d2, 2.0D) * arrayOfDouble2[i1];
}
}
是不是感覺狗屁不通?這還是例舉的一個相對簡單的方法,看看這個
基本每個方法都有錯誤,基本每個錯誤都是邏輯混亂,基本沒一個方法能用,簡單來說,這個文件就是廢的。
第一次看到這情況,心裡很納悶,不知道是dex2jar這個過程除了問題還是jd的問題,後來百度了一下(谷歌打不開,懶得折騰,別鄙視,人家度娘一樣很敬業),發現這種問題很多,通過jad為核心的反編譯工具(jd就是如此)都這副尿性,偏偏jad在java反編譯工具中又算最好的,不知道是不是因為太久沒更新的緣故,反正就是不給力。
那如何是好呢,嘿 用java開發,就沒有不能破解的,工具不給力,那就人工來呗,果斷搞起。
首先,找出該類的.class文件,javap隆重登場,在這裡 比如該類為xohome.class, 在終端中,切入該文件所在目錄,執行命令:
javap -c -private xohome.class
簡單掃盲:javap是jdk自帶的反編譯工具,能簡單解析class字節碼文件的內容,參數 -c為顯示字節碼 -private為反編譯級別,可開發過程中可見級別一樣,一下是上頭例舉方法的字節碼:
相信學過匯編的對這些都不陌生,如果你看得頭暈,那就沒轍了,因為這只是窗口大小的代碼,一個中等方法大概有這樣的代碼500行。。。
我們開好工作窗口,將jd反編譯的代碼、字節碼、空白文檔(用作寫反編譯的代碼用)依次列開:
這就是簡單的工作台了
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103803p2.htm