混淆:
混淆是針對(duì)的項(xiàng)目代碼谒撼,代碼混淆通常將代碼中的各種元素(變量、函數(shù)熄捍、類名等)改為無意義的名字烛恤,使得閱讀的人無法通過名稱猜測(cè)其用途,增大反編譯者的理解難度余耽。
雖然代碼混淆可以提高反編譯的門檻缚柏,但是對(duì)開發(fā)者本身也增大了調(diào)試除錯(cuò)的難度。開發(fā)人員通常需要保留原始未混淆代碼用于調(diào)試碟贾。
操作時(shí)機(jī):項(xiàng)目打包時(shí)
加固:
加固針對(duì)apk币喧,加固是多維度的安全防護(hù)方案轨域,包括反破解、反逆向杀餐、防篡改等干发,可以防止應(yīng)用被各類常見破解工具逆向,安全性要遠(yuǎn)大于單純的代碼混淆怜浅。
操作時(shí)機(jī):項(xiàng)目打包成的apk文件
所以铐然,混淆用于讓apk被反編譯后獲取的代碼難理解,加固可以讓apk難于被反編譯恶座。兩種操作都是對(duì)項(xiàng)目的安全措施搀暑,兩個(gè)操作是不沖突的,可以選擇其一跨琳,也可以兩個(gè)操作都做自点。
加固原理:
對(duì)App進(jìn)行加固,可以有效防止移動(dòng)應(yīng)用被破解脉让、盜版桂敛、二次打包、注入溅潜、反編譯等术唬,保障程序的安全性、穩(wěn)定性滚澜。對(duì)于金融類App粗仓,尤其重要。
對(duì)App dex進(jìn)行加固的基本步驟如下:
- 從App原始apk文件里獲取到原始dex文件
- 對(duì)原始dex文件進(jìn)行加密设捐,并將加密后的dex文件和相關(guān)的存放到assert目錄里
- 用脫殼dex文件替換原始apk文件里的dex文件借浊;脫殼dex文件的作用主要有兩個(gè),一個(gè)是解密加密后的dex文件萝招;二是基于dexclassloader動(dòng)態(tài)加載解密后的dex文件
- 因?yàn)樵糰pk文件已經(jīng)被修改蚂斤,所以需要?jiǎng)h除原始apk的簽名信息,即刪除META-INF目錄下的.RSA槐沼、.SF 和MANIFEST.MF文件
- 生成加固后的apk文件
- 對(duì)加固后的apk文件進(jìn)行簽名曙蒸,apk加固完成。
原理分析:
為什么要對(duì)原始dex進(jìn)行加密母赵,同時(shí)用脫殼dex文件替換原始dex文件逸爵?大部分的apk反編譯工具(dex2jar、apktools凹嘲、jui等)都是對(duì)dex文件進(jìn)行反編譯师倔,將dex文件反編譯成smail,然后再轉(zhuǎn)化成class文件進(jìn)行閱讀和修改。用脫殼dex替換原始dex文件之后趋艘,用上面的反編譯工具反編譯apk文件疲恢,只能看到脫殼程序的class文件,看不到apk本身的class文件瓷胧。對(duì)dex文件進(jìn)行加密显拳,這樣即使第三方拿到了dex文件,以為無法解密搓萧,也就無法對(duì)其進(jìn)行解析和分析杂数。
怎么確保apk功能正常運(yùn)行?加固后的apk啟動(dòng)之后瘸洛,脫殼dex文件會(huì)對(duì)加密后的dex文件進(jìn)行解密揍移,然后機(jī)遇dexclassload動(dòng)態(tài)加載解密后的dex文件。從用戶的角度反肋,加固前后App的功能和體驗(yàn)基本是一樣的那伐。