1.一種Android應(yīng)用加固方法,基于smali流程混淆方法,應(yīng)用加密、動態(tài)加載、JNI編程、完整性校驗(yàn)和代碼混淆方法,通過改變Android應(yīng)用源程序的加載流程,使得加固后的應(yīng)用程序難以逆向,同時保證加固之后并不影響程序的正常執(zhí)行;包括如下步驟:
1)在動態(tài)加載Android應(yīng)用真正的dex文件之前,用AES加密算法加密真正的dex文件,得到加密后的dex文件class.dex.jar;
2)編寫so函數(shù)庫,執(zhí)行如下操作;
21)使用JNI編寫解密庫decrytApp.so,將解密函數(shù)寫在動態(tài)鏈接庫中,用于解密所述加密后的dex文件;
22)使用JNI編寫底層核心邏輯庫Function.so,將程序的核心邏輯寫在動態(tài)鏈接庫中;
3)編寫偽smali文件,用于程序的完整性校驗(yàn)和對加密后的dex文件class.dex.jar動態(tài)加載,由此達(dá)到混淆源程序的加載流程的目的,執(zhí)行如下操作:
31)進(jìn)行源程序的完整性檢驗(yàn);
32)動態(tài)加載加密后的真正的dex文件class.dex.jar;
由此完成對Android應(yīng)用的加固,達(dá)到保護(hù)應(yīng)用程序的目的。
2.如權(quán)利要求1所述Android應(yīng)用加固方法,其特征是,步驟1)所述AES加密算法通過循環(huán)進(jìn)行加密,包括多輪AES加密循環(huán)進(jìn)行迭代運(yùn)算;除最后一輪外,每輪AES加密循環(huán)都包含以下步驟:
11)輪密鑰加:明文區(qū)塊中的每一個字節(jié)與該次回合密鑰做異或運(yùn)算;
12)字節(jié)代替:通過S盒變換方法,用查找表的方式對矩陣中的字節(jié)進(jìn)行置換;
13)行移位:對矩陣中的行進(jìn)行循環(huán)移位;
14)列混淆:對矩陣中的列進(jìn)行混合變換。
3.如權(quán)利要求2所述Android應(yīng)用加固方法,其特征是,所述AES加密算法的密鑰長度設(shè)定為128位,包括10輪迭代運(yùn)算。
4.如權(quán)利要求1所述Android應(yīng)用加固方法,其特征是,步驟2)具體使用Android NDK編寫decrytApp.so和Function.so,包括如下步驟:
a)編寫java文件,聲明本地文件中的函數(shù);
b)新建decryptApp.c文件,編寫解密函數(shù);
c)編寫JNI入口函數(shù);
d)編寫Android.mk文件;
e)編譯生成so庫,包括decrytApp.so和Function.so。
5.如權(quán)利要求1所述Android應(yīng)用加固方法,其特征是,步驟21)用C或C++編寫解密函數(shù),將解密函數(shù)寫在動態(tài)鏈接庫中。
6.如權(quán)利要求1所述Android應(yīng)用加固方法,其特征是,步驟31)所述進(jìn)行源程序的完整性檢驗(yàn),具體包括如下步驟:
311)計(jì)算Android應(yīng)用程序的校驗(yàn)和,在所述應(yīng)用程序中加入哨兵函數(shù);
312)在所述應(yīng)用程序正式運(yùn)行之前,先啟動哨兵函數(shù),重新計(jì)算應(yīng)用程序的校驗(yàn)和,并與之前的校驗(yàn)和進(jìn)行對比;
313)當(dāng)312)中重新計(jì)算得到校驗(yàn)和和311)中的校驗(yàn)和相同時,判斷得到軟件沒有被篡改,繼續(xù)運(yùn)行;當(dāng)二者不同時,判斷得到軟件被篡改,即所述Android應(yīng)用被二次打包,終止運(yùn)行。