Android加固和簽名的那些坑(防掉坑技巧)
上個月公司一個專案突然要找第三方進行安全漏洞的檢測,於是打包了一個apk檔案,發到第三方結構進行了安全檢測,這專案我入職前就已經快完成的階段,我後面基本是維護和小更新.比較坑的是之前的哥們連混淆都沒有,更不要說加固了,最後掃出了30多個漏洞,看到檢測報告都懵逼了.
自己對混淆和加固之前也只是知道皮毛沒有深究,這次修復漏洞踩了不少坑,都是邊上網搜資料邊踩坑,總算搞定了,寫出來防止後人踩坑,這裡主要講加固簽名的坑,混淆這裡不說了(自己對混淆還不熟)
混淆簽名匯出
-
Q: 進行混淆,怎麼混淆?
A: 我也是不太熟簡單說一下自己的做法,先google一下常用的第三方框架的混淆程式碼找到自己需用的,剩下不常用的就上專案引用的框架對應的github專案地址找對應的混淆程式碼.
-
Q: 匯出的時候怎麼選v1和v2?區別在哪?
A: 我自己是把v1和v2都勾上,區別是v1是7.0之前就存在的簽名方式,v1相比v2安全係數要低,建議打包的時候v1和v2都勾上,只勾其中一個有可能會出現相容問題,具體自己上網查
加固
-
Q: 怎麼加固?
A: 網上很多加固方式 (360,愛加密,梆梆..)都是傻瓜式的操作,可以找自己合適的.
-
Q:加固有哪些坑?
A: apk進行加固之後簽名資訊都會丟失,加固完成之後要對apk重新進行簽名,沒有簽名的apk是不能在手機上跑的
A: 我開始用的是某數字公司的加固,加固完重新簽名就發給第三方機構檢測了,報告說我沒有進行v2簽名,一直很懵逼,明明勾了v2的簽名為什麼一直說我沒進行v2簽名,最後發現原來有些公司的提供的簽名工具不支援v2簽名,你用了他的簽名工具他會說你簽名成功,但實際上他只進行了v1的簽名,真的很蛋疼,也不說明一下.
自己進行簽名檢查和加固後重新對apk進行簽名
檢查是否簽名成功:
方法1:利用android sdk自帶的工具
-
用命令列進入本地的Android sdk目錄(我用的是mac) 地址如下 cd /Users/使用者名稱/sdk/build-tools/27.0.3/lib
- 27.0.3是你的自己的sdk版本,不一定和我一樣
-
檢查是否簽名成功 java -jar apksigner.jar verify -v my.apk (my.apk為本地安裝包的路徑)
如果出現:mac 下終端訪問檔案出現“Permission Denied”解決方案的話:
一個檔案有3種許可權,讀、寫、可執行,你這個檔案沒有可執行許可權,需要加上可執行許可權。
終端下先cd到該檔案的目錄下,執行命令 chmod a+x ./apksigner.jar(檔名)
-
重新執行步驟2檢查是否有簽名,會出現下面類似的結果:
- Verifies
- Verified using v1 scheme (JAR signing): true //已進行v1簽名
- Verified using v2 scheme (APK Signature Scheme v2): false //沒有進行v2簽名
很容易理解,ture是已簽名,false是未簽名,都為true的話說明v1,v2都成功簽名了.
方法2:
用命令列進入GetApkInfo.jar檔案目錄 cd /Users/xxxx/GetApkInfo.jar
-
執行 java -jar GetApkInfo.jar my.apk檢查是否有v2簽名
如果出現:mac 下終端訪問檔案出現“Permission Denied”解決方案的話:
一個檔案有3種許可權,讀、寫、可執行,你這個檔案沒有可執行許可權,需要加上可執行許可權。
先cd到該檔案的目錄下,執行命令 chmod a+x ./apksigner.jar(檔名)
-
再次執行 java -jar GetApkInfo.jar my.apk
執行結果: 成功 應用資訊: 包名: com.xxx.xx.xx 版本名: 2.0.1 版本號: 2 簽名檔案MD5: e093xxxb53xxxxxf5bxxxe17xxx7d V1簽名驗證通過: true 使用V2簽名: true V2簽名驗證通過: true
如果你要確保自己沒用錯簽名檔案(雖然一般不會這麼智障)這種方法比較適合你,能看到已簽名的md5值
-
keytool -v -list -keystore /Users/xxxx/MyAPP/test.jks(路徑是你的進行簽名的祕鑰路徑)
有效期開始日期: Mon May 08 09:35:21 CST 2017, 截止日期: Fri May 02 09:35:21 CST 2042 證照指紋: MD5: E0:93:xx:xx:xx:22:xx:xx:xx:5F:xx:xx:xx:xx:15:7D SHA1: xx:xx:xx:xx:xx:xx:C0:A4:xx:33:6Exx02:80:xx:DA:xx:xx:5F:xx:C3 SHA256: 39:xx:3A:xx:xx:BA:xx:A8:6C:xx:D0:C6:xx:BC:xx:76:25:xx:xx:A3:86:xx:xx:A0:xx:E8:xx:xx:4F:xx:xx:9C 簽名演算法名稱: SHA256withRSA 版本: 3
然後把兩個md5的值進行比對,如果一致說明你的簽名沒用錯祕鑰 - -||
4.手動進行簽名操作:
- 進入本地的sdk目錄 cd /Users/xxxx/sdk/build-tools/27.0.3/lib
- 執行簽名操作:
java -jar apksigner.jar sign --ks /Users/xxxx/Desktop/key.jks --ks-key-alias test --ks-pass pass:123456 --key-pass pass:123456 --out /Users/xxxx/Desktop/簽名後的安裝包.apk /Users/xxxx/Desktop/需要進行簽名的安裝包.apk
上面的命令會執行同時執行v1,v2簽名
注意仔細看上的命令列:進了黑色加粗的文字需要替換成實際的資訊
- 第一個加粗的是祕鑰的路徑
- 第二個是祕鑰的別名
- 第三個是祕鑰的密碼
- 第四個是祕鑰的密碼
- 第五個是進行了簽名的安裝包儲存的路徑
- 第六個是需要進行簽名的安裝包路徑
說個小插曲,我們的專案找的是一個規模很大的公司進行檢測,開始用了網上的免費的加固工具加固拿去檢測,別人拿去測試之後全部都脫殼了,說這種免費的加固安全沒有保障,要用他們的加固服務可以解決,要收費..呵呵,因為專案比較特殊只能答應了,打包簽名了apk,發到他們那邊進行了加固後他們把apk發回來讓我重新簽名,簽名後apk用不了,閃退....老闆說別人大公司應該不會出現這種小問題,是我的問題.恩,自己也懷疑是我的錯. 當天折騰到凌晨才下班,經歷了上面的一頓折騰後發現v1,v2都簽名了,並且md5值也沒問題. 這時就有底氣的去質問那家公司,最後發現是他們的加固出問題.
一般來說進行了上面的方法重新簽名並且檢查md5值沒錯,應該不會出問題了這時候可以去質疑一下加固方的問題.
先寫這些記錄一下,後面有需要再更新,有什麼問題可以在下面留言討論.
相關文章
- Android加固之後Apk重簽名AndroidAPK
- WebDriverAgent重簽名爬坑記Web
- Fragment中的那些坑——Android進階FragmentAndroid
- 記一次jar包簽名的坑JAR
- Python裡的那些坑Python
- Apk 簽名的那些事APK
- Android v1 簽名 和 v2+ 簽名Android
- android appium微信等自動化的那些坑兒AndroidAPP
- 繼承那些坑繼承
- iOS開發的那些坑iOS
- Go語言的那些坑Go
- Laravel裡的那些坑 - OptionalLaravel
- 移動端的那些坑
- 再見,BLE的那些坑!
- jcenter上傳的那些坑
- 我們不要送人頭!出海日本的那些坑與躲避的技巧
- Android WebView的坑AndroidWebView
- Fragment中呼叫startActivityForResult的那些坑Fragment
- springcloud-config-client的那些坑SpringGCCloudclient
- React Native 打包apk的那些坑React NativeAPK
- 那些你需要注意的坑
- android merge標籤 的使用 和 遇到的坑Android
- Docker 從入門到掉坑Docker
- 蘋果企業簽名的這些坑你都踩過哪些呢?蘋果
- 企業簽名為什麼會掉籤?企業簽名掉籤原因是什麼?
- 安卓防簽名策略安卓
- Java 中,Arrays 轉 List 的那些坑Java
- HTTP 規範中的那些暗坑HTTP
- Python:那些年我們遇到的坑Python
- uniapp之那些年踩過的坑APP
- 避坑攻略:細數買雲伺服器的那些坑,如何避免?伺服器
- Android學習“易錯” 系列:老司機都掉的坑,你進去了嗎?Android
- Android空包Apk簽名AndroidAPK
- Android 應用簽名Android
- Android簽名機制Android
- 蘋果代簽名掉籤問題蘋果
- 蘋果簽名為什麼會掉?蘋果
- 加固+美團walle簽名打包+Python一鍵打包Python