分享:Android中利用機器碼注冊機制防止破解(轉)


轉自:http://blog.csdn.net/huzgd/article/details/6684094

最近做一個Android應用時遇到這個問題,客戶要求功能必須注冊才能使用,而程序本身又不是聯網在線使用的,這就要在程序中加入機器碼注冊碼機制了。

眾所皆知Android應用是基於Java開發,如不做處理的話,直接反編譯APK就能看到源碼算法,要破解就沒什么難度了。

關於Android防破解,網上有價值的內容較少。我收集了一些零碎的資料,總結起來大概有以下幾種防破解的思路方式:

1.代碼混淆。2.3的Android SDK已經支持直接混淆生成APK。混淆能加大反編譯破解的難度,但光混淆不能解決問題,對於有經驗的人來說,在混淆代碼中找到注冊檢查代碼進行強行破解也不是難事。

2.簽名比對。APK中可使用簽名進行處理,不過APK的簽名不能防止反編譯,只是反編譯后不能再使用同一個簽名而已。雖然可在代碼中進行比對簽名,但比對代碼本身也可能被修改掉。因此簽名的作用不大。

3.聯網注冊。程序啟動后自動連接到服務器進行注冊驗證,並把一部分核心功能放到服務端。這種方式是最安全,不過對於單機程序就不合適了,總不能在一個記事本程序中也要求用戶登錄服務器吧。

4.dex或class動態加載。這種方式理論不錯,把一小部分核心算法做成dex或class文件,加密為資源文件,注冊成功后才解密並加載到內存中。但這個方式實現起來難度很高,我似乎沒有在網上找到實現的文章,實現后維護代碼成本也高。另外,如果將程序完全反編譯后進行調試,也仍然能下斷點把解密的dex或class文件給導出來。

5.使用NDK(或JNI)本地C/C++動態庫。對於單機應用程序來說,這個是比較好的解決辦法了。NDK編譯的原生C/C++程序調試破解的難度比較高,代碼維護也方便。

要加大破解難度,還有其它一些要注意的:可對關鍵內容或算法進行加密;把檢測算法分解成零碎片段多處調用;另外注冊相關的敏感字符串(如“注冊失敗”之類的消息)一律不以明文出現,等等。

我最終選擇的注冊機制方案是:代碼混淆+NDK庫+內容加密。簡單說明如下:

1.對所有JAVA代碼進行混淆。我之前寫的程序是Android2.2的,不支持直接混淆;后來我下載了最新的SDK,將程序的SDK版本號target設置為13,在default.properties中增加proguard.cfg,然后在工程中右鍵Tools導出簽名的APK完成混淆打包過程。

2.用NDK C語言實現機器碼的生成、注冊碼的檢測和內容的解密。在JAVA界面中只做機器碼的顯示、注冊碼的輸入和調用加解密接口,而核心的機器碼注冊碼加解密全在C程序中完成。機器碼要跟硬件ID之類的結合,稍為要注意下的是不能直接用WIFI的MAC地址,因為WIFI的MAC地址容易被修改;最好是用CPU序列號,如果沒有的話可考慮用設備ID IMEI或USB的MAC碼,但最好不要在JAVA代碼中獲取,而是要在JNI C代碼里獲取,以免被反編譯后篡改。生成過程這里就不細述了,以后有時間再寫一下。

3.對部分資源文件進行加解密處理。程序運行中要使用文件系統中的資源文件才能運行,因此我把這些文件事先在PC上加密,並把解密密鑰放在注冊碼中。根據機器碼生成注冊碼,生成器注冊碼時將解密密鑰加入。由於解密的密鑰包含在注冊碼中,破解者即使將注冊檢測繞過,也無法解密文件運行;只能獲得一個注冊碼才能執行解密。由於注冊碼檢測和解密過程在NDK程序中完成,因此即使有一個注冊碼,也難以獲得解密的密鑰和算法。

當然了,防止破解是相對的,沒有完全絕對不能破解的程序,只是讓破解的難度成本高到還不如直接注冊就行了。反過來說,如果你的程序本身沒什么價值或沒多少人會用,那基本上防破解也沒什么必要。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM