日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android如果对APK进行加密,提高反编译难度(思路)

發布時間:2025/3/15 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 雜七雜八 2264人閱讀 評論(9) 收藏 舉報

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

在Android整個導出過程中,生成.dex階段是整個打包發布操作的基礎,包括相應的java源代碼、外部庫文件均會被編譯鏈接到.dex文件中,而其中關于代碼的任何改動后重新生成.dex,其均會與原始文件均會有所不同,因而就可通過對.dex文件進行MD5較驗而做為app是否被破解的依據。

基本流程:

  • 打包發布階段(只進行一次):在打包生成過程得到.dex之后計算該.dex文件的MD5串,并將其寫入到NDK工程的main.cpp中,作為最終版本較驗的標準串。該過程可以加入到Ant自動化打包發布中,作為生成.dex的后續階段。
  • 動態運行階段(每次啟動進行):在main.cpp的程序啟動入口處添加動態的.dex MD5計算,并與代碼中存儲的標準MD5串進行比較,若兩者不匹配則說明程序已經被破解,即刻退出。
  • 階段1: 計算.dex文件的MD5串并將其寫入到對應的main.cpp中,相應的ant操作大體如下(并不完整以)。

    生成dex對應的MD5,并將其存儲到一個文件中:

    [html] view plaincopy
  • <target?name="predexmd5"depends="dex">??
  • ????????<exe?cexecutable="${dexmd5tool}"?failonerror="true">???
  • ???????????<arg?value="${dexmd5tempfile}"?/>???
  • ???????????<arg?value="${dex-ospath}"/>???
  • ???????</exec>??
  • </target>??
  • 從外部文件中讀入相應的MD5串,并存儲到一個ANT的變量:

    [html] view plaincopy
  • <target?name="dexmd5"?depends="predexmd5">???
  • ????????<loadfile?srcfile="${dexmd5tempfile}"property="dexmd5sign"/>??
  • </target>????
  • 將.dex文件的MD5串寫入到main.cpp中:

    [html] view plaincopy
  • <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來完成相應的重編譯工作:

    [html] view plaincopy
  • <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"

    階段: 對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进行加密,提高反编译难度(思路)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。