手把手教你搞懂 Android 反編譯

來源:互聯網
上載者:User

標籤:

我們知道,Android的程式打包後會產生一個APK檔案,這個檔案可以直接安裝到任何Android手機上,因此,反編譯就是對這個APK進行反編譯。Android的反編譯分成兩個部分:

  1. 一個是對代碼反編譯,也就是java檔案的反編譯。
  2. 一個是對資源反編譯,也就是res檔案的反編譯。
所需的工具

  • Android Studio:安卓開發IDE:https://developer.android.com/studio/index.html

反編譯代碼的工具:

  • dex2jar: 把dex檔案轉成jar檔案:https://sourceforge.net/projects/dex2jar/files/
  • jd-gui: 這個工具用於將jar檔案轉換成java代碼:http://jd.benow.ca/

反編譯資源的工具:

  • APKTool: 本文重要工具,APK逆向工具,使用簡單: http://ibotpeaches.github.io/Apktool/install/
熱身準備

首先我們需要一個APK,這裡我自己寫了一個,源碼:http://download.csdn.net/detail/u012891055/9563180,打包成APK後下載到手機上。

它的主要功能是類比郵箱啟用,如果我們輸入了錯誤的資料則無法通過啟用。所以我們的目的很簡單,就是讓這個判斷邏輯失效。

主要源碼說明:

第51行儲存的正確的兩個啟用號碼,通過:將帳號密碼隔開,如下

 

1

2

3

4

private static final String[] DUMMY_CREDENTIALS = new String[]{

            "[email protected]:20135115",

            "[email protected]:20135115"

};

現在只有啟用碼正確才能通過啟用。

第331行是Execute函數,邏輯判斷的部分。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

    @Override

    protected void onPostExecute(final Boolean success) {

        mAuthTask = null;

        showProgress(false);

 

        if (success) {

            new AlertDialog.Builder(LoginActivity.this)

                    .setTitle("恭喜您")

                    .setMessage("成功啟用!")

                    .show();

//                finish();

        } else {

            mPasswordView.setError(getString(R.string.error_incorrect_password));

            mPasswordView.requestFocus();

        }

    }

 

反編譯代碼

dex2jar解壓下來檔案很多,在mac上我們需要用到dex2jar的是這三個東西(windows上對應用bat檔案):

  • d2j_invoke.sh
  • d2j-dex2jar.sh
  • lib

AndroidStudio打包好的APK檔案的尾碼,需改為.zip,然後解壓。從解壓的檔案中找到classes.dex檔案,並將其放入dex2jar同一目錄下,如下:

並在cmd中也進入到同樣的目錄,然後執行:

Shell

 

1

sh d2j-dex2jar.sh classes.dex

執行如下:

然後我們會得到一個classes-dex2jar.jar檔案,我們藉助JD-GUI工具開啟即可,開啟如下:

可以看到代碼非常清晰,這樣我們就可以看到整個APP的代碼邏輯了。

反編譯資源

apktool下載完成後有一個.sh檔案和.jar檔案,我們把APK放進來,如下:

在cmd中進入apktool目錄,執行命令:

 

1

sh apktool.sh apktool d FooApp.apk

d是decode的意思,表示我們要對FooApp解碼,結果如下:

然後你會驚喜的發現多了一個FooApp檔案夾。

主要目錄說明:

  • AndroidManifest.xml:描述檔案
  • res:資源檔
  • smail:反編譯出來的所有代碼,文法與java不同,類似彙編,是Android虛擬機器所使用的寄存器語言
修改App icon

開啟我們的描述檔案,高清無碼:

可以看到我們的App icon名稱為ic_launcher,我們找到所有mipmap開頭的檔案夾,替換成即可:

ic_launche

在最後重新打包後我們的App icon就會被修改了,不過在重新打包之前,我們還有最重要的一件事沒有做,那就是修改啟用碼判斷邏輯。

修改邏輯

我們通過源碼或者JD-GUI查看反編譯的代碼可以看到啟用碼判斷邏輯如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Override

    protected void onPostExecute(final Boolean success) {

        mAuthTask = null;

        showProgress(false);

 

        if (success) {

        // 啟用碼正確

            new AlertDialog.Builder(LoginActivity.this)

                    .setTitle("恭喜您")

                    .setMessage("成功啟用!")

                    .show();

//                finish();

        } else {

            mPasswordView.setError(getString(R.string.error_incorrect_password));

            mPasswordView.requestFocus();

        }

    }

所以我們只需要找到反編譯後的if(success)的語句,並將其修改成if(!success)即可,如下:

 

1

2

3

4

5

6

if (success)//修改成if(!success)

{

...

} else {

...

}

這樣我們就成功的顛倒了以前的邏輯,我們輸入一個錯誤的啟用碼,就會被判斷成正確的。挺簡單的,是吧。

現在我們來動手修改:

  1. 開啟smail裡的LoginActivity$UserLoginTask.smali檔案.
  2. 全域搜尋if-eqz,通過AlertDialog關鍵字輔助定位,發現在第228行

  3. ok,就是這裡了,然後將if-eqz修改成if-nez,他們對應Java的文法如下:
Smail 文法 Java 文法
if-eqz v0, if(v0 == 0)
if-nez v0, if(v0 != 0)

ok,大功告成,現在就可以重新打包了。關於smail文法,有興趣的直接Google就行了。

重新打包

我們大概修改後兩個地方,其實重新打包也十分簡單,在cmd中執行以下命令即可:

 

1

sh apktool.sh b FooAPP -o NewFooApp.apk

其中b是build的意思,表示我們要將FooAPP檔案夾打包成APK檔案,-o用於指定新產生的APK檔案名稱,這裡新的檔案叫作NewFooApp.apk。執行結果如所示:

然後你會發現同級目錄下產生了新的apk檔案:

但是要注意,這個apk現在還是不能安裝的,因為我們沒有對它進行簽名,重新簽名後它就是個名副其實的盜版軟體了,大家一定要強烈譴責這種行為。

重新簽名

重新簽名也是很簡單的,我直接用的一個已有簽名檔案,使用Android Studio或者Eclipse都可以非常簡單地產生一個簽名檔案。

在cmd中執行格式如下:

 

1

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名檔案名稱 -storepass 簽名密碼 待簽名的APK檔案名稱 簽名的別名

然後我們就可以用這個apk進行安裝了,為了追求更快的運行速度,我們可以對其進行一次位元組對齊,這裡就不說了。

使用盜版APK

我們用NewFooApp.apk安裝好盜版app後,發現表徵圖變成了籃球,並且隨便輸入資料都能通過啟用了:

怎麼樣?總的來說還是挺有意思的吧,不過別用歪了。

手把手教你搞懂 Android 反編譯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.