文章目錄
- 一、反編譯工具介紹
- 1:apktool 獲取資源檔案
- 2:dex2jar(原始碼檔案獲取)
- 3:jd-gui 查看APK中classes.dex轉化成出的jar檔案,即原始碼檔案
- 二、apktool工具的反編譯重打包簽名的詳細程序
- 1:使用apktool.jar進行反編譯
- 2:修改版本號versionCode
- 3:通過修改后的檔案重新回編成apk檔案
- 4:將新的apk檔案進行重簽名以及記憶體對齊
- 1:簽名工具:jarsigner和apksigner
- 2:V1和V2簽名的區別
- 3:zipalign記憶體對齊
- 4:jarsigner給apk簽名,只支持V1簽名
- 5:apksigner給apk簽名,默認同時使用V1和V2簽名
- 6:驗證是否簽名成功
- 5:查看新生成的簽名apk的版本號是否修改成功
- 三、總結
最近突然有個緊急需求,應用的某一個版本發布到應用寶時,由于應用寶自己抓包上傳了一個高版本的安裝包(即比當前要發布的版本高),導致上傳失敗,而向應用寶申訴無果,我這沒有專案原始碼,找三方改東西太慢,所以要將這個版本反編譯、修改為更高版本號、重新打包、對齊、簽名在發布到應用市場,特此整理一些心得,
一、反編譯工具介紹
1:apktool 獲取資源檔案
Apktool是一個逆向android非常有用的工具,可以用來反編譯apk檔案,并且能在修改部分資源檔案后,重新打包成一個新的apk,
2:dex2jar(原始碼檔案獲取)
將Android的包dex檔案轉換成jar檔案,此時拿到的時位元組碼檔案一般和jd-gui結合使用,將位元組碼檔案轉成對應的原始碼
3:jd-gui 查看APK中classes.dex轉化成出的jar檔案,即原始碼檔案
將dex2jar中的jar(位元組碼)檔案轉成原始碼,既可以查看原始碼也可以進行修改,
我的需求只涉及修改版本號,而不需要修改源代碼,只需要通過apktool工具反編譯拿到資源檔案、修改版本號、重新回編打包成apk、記憶體對齊以及重簽名 下面詳細介紹apktool的使用程序,dex2jar和jd-gui的使用將單起一篇文章進行介紹,
二、apktool工具的反編譯重打包簽名的詳細程序
首先下載一個最新版的apktool.jar
1:使用apktool.jar進行反編譯
新建一個apktool.bat腳本 放入如下內容:
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
新建bat檔案很簡單直接將txt檔案另存為.bat檔案即可
對apk包進行反編譯,將apk包和bat檔案(apktool.jar)放到同一個檔案夾下,目的是為了輸入方便,只需要輸入相對路徑即可,如果不放到同一個檔案夾下,每次輸入命令都要輸入絕對路徑,
在cmd終端,cd到此目錄下,輸入以下命令:
**
注意
* outDir :表示反編譯后的資源檔案存放到哪個目錄下
* source.apk :表示要進行反編譯的apk檔案名稱
*/
apktool.bat d -o outDir source.apk
或者也可以通過下面的命令反編譯兩者實作的效果都是相同的
java -jar apktool.jar d -f source.apk -o outDir
執行完成后就會在當前目錄下生成outDir檔案夾存放反編譯后生產的資源檔案

2:修改版本號versionCode
有了這個outDir就能修改里面的東西了,最難修改的部分就是java代碼,這里對應的是smali相關的檔案夾,需要了解一些smali的語法才行,
修改應用版本號只需要修改apktool.yml即可,apktool.yml檔案中找到versionCode,修改里面的versionCode對應的值保存即可,

3:通過修改后的檔案重新回編成apk檔案
然后就是再使用下面的命令列,可以將我們的outDior檔案夾重新編譯成一個apk檔案,也就是下面命令中的new_no_singnalign.apk
**
注意
* new_no_singnalign.apk :新生成的apk檔案,此apk檔案沒有簽名和對齊
* outDir :將outDir的檔案進行編譯
*/
apktool.bat b -o new_no_signalign.apk outDir

4:將新的apk檔案進行重簽名以及記憶體對齊
1:簽名工具:jarsigner和apksigner
此處簡單介紹一下Android用的簽名工具,以及V1(Jar Signature) V2(Full APK Signature)兩種簽名
- Android中對APK簽名是通過jarsigner或apksigner進行的;
- jarsigner是JDK提供的針對jar包簽名的通用工具位于JDK/bin/jarsigner.exe;
- apksigner是Google官方提供的針對Android apk簽名及驗證的專用工具,位于Android SDK/build-tools/SDK版本/apksigner.bat;
在AS打包Build->Generate signed apk… 打包簽名程序中,可以看到兩種簽名選項 V1(Jar Signature) V2(Full APK Signature),從Android 7.0開始, 谷歌增加新簽名方案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能用舊簽名方案 V1 scheme (JAR signing)
2:V1和V2簽名的區別
V1簽名:
- 來自JDK(jarsigner), 對zip壓縮包的每個檔案進行驗證, 簽名后還能對壓縮包修改(移動/重新壓縮檔案)
- 對V1簽名的apk/jar解壓,在META-INF存放簽名檔案(MANIFEST.MF, CERT.SF, CERT.RSA),
- 其中MANIFEST.MF檔案保存所有檔案的SHA1指紋(除了META-INF檔案), 由此可知: V1簽名是對壓縮包中單個檔案簽名驗證
V2簽名:
- 來自Google(apksigner), 對zip壓縮包的整個檔案驗證, 簽名后不能修改壓縮包(包括zipalign),
- 對V2簽名的apk解壓,沒有發現簽名檔案,重新壓縮后V2簽名就失效, 由此可知: V2簽名是對整個APK簽名驗證
V2簽名優點很明顯:
簽名更安全(不能修改壓縮包)
簽名驗證時間更短(不需要解壓驗證),因而安裝速度加快
注意: apksigner工具默認同時使用V1和V2簽名,以兼容Android 7.0以下版本
3:zipalign記憶體對齊
位于Android SDK/build-tools/SDK版本/zipalign.exe zipalign;是對zip包對齊的工具,使APK包內未壓縮的資料有序排列對齊,從而減少APP運行時記憶體消耗
zipalign -v 4 in.apk out.apk //4位元組對齊優化
zipalign -c -v 4 in.apk //檢查APK是否對齊
非常重要:
在此處介紹一下v1和v2簽名以及zipalign記憶體對齊,至于先簽名后對齊,還是先對齊后簽名與你采用的簽名方是有關系,
1:zipalign可以在V1簽名后執行,但zipalign不能在V2簽名后執行,只能在V2簽名之前執行!!!
2:如果不好記你就記住一個原則就是:先對齊后簽名
有了上面概念理論介紹,接下來就直奔主題進行實操了,接下來我就按照先對齊后簽名的方式分別用V1和V2進行簽名,至于V1簽名的先簽名后對齊的方式不在這里描述了,感謝興趣的自己可以試試,
我們可以通過zipalign -c -v 4 new_no_signalign.apk //檢查APK是否對齊
此命令執行完成后可以看到 Verification FAILED,表示沒有對齊,
通過zipalign -v 4 new_no_signalign.apk new_align.apk //4位元組對齊優化


4:jarsigner給apk簽名,只支持V1簽名
jarsigner -verbose -keystore android.zhumu.keystore -signedjar (簽名后的apk路徑及名稱) (要給誰簽名.apk路徑 ) 簽名檔案的別名
運行上面的命令后需要先輸入簽名檔案的密碼才能生成簽名檔案, 最終生成的singnedv1.apk就是我們最終要用的apk檔案,
5:apksigner給apk簽名,默認同時使用V1和V2簽名
cd到Android SDK/build-tools/SDK版本/目錄下, 輸入命令 apksigner sign --ks 密鑰庫名 --ks-key-alias 密鑰別名 --out 生成的簽名檔案路徑及名稱 給哪個apk檔案簽名
注意:
1:上面面引數中 密鑰庫名、給哪個apk檔案簽名 需要給出絕對路徑,要不就報錯早找不到檔案,因為在當前目錄下沒有簽名檔案和要進行簽名的apk檔案
2:而生成的簽名檔案路徑及名稱 如果不指定路徑就生成在當前目錄下
生成的singnedV2.apk就是最終要用的APK,注意4和5是兩種簽名方式用哪一種都可以,
6:驗證是否簽名成功
方案1只支持校驗v1簽名:
keytool -printcert -jarfile singnedv1.apk //此命令只支持校驗v1簽名
方案2支持v1和v2的簽名校驗:
apksigner verify -v --print-certs (apk地址)
需要切cd 到apksigner所在的目錄
如:apksigner verify -v --print-certs C:\Users\tiansc\Desktop\apks\signedV2.apk
5:查看新生成的簽名apk的版本號是否修改成功
需要用到aapt工具看看新的apk的版本號是不是真的修改成功了,
輸入下面的命令分別對singnedv1.apk和signedV2.apk分別進行查看
aapt dump badging 要驗證的apk
如:
aapt dump badging singnedv1.apk
aapt dump badging signedV2.apk

三、總結
而在我們平時作業中關于APK的打包以及簽名都由AS工具可視化一鍵完成了,逆向開發這塊需要對APK的打包簽名的流程有較為深刻的理解,只有這樣才能一步一步的手動完成反編譯、打包、簽名的整個程序,
本文章只是著重介紹了反編譯工具apktool的使用,至于dex2jar和 jd-gui工具將會另起一篇文章進行詳細介紹,敬請關注!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/148655.html
標籤:其他
上一篇:iOS14剪切板適配案例分析:淘寶是如何判斷剪貼板內容是淘口令?(通過判斷是否符合數字和鏈接的規則來判斷是否命中淘口令的格式)
下一篇:View|作業流程

