天天看點

Android APK破解、反編譯、打包簽名基本思路與方法

Android APK破解、反編譯、打包簽名基本思路與方法

                                                                                                                    2013年6月1日星期六

一.宗述破解APK思路

對于反編譯APK、并進行修改代碼重新打包簽名整體思路是如下:

1)使用dex2jar和JD-GUI反編譯demo.apk得到Java源碼,研究源碼邏輯結構。

2)在eclipse對所要修改的源碼進行重新編寫,并編譯,生成modify.apk

3)ApkTool反編譯modify.apk得到想要的*.smali檔案。

4)ApkTool反編譯demo.apk得到資源、圖檔、xml、*.smali檔案。

5)修改第四步驟中需要修改的布局Xml、圖檔等資源檔案。将第三步中修改得到的*.smali代碼替換掉第四步中*.smali相關檔案。

6)使用ApkTool工具重新打包、使用JDK工具進行簽名。

以上思路的詳細執行過程詳見下文。

二. dex2jar和JD-GUI反編譯Apk得到Java源代碼

首先要下載下傳兩個工具:dex2jar和JD-GUI,前者是将apk中的classes.dex轉化成Jar檔案,而JD-GUI是一個反編譯工具,可以直接檢視Jar包的源代碼。以下是下載下傳位址:dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zipJD-GUI:http://laichao.googlecode.com/files/jdgui.zip

具體步驟:

首先将apk檔案,将字尾改為zip,解壓,得到其中的classes.dex,它就是java檔案編譯再通過dx工具打包而成的;

解壓下載下傳的dex2jar,将classes.dex複制到dex2jar.bat所在目錄。在指令行下定位到dex2jar.bat所在目錄,運作如下指令:

dex2jar.batclasses.dex

生成classes.dex.dex2jar.jar

運作JD-GUI,打開上面生成的jar包,即可看到源代碼了。

三、ApkTool反編譯和重新打包

1、準備工作:

下載下傳APKTool,通過下面這個連接配接進行下載下傳,https://code.google.com/p/android-apktool/downloads/list

windows下隻需要下載下傳這兩個檔案包即可:apktool1.5.2.tar.bz2和apktool-install-windows-r05-ibot.tar.bz2

分别解壓到到一個友善操作的目錄下,然後就可以通過控制台進行操作了,當然前提是你配置已經有了JAVA環境,這個網上一搜一大堆,就不贅述了。

2、反編譯:

把要反編譯的APK檔案放到跟APKTool四個檔案的同一個目錄下;

打開控制台,跳到該目錄(例如是C:\Windows),執行:

cd C:\Windows

然後執行:

apktool dapkname.apk foldername

apkname.apk 表示要進行反編譯的APK檔案,foldername表示反編譯後檔案存放的目錄,即在目前目錄下會自動建一個新目錄存放(如:C:\Windows\foldername)

執行完上面語句後,如果沒有出現錯誤提示,則成功反編譯了,找到foldername目錄,打開smali目錄即為反編譯出來的位元組。

但我在執行上面語句後,卻出現了錯誤提示:

  Exception in thread "main"brut.androlib.err.UndefinedResObject: resource spec:

  0x010300dd

根據提示描述是找不到資源檔案,應該是要反編譯的APK檔案用到了系統的一些資源。

解決辦法:

從手機中導出framework-res.apk檔案,該檔案是/system/framework下面,把這個檔案拷到跟apkTool同一個目錄下,執行以下語句把資源檔案加進來:

apktool iffreagmework-res.apk

執行完以後就可以把framework-res.apk導進來。此時再執行apktool d即可以正常反編譯了。建議framework-res.apk取目前最新版本Android4.0中/system/framework的apk.

由于反編譯出來的是smali檔案,是以要學習一些smali基本的文法哦。

修改完代碼後,就要重新打包成APK檔案了:

apktool bfoldername

其中foldername即放反編譯結果的目錄,執行成功後會在該目錄的dist目錄下有一個重新打包後的apk檔案。

好啦,到此就成功打包了一個新的apk檔案了,但還不要高興得太早,該檔案是一個沒有簽名的apk,有了解過android的應該都知道,沒有簽名是無法安裝的。那就要重新為該檔案簽一下名了。把你的簽名檔案和apk拷到同一個目錄下,然後執行簽名語句即可。

3、簽名步驟:

1)生成簽名檔案:C:\Users>keytool -genkey -keystore cmd.keystore -keyalg RSA -validity 10000 -alias cmd.keystore

cmd.keystore 為生成的簽名檔案

2)正式簽名:

C:\Users>jarsigner -verbose -keystore cmd.keystore -signedjar D:\Android\decompile\output\dist\new.apk D:\Android\decompile\output\dist\crackme5.apk cmd.keystore

new.apk為簽名後的apk.

至此大功告成!!!

3)簽名常見問題

把别人的apk簽上自己的debug簽名,安裝的時候出現[INSTALL_PARSE_FAILED_NO_CERTIFICATES](使用adb install指令安裝)。

各種百度google都說是因為沒有簽名,百思不得其解。用jarsigner -verify -verbose -certs abc.apk檢視簽名資訊發現總是出現[CertPath未驗證 null], 也不曉得原因。後來看到某大神的文章後發現可能是java1.7版本和android有些不相容,于是删除了新版本的jdk,換上1.6。 就解決了。