基於NDK的Android防破解

來源:互聯網
上載者:User

標籤:app安全   加密   android   ndk   源碼   

        Android程式防破解是發布app時一個很需要考慮的問題,通常的做法是對代碼加入混淆幹擾以增加破解難度。但即便如此,混淆操作之後的java代碼仍然可以被通過各種方法進行破解。在基於NDK的Android中含有相應的main.cpp來作為應用程式的入口,因而在這裡進行一些防破解較驗,相應的破解難度就會增大不少(相對於java代碼)。

        在Android整個匯出過程中,產生.dex階段是整個打包發佈動作的基礎,包括相應的java原始碼、外部庫檔案均會被編譯連結到.dex檔案中,而其中關於代碼的任何改動後重建.dex,其均會與原始檔案均會有所不同,因而就可通過對.dex檔案進行MD5較驗而做為app是否被破解的依據。對於Android app,dex源碼檔案安全性是最重要的,因此,這個dex源碼加密保護其實很有必要,在這個方面,可以做到的有愛加密這個平台,不同類型的應用也有不同的加密保護方案,詳細可以在這裡瞭解:http://www.ijiami.cn/appprotect_mobile_games

        基本流程:

        1、打包發布階段(只進行一次):在打包產生過程得到.dex之後計算該.dex檔案的MD5串,並將其寫入到NDK工程的main.cpp中,作為最終版本較驗的標準串。該過程可以加入到Ant自動化打包發布中,作為產生.dex的後續階段。

        2、動態運行階段(每次啟動進行):在main.cpp的程式啟動入口處添加動態.dex MD5計算,並與代碼中儲存的標準MD5串進行比較,若兩者不匹配則說明程式已經被破解,即刻退出。

        階段1:計算.dex檔案的MD5串並將其寫入到對應的main.cpp中,相應的ant操作大體如下(並不完整以)。

產生dex對應的MD5,並將其儲存到一個檔案中:

<target name="predexmd5"depends="dex">  

        <exe cexecutable="${dexmd5tool}" failonerror="true">   

           <arg value="${dexmd5tempfile}" />   

           <arg value="${dex-ospath}"/>   

       </exec>  

</target>  

        從外部檔案中讀入相應的MD5串,並儲存到一個ANT的變數:

<target name="dexmd5" depends="predexmd5">   

        <loadfile srcfile="${dexmd5tempfile}"property="dexmd5sign"/>  

</target>    

       將.dex檔案的MD5串寫入到main.cpp中:

<targetnametargetname="setmaincpp" depends="dexmd5">  

        <replace file="${maincppfile}"token="Ant_DexMD5Sign" value="${dexmd5sign}"/>  

</target>  

        其中使用的dexmd5tool是一個自實現的外部exe,主要實現對任意檔案計算其相應的MD5並將串值儲存到一個指定的檔案。這裡需要MD5串以檔案形式進行儲存主要是以便在ant中打該檔案並讀入其中的字串到ant變數中(並沒有找到其它方法直接將相應的MD5碼寫入到ant變數中去,因而做這樣的婉轉實現)。將MD5串向main.cpp中寫入主要就是利用ant的字串替換機制來實現即可。

        更新完main.cpp之後需要利用NDK對工程進行重新編譯(主要是重編譯這裡有改動的C++代碼,該步必須進行)

        調用NDKbuikd來完成相應的重編譯工作:

<targetnametargetname="ndkbuild" depends="setmaincpp">  

        <exec executable="${basedir}/ndkbuild.bat" failonerror="true">  

        </exec>  

</target>  

         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,它可以以.so的形式鏈入到NDK工程中,並將指定的zip包(apk包)解壓縮,將其中的所有檔案以二進位的方式返回。如此一來就可以運行時得到當前apk包的dex的二進位流;將計算binary的MD5代碼也一併加入到該工程中即可以完成在main.cpp中啟動時動態較驗.dex的MD5值。

        若當前apk包中的.dex檔案MD5碼與main.cpp中儲存的MD5碼(階段1得到)匹配,程式合法運行;否則,較驗不通過認為已經被修改過,直接退出。

基於NDK的Android防破解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.