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-res
Do 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 加入至
onCreate
function 中,可以加在 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-aapt2
parameter 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