反編譯 Android apk

如果 java 程序編譯的時候沒有混淆代碼的話,就可以比較容易的反編譯。但是反編譯不一定就能 100% 的得到原始的代碼,不過已經可以拿來做參考了。

apk --> xml

從 google code (apktool下載) 下載 apktool 工具,按照 google code 上的說明:

  • Download apktool-install-linux-* file
  • Download apktool-* file
  • Unpack both to /usr/local/bin directory (you must have root permissions)

設置好 PATH 路徑,讓系統能找到 apktool。然後 apktool d -f xx.apk /home/mingming/tmp/apk 解壓出 apk 完成的 xml 和 資源文件。

class --> jar

從 google code (dex2jar 下載) 下載 dex2jar 工具。然後把 apk 文件改後綴爲 .zip ,然後解壓出 zip。在裏面找到 class.dex ,然後把 class.dex 複製到 dex2jar 目錄下。然後執行 dex2jar.sh class.dex (可能之前需要把 dex2jar.sh 增加可執行屬性)。成功的話會在本目錄下生成 classes.dex.dex2jar.jar 。

jar --> java

從 這裏 (jd-gui 下載) 下載 jd-gui 工具。然後運行 jd-gui 打開上一步生成的 jar 包,然後就可以在 jd-gui 裏看到 jar 裏的源代碼裏。可以使用 jd-gui 的 file 菜單裏的 save all source 命令,把源代碼導出成一個 zip 包裏。

總結

結合第一步得到的 xml 文件 和 res 文件,以及第三步得到的 java 源代碼,就差不多可以還原 apk 程序了。

重新打包

參考: http://nitinzzz.blogspot.com/ (注:這個被牆了 !!=_=!!)

  • 首先,準備工具
    • apktool apk_manager , 點這裏下載
    • zip 的 管理工具 ,這個 ubuntu 底下默認有了。
    • jdk 的 jarsigner , 我這裏路徑爲 /home/nxliao/tool/android/jvm/java/jdk1.6.0_25/bin/jarsigner
    • android sdk 的 debug.keystore ,在ubuntu下爲 ~/.android/debug.keystore
  • 準備實驗對象
  • 改裝
    1. 用 zip 管理工具打開這個 apk,刪除裏面的 META-INF 目錄
    2. 用 apktool 解壓處理過的 apk
       $ ./apktool d ~/tmp/jianjiuhongchenfengha_V1.0_mumayi_85342.apk ~/tmp/jianjiuhongchenfengha
    3. 用 vi 打開目標代碼
      $ vi ~/tmp/jianjiuhongchenfengha/smali/com/sg/android/fish/FishActivity.smali
    4. 轉到第 330行(在 .method private init()V 內),將 const/16 v6, 0xc8 修改成 const/16 v6, 0x647d (也可以設置成其它數值),即可將初始金錢改成 0x647d =25752
    5. 保存退出
    6. 用 apktool 重新打包 apk
      $ ./apktool b ~/tmp/jianjiuhongchenfengha ~/tmp/jian.apk
    7. 這時候新的apk還不能直接安裝,需要打上簽名。用jdk的 jarsigner 打上簽名
         $ jarsigner -verbose -storepass android -keystore ~/.android/debug.keystore ~/tmp/jian.apk androiddebugkey
         

odex 轉 dex

odex文件無法直接使用dex2jar進行直接反編譯成jar,必須先轉爲dex,才能繼續反編譯。用到的工具 baksmali smali
下載地址:http://code.google.com/p/smali/downloads/list 

步驟:

1,分解odex文件 java -jar baksmali-1.2.4.jar -x ../TEST.odex 這時候出現問題:

Error occured while loading boot class path files. Aborting. 
org.jf.dexlib.Util.ExceptionWithContext: Cannot locate boot class path file core.odex 
at org.jf.dexlib.Code.Analysis.ClassPath.loadBootClassPath(ClassPath.java:237) 
at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:145) 
at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110) 
at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:96) 
at org.jf.baksmali.main.main(main.java:278) 
這是由於缺少core.odex, ext.odex, framework.odex, android.policy.odex, services.odex, bouncycastle.odex, core-junit.odex, 這7個文件的問題,將framework下的這5個odex文件一併考到同級目錄下,在運行命令即可。

2,生成classes.dex

java -Xmx512M -jar smali-1.2.4.jar out -o classes.dex
發佈了37 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章