[TOC]
今日需參考ROM廠商部分APK,故查閱走坑以做記錄
工具
除了參考資源有時候需要參考別人的代碼违寞,此時需要做以下準備工具
(自備梯子找最新版本同廉,懶人請進20170401愚人節(jié)更新)
工具 | 作用 | 下載地址 |
---|---|---|
ApkTool | Goolge官方提供的APK反編譯工具十分強大, 是以下幾個工具的綜合體 | https://ibotpeaches.github.io/Apktool/install/ |
dex2jar | 將dex文件轉(zhuǎn)為jar包及.class文件 | https://github.com/pxb1988/dex2jar |
baksmali.jar | 將Odex文件轉(zhuǎn)為Dex文件 | https://bitbucket.org/JesusFreke/smali/downloads |
smali.jar | 將.smali文件重新打包轉(zhuǎn)為Dex文件 | https://bitbucket.org/JesusFreke/smali/downloads |
JD-GUI | jar\dex.smali源碼查看工具(收費及30天試用) | http://jd-gui-for-linux.apponic.com/download/ |
JAVA | 環(huán)境 | null |
以上工具ApkTool分ubuntu及windows版本請區(qū)別下載,其余無差找前。工具的安裝配置及環(huán)境不作贅述丈屹,ubuntu的話注意某些權(quán)限配置就行调俘。
反編譯資源文件
如參考圖片、布局之類泉瞻,可以直接將APK解壓出來的目錄結(jié)構(gòu)如下:
├── AndroidManifest.xml
├── META-INF
│ ├── CERT.RSA
│ ├── CERT.SF
│ └── MANIFEST.MF
├── res
│ ├── anim
│ ├── animator
│ ├── color
│ ├── drawable
│ ├── layout
│ └── xml
└── resources.arsc
直接解壓獲取到res目錄如果是加殼了的脉漏,得到的xml文件內(nèi)容會亂碼苞冯,圖片可用袖牙。此時用ApkTool處理apktool d -f flyme-res_temp.apk
, 然后會在同級目錄生成同名文件夾,xml資源全暴露包括Manifest舅锄。
反編譯源碼文件
有興趣者可以直接使用ApkTool來反編譯鞭达,對照下最后的結(jié)果瞅瞅 =。=
1.拿到dex文件####
- 普通apk
直接解壓或者使用ApkTool工具反編譯得到如下目錄, 沒錯就是那個classes.dex文件
├── AndroidManifest.xml
├── assets
├── classes.dex
├── META-INF
│ ├── CERT.RSA
│ ├── CERT.SF
│ └── MANIFEST.MF
├── res
└── resources.arsc
- 廠商預(yù)置apk
以下以系統(tǒng)預(yù)置的SystemUI.apk為例
adb root
adb remount
adb pull /system/priv-app/XXX /某個目錄
//獲取到如下目錄
SystemUI
├── lib
│ └── arm64
│ └── libnative_glrenderer.so
├── oat
│ └── arm64
│ └── SystemUI.odex
└── SystemUI.apk
這里需要把SystemUI目錄導出來不止是apk文件皇忿,原因是由于廠商預(yù)置的apk資源和代碼文件是分開的畴蹭,即資源是放到.apk文件中,代碼是放到對應(yīng).odex文件中鳍烁。另外叨襟,由于系統(tǒng)apk或是預(yù)置apk會有依賴ROM的framework.jar和framework-res.apk及其他jar包,所以需要將這幾個包也導出來幔荒,為避免遺漏糊闽,可將整個目錄導出來adb pull /system/framework /某個目錄
。獲取到預(yù)置或者系統(tǒng)的apk后爹梁,最后我們想要得到的是.odex文件右犹。但是odex文件和dex文件是有區(qū)別的,詳請自查姚垃。所以我們需要將odex文件轉(zhuǎn)為dex文件念链。
-
.odex to .smali
將依賴的odex包、jar包、oat文件放到同一個目錄下執(zhí)行java -jar baksmali.jar x XXX.odex
掂墓,此時將會在同級目錄下生產(chǎn)out目錄省略如下
├── android
│ └── support
│ ├── annotation
│ │ ├── CallSuper.smali
~
│ │ └── StringDef.smali
│ ├── v4
│ │ ├── app
│ │ │ ├── BackStackState$1.smali
~
│ │ │ └── FragmentTabHost$SavedState.smali
│ │ ├── graphics
│ │ │ └── ColorUtils.smali
│ │ ├── media
│ │ │ ├── MediaDescriptionCompat$1.smali
~
│ │ ├── os
│ │ ├── util
│ │ ├── view│
│ │ └── widget
│ └── v7
~
可以看到反編譯解析出來的都是.smali文件谦纱,其實對于高手smali文件就可以看出很多東西了,具體請移步googlesmali語法
-
.smali to .dex
此時需要將.smali文件重新打包成jar或是dex君编,執(zhí)行java -jar smali.jar as out/
服协,該指令是講將out目錄下的smali文件重新打包回dex文件,會生成名為out.dex的文件
2.將dex文件轉(zhuǎn)為jar####
將dex2jar-2.0解壓得到如下目錄
├── d2j-baksmali.bat
├── d2j-baksmali.sh
├── d2j-dex2jar.bat
├── d2j-dex2jar.sh
├── d2j-dex2smali.bat
├── d2j-dex2smali.sh
├── d2j-dex-recompute-checksum.bat
├── d2j-dex-recompute-checksum.sh
├── d2j_invoke.bat
├── d2j_invoke.sh
├── d2j-jar2dex.bat
├── d2j-jar2dex.sh
├── d2j-jar2jasmin.bat
├── d2j-jar2jasmin.sh
├── d2j-jasmin2jar.bat
├── d2j-jasmin2jar.sh
├── d2j-smali.bat
├── d2j-smali.sh
├── d2j-std-apk.bat
├── d2j-std-apk.sh
├── lib
│ ├── antlr-runtime-3.5.jar
│ ├── asm-debug-all-4.1.jar
│ ├── d2j-base-cmd-2.0.jar
│ ├── d2j-jasmin-2.0.jar
│ ├── d2j-smali-2.0.jar
│ ├── dex-ir-2.0.jar
│ ├── dex-reader-2.0.jar
│ ├── dex-reader-api-2.0.jar
│ ├── dex-tools-2.0.jar
│ ├── dex-translator-2.0.jar
│ ├── dex-writer-2.0.jar
│ └── dx-1.7.jar
└──out.dex 我們源dex文件
.bat為windows命令格式啦粹,.sh為linux格式偿荷。此時需要將必要的幾個文件賦權(quán)限
sudo chmod +x d2j_invoke.sh
sudo chmod +x out.dex
sudo chmod +x d2j-dex2jar.sh
若無權(quán)限會報錯./d2j-dex2jar.sh: 36: ./d2j-dex2jar.sh: ./d2j_invoke.sh: Permission denied
然后執(zhí)行./d2j-dex2jar.sh out.dex
就會在當前目錄生成dex2jar out.dex -> ./out-dex2jar.jar
即得到我們需要的jar包
3.JD-GUI導入jar查看源碼####
更新:2016.12.15
以上.
寫文不易 轉(zhuǎn)載注明 http://www.reibang.com/users/b98475c0edcf/latest_articles
qqq