思路一、apktool
1.通過apktool反編譯出資源和smali
apktool d MobileManager.apk
- <span style="font-family:Comic Sans MS;font-size:18px;">F:\Android\decompile\apktool>apktool d MobileManager.apk
- I: Baksmaling...
- I: Loading resource table...
- I: Loaded.
- I: Loading resource table from file: C:\Users\liupingan\apktool\framework\1.apk
- I: Loaded.
- I: Decoding file-resources...
- I: Decoding values*/* XMLs...
- I: Done.
- I: Copying assets and libs...</span>
apk打包:
apktool b MobileManager
將重新打包apk.
注意:需要重新簽名才能安裝。可以參考這篇文章進行簽名發佈:Android:APK簽名
工具下載地址:
http://code.google.com/p/android-apktool/
2.通過dex2jar將其中的dex文件反編譯出jar文件
首先將apk包重命名爲rar文件,解壓縮出來classes.dex
dex2jar managerclasses.dex
可以得到jar文件
- <span style="font-family:Comic Sans MS;">F:\Android\decompile\dex2jar-0.0.9.8\dex2jar-0.0.9.8>dex2jar managerclasses.dex
- dex2jar version: translator-0.0.9.8
- dex2jar managerclasses.dex -> managerclasses_dex2jar.jar
- Done.</span>
下載地址:http://code.google.com/p/dex2jar/
3.將jar文件解壓縮出來(可以改後綴名爲.rar),生成 .class文件目錄
jad -o -r -sjava -dsrc Manager_dex2jar/**/*.class
將反編譯Manager_dex2jar目錄及其子目錄下的所有.class文件爲.java
結果保存在src目錄下
工具下載:
http://sdrv.ms/OeMK7X
或者搜索 jad158g
思路二、baksmali/smali:
1. 反編譯:將classes.dex反編譯出.smali源碼
java -jar baksmali-1.3.3.jar -o classout/ classes.dex
2. 打包:將.smali源代碼重新打包成classes.dex
java -jar smali-1.3.3.jar classout/ -o classes.dex
3. baksmali/smali工具下載:
http://code.google.com/p/smali/
4. 同樣,需要重新簽名才能安裝使用。
可以參考這篇文章進行簽名發佈:Android:APK簽名
個人經驗:
0.一般來說,只有.smali源代碼才能重新還原打包apk,通過jad反編譯出.java源代碼由於無法徹底完全反編譯出原始代碼,無法基於java源代碼重新打包成apk。
1. 在閱讀反編譯出來的java源碼時,如果出現反編譯效果不理想的部分代碼,可以對照相應的.smali文件分析,這個是最準確的,就是dex op code。
2. 利用Eclipse變量重命名功能,可以將反編譯的java源碼中無含義的變量重命名爲有意義的變量名。
3. 反編譯出來java文件以後,對於一些資源類的索引,由於採用了硬編碼的形式,可以採用下面的工具解析出原始的資源引用代碼:
4. 一般一個完整的軟件,基本會用到一些第三方的類庫,這個需要事先甄別出來,然後刪除這部分源代碼,直接去google對應的類庫放進來,避免浪費大量的時間在分析第三方類庫上面。很多是都是開源的類庫,很容易就找到。