1. 程式人生 > >Android APK加固技術雜談

Android APK加固技術雜談

[總結]常見app漏洞及風險

靜態破解:

通過工具apktool、dex2jar、jd-gui、DDMS、簽名工具,可以對任何一個未加密應用進行靜態破解,竊取原始碼。

二次打包

通過靜態破解獲取原始碼,嵌入惡意病毒、廣告等行為再利用工具打包、簽名,形成二次打包應用。

本地儲存資料竊取

通過獲取root許可權,對手機中應用儲存的資料進行竊取、編輯、轉存等惡意行為,直接威脅使用者隱私。

介面擷取

通過adb shell命令或第三方軟體獲取root許可權,在手機介面擷取使用者填寫的隱私資訊,隨後進行惡意行為。

輸入法攻擊

通過對系統輸入法攻擊,從而對使用者填寫的隱私資訊進行截獲、轉存等惡意操作,竊取敏感資訊。

協議抓取

通過設定代理或使用第三方抓包工具,對應用傳送與接收的資料包進行截獲、重發、編輯、轉存等惡意操作。

[總結]Android app加密保護核心概念

防記憶體竊取

防止通過gdb、gcore,從記憶體中擷取dex檔案,獲取程式碼片段,從而反編譯還原APK進行不法操作。

防動態跟蹤

防止通過ptrace除錯程序,跟蹤、攔截、修改正在執行的應用,進行動態注入,保護程式執行安全。

防逆向分析

防止通過APKTool、IDA Pro等反編譯工具破解DEX檔案,從而獲取APK原始碼,保護程式碼層安全。

防惡意篡改

校驗APK完整性,自動終止執行被篡改的APK,二次打包後應用都無法使用,杜絕盜版應用的出現。

儲存資料加密保護

更底層,跨檔案格式的資料加密,防止應用資料被竊取。

[我們的措施]Android程式反破解技術

對抗反編譯

對抗反編譯是指apk檔案無法通過反編譯工具(例如ApkTool,BakSmali,dex2jar等)對其進行反編譯,或者反編譯後無法得到軟體正確的反彙編程式碼。

基本思路是尋找反編譯工具在處理apk或者dex檔案時的缺陷,然後在自己的程式碼中加以利用,讓反編譯工具在處理我們apk檔案的時候丟擲異常或者反編譯失敗,有兩種方法可以找到反編譯工具的缺陷:

  • 閱讀反編譯工具的原始碼
  • 壓力測試

對抗靜態分析

反編譯工具一直在改進,因此即使你在版本2.1發現它的缺陷並加以利用,使反編譯你的apk失敗,但很可能在版本2.2就把這個缺陷解決了,因此,不要指望反編譯工具永遠無法反編譯你的apk,我們還需要使用其他方法來防止apk被破解:

  • 程式碼混淆技術,ProGuard提供了壓縮,混淆,優化Java程式碼和(Shrinking),混淆(Obfuscation),優化(Optimition)Java程式碼和反混淆棧跟蹤(ReTrace)的功能。
  • NDK保護:逆向NDK程式的彙編程式碼比逆向Java程式碼枯燥和困難很多,同時使用C++也可以對敏感字串和程式碼進行加密。
  • 外殼保護:針對NDK編寫的Native程式碼。

對抗動態除錯

  • 檢測偵錯程式:動態除錯使用偵錯程式來掛鉤apk,獲取apk執行時的資料,因此,我們可以在apk中加入檢測偵錯程式的程式碼,當檢測到apk被偵錯程式連線時,終止apk的執行。
  • 檢測模擬器:apk釋出後,如果發現其執行在模擬器中,很有可能是有人試圖破解或者分析它,因此這時我們也要終止apk的執行。

防止重編譯

  • 檢查APK的簽名
  • 校驗APK的完整性
  • 校驗classes.dex檔案的完整性