歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android App反編譯全程筆記

在這裡講述的其實是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

Copyright © Linux教程網 All Rights Reserved