近日使用某線上聽歌軟體,有不少兒童故事不錯,但線上聽經常出現時斷時續情形,而軟體要求積分大於1500才可整頁下載。要滿足積分條件需要手動安裝其推薦的數十個應用,簡直是坑爹。故決定破解之。
假定要破解apk的名字為mytest.apk,則破解步驟如下:
步驟 1:得到resource及smali檔案。1)得到apktool工具
在http://code.google.com/p/android-apktool/下 載獲得,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip兩個包都要下。解壓縮下載的兩個檔案包,apktool-install-windows-2.1_r01-1.zip解壓縮後得到的包裡有aapt.exe
和apktool.bat.(注意要把apktool-1.0.0.tar.bz2解壓後的一個.jar 檔案copy進來)
2).DOS命令視窗下進入到apktool.bat所在的檔案夾裡。
D:\android\tool\apktool\apktool d C:\mytest.apk C:\out
命令列解釋:apktool d 要反編譯的檔案 輸出檔案夾
特別注意:你要反編譯的檔案一定要放在C盤的根目錄裡,
3).開啟 C:\out檔案夾 就可以得到各種資源了。
步驟2:得到java檔案方法a:
1)、把apk檔案改名為.zip,然後解壓縮出其中的class.dex檔案
2)、安裝把dex檔案反編譯為jar檔案的工具dex2jar。http://code.google.com/p/dex2jar/downloads/list
3)、把class.dex拷貝到dex2jar.bat所在目錄。
4)、產生jar檔案classes.dex.dex2jar.jar
dex2jar.bat classes.dex
5)、安裝把jar反編譯為java的工具。(JD-GUI)http://java.decompiler.free.fr/?q=jdgui
6)、運行JD-GUI工具,開啟上面的jar檔案
7)、File -> Save All Sources將產生Java原始碼檔案到c:\out
方法b(TBV):
1).從out目錄下取得dexdump。
2).adb shell dexdump -d -f -h /data/dalvik-cache/data@app@mytest.apk@classes.dex > twitpic.text
步驟3:破解原始碼1).尋找位置
由於此軟體要求積分大於1500才可下載,故開啟java檔案,尋找1500發現有三個檔案有定義,PlayActivity$12.java,Cfg.java,ScoreDialog$5.java。
PlayActivity$12.java
final class PlayActivity$12 implements Runnable{ public void run() {... int i = 1500; int j; Cfg.IS_WITHAD = j; if (j != 0) { if (this.val$arg1 >= i) //似乎為顯示廣告門限控制值 break label91; boolean bool2 = Cfg.HIDDEN_GUANGGAO; label35: boolean bool3; //??? Cfg.HIDDEN_GUANGGAO = bool3; Cfg.SaveBool("hiddenguanggao", bool3); }
ScoreDialog$5.java
final class ScoreDialog$5 implements Runnable{ public void run() { Object localObject1 = null; int i = 17301659; int j = 1500; //Score... if (localProgressDialog != null) if (this.val$arg1 < j) //可以猜出此為定義的分數之一,如不滿足則彈出對話方塊 { ScoreDialog localScoreDialog1 = this.this$0;
Cfg.java
public class Cfg{... public static final int HIDDEN_GUANGGAO_NEED_SCORE = 1500; //似乎為顯示廣告與否的分數門限值
PlayActivity$12.java
final class PlayActivity$12 implements Runnable{ public void run() { boolean bool1 = true; DialogInterface.OnClickListener localOnClickListener1 = null; int i = 1500;但HIDDEN_GUANGGAO_NEED_SCORE並未被其他任何檔案應用,但保險起見任然改動此值。
2)更改smali檔案
smali檔案只是將java檔案的尾碼改為.smali,故可找到上述三檔案對應的smali檔案
Cfg.smali
.field public static final HIDDEN_GUANGGAO_NEED_SCORE:I = 0x5DC //此處改為0x0
PlayActivity$12.smali
.method public run()V .locals 6 .prologue const/4 v2, 0x1 const/4 v4, 0x0 const/16 v3, 0x5DC //此處改為0x0
ScoreDialog$5.smali
.method public run()V .locals 10 .prologue const/4 v7, 0x0 const v5, 0x108009b //對應17301659 const/16 v6, 0x5DC //此處改為0x0
步驟4 將反編譯完的檔案重新打包成apk檔案out.apk
apktool b c:\out out_raw.apk
步驟5:對產生的apk簽名:
1).準備工具
如沒有安裝JDK,請在Sun官方網站下載JDKhttp://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe,其實僅需要中的Keytool和Jarsigner。
2)、準備簽名檔案
"C:\Program Files\Java\jdk1.6.0_24\bin\keytool" -genkey -alias wendy.keystore -keyalg RSA -validity 20000 -keystore wendy.keystore
注意密碼為6位元,如123456。
3)、簽名
"C:\Program Files\Java\jdk1.6.0_24\bin\jarsigner" -verbose -keystore wendy.keystore -signedjar out.apk out_raw.apk wendy.keystore
此處需輸入第2步的密碼123456,執行完即可產生簽名後的apk檔案out.apk.
安裝後,發現原有限制被破解了,一切成功。
ref:
1.一個APK反編譯利器Apktool1
2.如何反編譯apk
3.反編譯Android apk檔案