在學習《Android 軟件安全權威指南》第二章對apk文件反編譯后修改smali文件跳轉指令實現程序無條件注冊時遇到了一些問題
APK重打包流程
重新編譯APK
修改apk反編譯的smali文件后利用apktool重新編譯成apk文件。執行apktool b <apk反編譯的文件夾路徑>,執行之后生成一個bulid文件夾和dist文件夾,其中dist文件夾中存儲的是重新編譯的apk文件
對apk做4字節對齊
在使用命令行打包apk時,由於命令行打包直接將resources.arsc進行壓縮,還需要使用android sdk的build-tools中的zipalign.exe對apk做4個字節對齊,執行zipalign -v -p 4 infile.apk outfile.apk
對apk進行V2簽名
未簽名的apk文件無法在android系統上運行,通過使用android sdk的build-tools目錄的lib中的apksigner.jar對對齊后的apk進行V2簽名(因為簽名的時候是對apk文件每1mb為單位進行hash,所以需要先對齊后再進行簽名)。通過keystore簽名文件
/ --ks [簽名證書路徑]
// --ks-key-alias [別名]
// --ks-pass pass:[KeyStore密碼]
// --key-pass pass:[簽署者的密碼]
// --out [output.apk] [input.apk]
java -jar apksigner.jar sign --ks keystore路徑 --ks-key-alias keystore別名 --ks-pass pass:keystore密碼 --key-pass pass:keystore密碼 --out output.apk input.apk
安裝並運行重打包的apk
利用adb指令,安裝apk:adb install apk路徑
,運行apk:adb shell am start -n packagename/launch activityname
(packagename是包的名字,lauch activityname是activity的名字)
利用signapk進行V1簽名和利用apksigner進行V2簽名
android 7.0及其以上的android系統apk通常采用v2簽名,而使用signapk進行V1簽名的apk通常只在android7.0以下的系統中使用。
先對齊再簽名
因為