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