本文的合集已經(jīng)編著成書,高級(jí)Android開發(fā)強(qiáng)化實(shí)戰(zhàn),歡迎各位讀友的建議和指導(dǎo)。在京東即可購買:https://item.jd.com/12385680.html
逆向工程(Reverse Engineering)解析apk, 驗(yàn)證特性, 替換資源. 在批量生成應(yīng)用時(shí), 通過服務(wù)器腳本修改apk, 節(jié)約人力和時(shí)間. 我來講述一下, 逆向工程的常用工具和方法.
1. apk
apk表示Application PacKage
, 是zip文件, 修改后綴名.apk
為.zip
, 解壓獲得apk信息.
應(yīng)用信息:
AndroidManifest.xml: 二進(jìn)制清單文件.
classes.dex: Dex格式編譯文件.
resources.arsc: 二進(jìn)制預(yù)編譯資源文件.
res: 不需編譯的資源文件, 一般都是系統(tǒng)的資源文件.
assets: AssetManager檢索應(yīng)用特性.
META-INF: Jar包元數(shù)據(jù), 也包含應(yīng)用簽名.
安裝應(yīng)用
adb install -r ~/Desktop/Pedometer.apk
-r
表示強(qiáng)制安裝, 會(huì)覆蓋當(dāng)前版本.
查看手機(jī)中的所有應(yīng)用信息
adb shell pm list packages -f
導(dǎo)出手機(jī)中的apk
adb pull -p /data/app/me.chunyu.Pedometer-1/base.apk ~/Desktop/base.apk
aar類型和apk相似, 在aar中, AndroidManifest是可顯示的XML文件, 資源都在res文件夾中, 作為項(xiàng)目的庫使用.
2. aapt
aapt表示Android Assets Packaging Tool
, 即Android屬性打包工具, 導(dǎo)入命令行.
在Android SDK的build-tools
文件夾中, 如
ANDROID_SDK_HOME/build-tools/23.0.2
Android項(xiàng)目的Gradle中, 通過
buildToolsVersion
設(shè)置版本, 參考, 主要負(fù)責(zé)apk的編譯.
獲取apk信息
aapt list base.apk // 內(nèi)容
aapt dump badging base.apk // 屬性
aapt dump permissions base.apk // 權(quán)限
aapt dump resources base.apk // 資源
獲取二進(jìn)制xml信息
aapt dump xmltree base.apk AndroidManifest.xml
3. dex2jar
dex2jar是dex轉(zhuǎn)換jar的工具, 導(dǎo)入命令行, 還需要使用Java包解析工具JD-GUI. 可以分析Apk的崩潰信息, 參考.
配置
d2j-dex2jar.sh
命令行:
改變d2j-dex2jar.sh
和d2j_invoke.sh
的權(quán)限, 即chmod 777 xx.sh
.
軟鏈接:ln -s /.../Installations/dex2jar-2.0/d2j-dex2jar.sh d2j-dex2jar.sh
.
轉(zhuǎn)換apk為jar包
d2j-dex2jar.sh -f -o classes.jar base.apk
轉(zhuǎn)換過程中, 如果發(fā)生內(nèi)存不夠, 修改
d2j_invoke.sh
的虛擬機(jī)配置.
java -Xms512m -Xmx1024m -classpath "${_classpath}" "$@"
使用JD-GUI打開jar包, 資源都被替換為數(shù)字.
轉(zhuǎn)換jar包為dex
d2j-jar2dex.sh -f -o classes.dex classes.jar
壓縮dex為apk
zip -r my.apk classes.dex
注意現(xiàn)在的apk是無法安裝入手機(jī)的, 因?yàn)闆]有簽名.
即使簽名也會(huì)報(bào)錯(cuò). 通過apktool替代打包.
4. apktool
解析apk的第三方工具, 安裝方式參考.
Mac OS X:
1. Download Mac wrapper script (Right click, Save Link As apktool)
2. Download apktool-2 (find newest here)
3. Rename downloaded jar to apktool.jar
4. Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
5. Make sure both files are executable (chmod +x)
6. Try running apktool via cli
配置成功
解析apk
apktool d rgb_tool.apk
在rgb_tool
文件夾, 內(nèi)容:
apktool.yml: apk屬性.
AndroidManifest.xml: 清單文件, 非二進(jìn)制.
original: 原始數(shù)據(jù), 應(yīng)用的二進(jìn)制清單和簽名.
res: 資源文件.
smali: dex解析的代碼.
smali是dex虛擬機(jī)的解析格式, 參考. 在
dex2jar
中, 也包含smali格式的轉(zhuǎn)換.
構(gòu)建apk. 在rgb_tool/rgb_tool/dist
中生成apk文件.
apktool b rgb_tool
安裝時(shí), 會(huì)顯示未簽名.
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
添加apk簽名
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore -signedjar rgb_tool.apk rgb_tool.apk androiddebugkey
zipalign -v -f 4 rgb_tool.apk rgb_tool_align.apk
使用系統(tǒng)默認(rèn)簽名, 或者添加自己的簽名,
zipalign
用于對(duì)齊應(yīng)用, 建議使用. 參考.
顏色
接著, 我們來解析包, 修改一些顏色, 再生成包.
找到系統(tǒng)顏色, 修改rgb_tool/res/values/colors.xml
, 主題粉色.
<color name="primary">#ffff1493</color>
圖標(biāo)
替換應(yīng)用圖標(biāo), AndroidAssetStudio創(chuàng)建圖標(biāo). 替換mipmap
中ic_launcher.png
.
圖片
替換資源, 把背景圖片換了. 替換drawable-xxxhdpi-v4
中的robot.png
.
資源
替換字符串, 在strings.xml
創(chuàng)建新的字符串,
<string name="action_common_skip_wcl">CLWang</string>
在res/values/public.xml
中替換action_common_skip
為action_common_skip_wcl
.
<public type="string" name="action_common_skip_wcl" id="0x7f070017" />
public.xml
是資源映射,smali
文件使用, 類似R.java
.
apktool
是非常強(qiáng)大的逆向工程工具, 一定要熟練掌握.
5. androguard
這個(gè)是一個(gè)命令行處理庫, 開發(fā)時(shí)間很早了, 就不做深入講解了.
逆向工程的基本工具, aapt\dex2jar\apktool\androguard都已經(jīng)介紹了, 根據(jù)需求選擇好用的工具吧.
OK, that’s all. Enjoy it!