<魔塔50層>android反編譯破解

原由:該遊戲作者有點可惡,本來就是拿別人的遊戲,還在遊戲中加入積分的制度,打到20層後,需要積分。看不慣,就把它破解了,打到20層後,直接跳過要積分過程。
本文不提供破解後的安裝包!


過程:
首先下載目標apk,我是從這裏下載的:http://www.wandoujia.com/apps/com.ss.magicTower


然後下載工具,apktool+jd-gui+dex2jar+android sdk+jdk/jre
部分鏈接如下:
apktool(把apk文件反編譯成dalvik中間碼,smali):https://code.google.com/p/android-apktool/
jd-gui(查看jar源碼文件):http://java.decompiler.free.fr/?q=jdgui
dex2jar(把dex轉換成jar):https://code.google.com/p/dex2jar/


基本原理:首先把apk文件解壓縮,然後提取其中的.dex文件,用dex2jar把dex文件轉成jar文件,這樣就可以用jd-gui打開jar文件,查看具體的java源碼了。然後定位要修改的地方,再用apktool把apk文件轉換成dalvik的中間碼,定位到之前要修改的位置,然後修改保存,再用apktool重新打包成apk文件。最後一步,用jarsigner給前面生成的apk文件簽名,這樣就可以把咱重新制作的apk安裝到android系統上了。


具體過程:
解壓apk文件,可以用rar或者7zip,都行。
轉換成jar:dex2jar.bat classes.dex
這一步後,就會在當前目錄下生成一個classes_dex2jar.jar文件。


用jd-gui打開,並定位,這個不詳講。
(一般的程序都會用proguard來進行代碼混淆,所以你這裏看到的都是一些稀奇古怪的變量名,類名和方法名,這對定位會造成影響。但是花點時間,還是能夠找出來的。proguard現在已經默認加到了android sdk裏,在sdk/tools/proguard裏,官網是http://proguard.sourceforge.net。在程序開發中,如果你希望用proguard來混淆自己的代碼,只需在default.properties裏添加一句"proguardproguard.config=proguard.cfg",就可以啓用proguard)


apktool反編譯:apktool.bat d mota50.apk mota50
命令完成後,會生成一個mota50的文件夾,定位到smali\com\ss\magicTower\k.smali文件,用文本編輯器打開它。然後修改相應的位置。我這裏就是修改了判斷條件那個地方,把if(a.h>180)改成if(a.h>-180),這樣就永真了,所以就跳過驗證了。
(android用的是dalvik VM的中間碼,與pc端的java中間碼不同,smali文件就是dalvik的中間碼,你可以理解爲彙編語言,具體關於dalvik中間碼定義,可以看這裏http://source.android.com/tech/dalvik/dalvik-bytecode.html)
修改完之後,需要重新打包成apk文件:
apktool.bat b mota50(這個命令,會在mota50文件夾中生成build和dist,兩個文件夾,apk文件存放在dist)
你也可以用這個命令:apktool.bak b -f mota50 newmota.apk


這個命令會在當前目錄生成一個apk文件。
這樣生成的apk文件並不帶簽名,而在android中,不帶簽名的文件,是無法安裝的。所以我們需要給它重新添加簽名。
簽名需要密鑰,可是我們手上沒有,需要自己生成一個,命令如下:
keytool -genkey -v -keystore magic.keystore -alias magic.keystore -keyalg RSA -keysize 2048 -validity 10000
具體參數含義,請看這裏https://developer.android.com/tools/publishing/app-signing.html
注意:-keystore和-alias參數後面跟的名字一定要一樣,否則後面用這個密鑰去簽名apk的時候,會提示找不到證書鏈!


這個命令完成後,會在當前目錄生成一個magic.keystore密鑰文件
有了密鑰,我們就可以通過下面的命令,給apk進行簽名:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore magic.keystore -signedjar mota50_signed.apk newmota50.apk magic.keystore
這個命令就是用magic.keystore密鑰給newmota50.apk簽名,並生成一個mota50_signed.apk的文件,這就是最終的文件了。
注意:由於在jdk7中,默認的簽名算法已經改變了,所以你必須自己指定簽名算法(-sigalg)和摘要算法(-digestalg)。否則簽名無效,無法安裝。
所以以前用的類似命令:jarsigner -verbose -keystore magic.keystore -signedjar mota50_signed.apk newmota50.apk magic.keystore雖然能夠成功簽名,但是無法安裝。


當然,上面介紹的是手動簽名。你也可以通過eclipse,或者其他的IDE來進行簽名,網上也有一個 auto_signed圖形工具來簽名。這裏就不在複述。


安裝的時候,你可以安裝在android emulator裏,或者真機裏:
adb install mota50_signed.apk


總結:該文只是介紹了真個破譯的流程,對於真正關鍵的部分(修改smali文件),並沒有做過多的介紹,其實android下的smali文件跟平常碰到的彙編代碼是一樣的,只不過指令集不一樣,名字不一樣而已。如果之前幹過c/c++逆向的話,是很容易上手的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章