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。 就解決了。