Android如果对APK进行加密,提高反编译难度(思路)
提高反編譯難度的幾種方式:
對(duì)于軟件安全來說,有攻就要有防才對(duì)。不然,Android整個(gè)產(chǎn)業(yè)鏈就會(huì)被這樣的Crack給毀掉。
第一種辦法:將核心代碼用JNI寫進(jìn)so庫中。由于so庫的反編譯和破解的難度加大,所以這種方式防止反編譯效果不錯(cuò)。關(guān)鍵代碼使用jni調(diào)用本地代碼,用c或c++編寫,相對(duì)于class文件,so相對(duì)比較難于反編譯。缺點(diǎn)是,對(duì)于Java層的代碼沒有保護(hù)作用,同樣可以被篡改。很多搞java的程序員不太熟悉如何寫c或c++代碼,同時(shí)本地代碼很難調(diào)試。出錯(cuò)容易導(dǎo)致整個(gè)虛擬機(jī)死掉,用戶感受不好。
第二種辦法:在線簽名比較。在程序初始化時(shí),聯(lián)網(wǎng)將運(yùn)行的程序的簽名與服務(wù)器上的官方標(biāo)準(zhǔn)簽名進(jìn)行比較,從而達(dá)到讓反編譯后的程序無法正常運(yùn)行的效果。缺點(diǎn)是,如果此部分聯(lián)網(wǎng)檢驗(yàn)的代碼被篡改跳過,則整套機(jī)制失效。
第三種辦法:代碼混淆。為了加大反編譯后代碼分析的難度,對(duì)代碼進(jìn)行混淆。混淆是不改變代碼邏輯的情況下,增加無用代碼,或者重命名,使反編譯后的源代碼難于看懂。缺點(diǎn)是,治標(biāo)不治本,同樣可以修改(甚至據(jù)說還有反混淆工具,沒用過,不多做評(píng)論)。
這三種辦法都有各自的缺點(diǎn),所以單單靠某一項(xiàng)要實(shí)現(xiàn)完美的軟件保護(hù)都是不可能的。不過,我們可以采用聯(lián)合幾種辦法的方式,來增強(qiáng)軟件保護(hù)的力度。曾經(jīng)反編譯過Android版的卡巴斯基,它的保護(hù)思路似乎是這樣的:
代碼混淆,那是必須的,不過不指望它能有很好的效果。在程序初始化時(shí),就直接通過JNI的so庫初始化程序。程序激活部分也是通過JNI聯(lián)網(wǎng)下載文件,然后在JNI層讀文件并做相應(yīng)激活與否的判斷的。
卡巴斯基是將大部分功能模塊都放在JNI層來實(shí)現(xiàn)的,如果我們的程序都這樣處理,耗費(fèi)的精力必然很大。所以,我們只是借鑒它的思路而已。具體操作思路如下:
代碼混淆。
初始化時(shí)JNI層聯(lián)網(wǎng)驗(yàn)證簽名。
驗(yàn)證失敗則直接在JNI層退出程序。
值得注意的是需要保證如果繞過JNI層的初始化,則程序無法正常啟動(dòng)。這點(diǎn)不保證的話,破解還是很容易……
/***********************************************************************************************************/
基于NDK的Android防破解
分類: Mobile Development 雜七雜八 2013-03-04 17:29 2264人閱讀 評(píng)論(9) 收藏 舉報(bào)Android程序防破解是發(fā)布app時(shí)一個(gè)很需要考慮的問題,通常的做法是對(duì)代碼加入混淆干擾以增加破解難度。但即便如此,混淆操作之后的java代碼仍然可以被通過各種方法進(jìn)行破解。在基于NDK的Android中含有相應(yīng)的main.cpp來作為應(yīng)用程序的入口,因而在這里進(jìn)行一些防破解較驗(yàn),相應(yīng)的破解難度就會(huì)增大不少(相對(duì)于java代碼)。
在Android整個(gè)導(dǎo)出過程中,生成.dex階段是整個(gè)打包發(fā)布操作的基礎(chǔ),包括相應(yīng)的java源代碼、外部庫文件均會(huì)被編譯鏈接到.dex文件中,而其中關(guān)于代碼的任何改動(dòng)后重新生成.dex,其均會(huì)與原始文件均會(huì)有所不同,因而就可通過對(duì).dex文件進(jìn)行MD5較驗(yàn)而做為app是否被破解的依據(jù)。
基本流程:
階段1: 計(jì)算.dex文件的MD5串并將其寫入到對(duì)應(yīng)的main.cpp中,相應(yīng)的ant操作大體如下(并不完整以)。
生成dex對(duì)應(yīng)的MD5,并將其存儲(chǔ)到一個(gè)文件中:
[html] view plaincopy
從外部文件中讀入相應(yīng)的MD5串,并存儲(chǔ)到一個(gè)ANT的變量:
[html] view plaincopy
將.dex文件的MD5串寫入到main.cpp中:
[html] view plaincopy其中使用的dexmd5tool是一個(gè)自實(shí)現(xiàn)的外部exe,主要實(shí)現(xiàn)對(duì)任意文件計(jì)算其相應(yīng)的MD5并將串值保存到一個(gè)指定的文件。這里需要MD5串以文件形式進(jìn)行保存主要是以便在ant中打該文件并讀入其中的字符串到ant變量中(并沒有找到其它方法直接將相應(yīng)的MD5碼寫入到ant變量中去,因而做這樣的婉轉(zhuǎn)實(shí)現(xiàn))。將MD5串向main.cpp中寫入主要就是利用ant的字符串替換機(jī)制來實(shí)現(xiàn)即可。
更新完main.cpp之后需要利用NDK對(duì)工程進(jìn)行重新編譯(主要是重編譯這里有改動(dòng)的C++代碼,該步必須進(jìn)行)
調(diào)用NDKbuikd來完成相應(yīng)的重編譯工作:
Ndkbuild.bat中的相關(guān)內(nèi)容即如同Eclipse中配置的編譯參數(shù)一樣:
X:/cygwin/bin/bash.exe --login -c "cd/cygdrive/XXX/XXX/Android/jni && $NDK/ndk-build"
階段2: 對(duì)dex計(jì)算相應(yīng)的MD5并在main.cpp中進(jìn)行啟動(dòng)時(shí)較驗(yàn)。
這里需要在app每次啟動(dòng)運(yùn)行中動(dòng)態(tài)得到當(dāng)前apk包中的.dex文件并進(jìn)行MD5的計(jì)算與較驗(yàn)。這里直接實(shí)現(xiàn)并不太容易,因而借助于了一個(gè)第三方包libzip(https://github.com/julienr/libzip-android),它可以以.so的形式鏈入到NDK工程中,并將指定的zip包(apk包)解壓縮,將其中的所有文件以二進(jìn)制的方式返回。如此一來就可以運(yùn)行時(shí)得到當(dāng)前apk包的dex的二進(jìn)制流;將計(jì)算binary的MD5代碼也一并加入到該工程中即可以完成在main.cpp中啟動(dòng)時(shí)動(dòng)態(tài)較驗(yàn).dex的MD5值。
若當(dāng)前apk包中的.dex文件MD5碼與main.cpp中存儲(chǔ)的MD5碼(階段1得到)匹配,程序合法運(yùn)行;否則,較驗(yàn)不通過認(rèn)為已經(jīng)被修改過,直接退出。轉(zhuǎn)載于:https://www.cnblogs.com/xieyuan/p/3787267.html
總結(jié)
以上是生活随笔為你收集整理的Android如果对APK进行加密,提高反编译难度(思路)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Audio Play O
- 下一篇: Android 内存优化测试(转)