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檔案的完整性