Intro
APK (Android application package) - Wikipedia
工具 - Tools
-
ADB (Android Debug Bridge)用於調試Android設備的命令行工具,使用戶可以借ADB工具與Android設備進行通信(支援Emulator)。
-
Apktool 一套可以反編譯 APK 的 Open source 工具,使用 JAVA 開發而成。
實作
反編譯 - Decomplie
-
確認 Mobile 裝置連接上電腦 OS (USB debugging on),可以透過
adb devices查詢:$ adb devices List of devices attached emulator-1234 device -
列出並找到該裝置上所安裝的 app:
$ adb shell pm list packages $ adb shell pm list packages | grep "appname" -i package:com.appname.android對應 Play Store 的 package name 可以參考網址 ID 參數
https://play.google.com/store/apps/details?id=com.appname.android -
知道 app 名稱後,利用
adb shell pm path查出 package 路徑:$ adb shell pm path com.appname.android package:/data/app/~~ufyPM_R_wxl2R0wWj-sA5B==/com.appname.android-b6Vvzl4uVnfCEwaEypQ3-x==/base.apk -
利用
adb pull抓出 package:$ adb pull /data/app/~~ufyPM_R_wxl2R0wWj-sA5B==/com.appname.android-b6Vvzl4uVnfCEwaEypQ3-x==/base.apk -
取得 APK 後,即可透過
apktool d來反編譯:$ apktool d base.apk-r,--no-resDo not decode resources.
修改 - Modification
這裡示範一個將 app 修改開啟 Webview debug (setWebContentsDebuggingEnabled) 再重新編譯回去安裝使用的情境。
-
從 apk 根目錄中
AndroidManifest.xml檔案找出android.intent.category.LAUNCHER所在的activity,即可從其android:name確認 launcher class 位置<activity android:exported="true" android:name="com.appname.android.modules.launch.LaunchActivity" ...> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>以
com.appname.android.modules.launch.LaunchActivity為例,實際檔案路徑可能為:{apk_base}/{smali_classes2}/com/appname/android/modules/launch.LaunchActivity.smali
可以直接搜尋檔名find . -type f -name "*LaunchActivity*" -
編輯該 launcher class 的 smali 檔案,將啟用 debug 的 smali code 加入至
onCreatefunction 中,可以加在 return 之前const/4 v2, 0x1 invoke-static {v2}, Landroid/webkit/WebView;->setWebContentsDebuggingEnabled(Z)V舉例(
apk\smali\com\appname\android\modules\launch\LaunchActivity.smali):# virtual methods .method public final onCreate(Landroid/os/Bundle;)V .locals 4 .line 1 ... .line 19 const/4 v2, 0x1 invoke-static {v2}, Landroid/webkit/WebView;->setWebContentsDebuggingEnabled(Z)V return-void .line 20 .end method
編譯 - Compile
-
透過
apktool b編譯$ apktool b base/ -o new_app.apk--use-aapt2parameter for invalid resource error -
透過 Uber Apk Signer 簽章app
$ java -jar uber-apk-signer.jar --apks new_app.apk ... VERIFY file: ./new_app-aligned-debugSigned.apk... # Multiple packages app 簽章 $ java -jar uber-apk-signer.jar --apks new_app.apk config.arm64.apk若要移除原有簽名,可以利用 zip
-d指令移除 apk 內相關 META-INF:
$ zip -d split_config.apk 'META-INF/*' -
透過
adb install安裝 app 回裝置上$ adb install new_app-aligned-debugSigned.apk # Multiple packages app 安裝 $ adb install-multiple base.apk config.arm64.apk