【轉】Android 防破解技術簡介

來源:互聯網
上載者:User

標籤:

http://www.cnblogs.com/likeandroid/p/4888808.htmlAndroid 防破解技術簡介

這幾年隨著互連網的不斷髮展,Android App 也越來越多!但是隨之而來的問題也越來越多,這其中比較令人頭疼的問題就是:有些不法分子利用反編譯技術破解 App,修改代碼,之後再重新編譯上傳到市集!到時候,如果使用者下載了這些應用,就可能造成個人資訊或者金錢的丟失!所以,作為開發人員的我們,有必要學習一些防止被破解的技術手段了!

簡介

現在想要破解一個 App, 大多數都是遵循著以下的幾個步驟:

  • 反編譯 App
  • 查看 App 原始碼並修改
  • 動態調試(有可能存在而已,畢竟修改源碼之後也是要調試的,哈)
  • 重新編譯 App
  • 上傳破解的 App 到商店中

目前來講大多數的破解只存在一二兩步中,但是後面的幾個步驟還是會有人弄的,所以我們不能掉以輕心呀!當然最後一步我們姑且不談了!下面我就來一個一個的介紹防止這些步驟的方法!

防止反編譯 App

目前來說,大多數人用的反編譯工具都是:jdax,dex2jar,jd-gui等工具,但是對於我們來說有個好訊息就是 這些工具很多都是開源的,我們可以在 Github 上找到這些工具的源碼,我們可以通過閱讀這些源碼,從而找出防止他們反編譯的方法,也就是讓他在反編譯你的 App 的時候,讓他們的軟體崩潰!對於這個我們可以忽略,因為去閱讀這些代碼並理解他們,是一項比較耗時的工作甚至有可能都讀不通他們的程式,所以我們盡量把經曆放在下面的幾個步驟上!

防止查看原始碼

其實並不能真正的做到防止別人查看我們的原始碼,我們只是通過代碼混淆的技術來使別人在查閱我們的原始碼時變得更加的困難而已。在 Android 中我們可以使用 ProGuard 來混淆我們的代碼。在這裡先說明一下代碼混淆的優缺點:
優點:

  1. 增加別人破解 app 的難度
  2. 壓縮、最佳化、刪除代碼
  3. 通過刪除代碼功能實現的特殊作用

缺點:

  1. 增加我們自己的調試難度(相信混效過代碼的同學都知道,在混淆之後,app會出各種錯誤)
  2. 反射方面的問題(就是找不到對應的類)

對於第一個缺點的問題的解決方案是:儲存 mappinp.txt 這個儲存映射關係的檔案,當 app 在混淆運行之後可能出現的問題,可以根據這個映射關係來快速定位出 bug 所在的位置!對於第二個缺點的問題的解決方案是:不混淆該類,如果不知道是哪個類那隻能啟動並執行時候調試了!
接下來簡要介紹一下 ProGuard 的常用文法:

-libraryjars class_path 應用的依賴包,如android-support-v4-keep [,modifier,...] class_specification 不混淆某些類-keepclassmembers [,modifier,...] class_specification 不混淆類的成員-keepclasseswithmembers [,modifier,...] class_specification 不混淆類及其成員-keepnames class_specification 不混淆類及其成員名-keepclassmembernames class_specification 不混淆類的成員名-keepclasseswithmembernames class_specification 不混淆類及其成員名-assumenosideeffects class_specification 假設調用不產生任何影響,在proguard代碼最佳化時會將該調用remove掉。如system.out.println和Log.v等等-dontwarn [class_filter] 不提示warnning

在這裡在給出 android 中標準的 proguard.cfg 檔案內容

-optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class com.android.vending.licensing.ILicensingService-keepclasseswithmembernames class * {    native <methods>;}-keepclasseswithmembernames class * {    public <init>(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembernames class * {    public <init>(android.content.Context, android.util.AttributeSet, int);}-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);} 

大家可以依據此模版在進行增刪改查。另外,我還可以通過代碼混淆來控制是否列印日誌輸出:

   -assumenosideeffects class android.util.Log {    public static *** d(...);    public static *** v(...);  }

在我寫此文章是,有些牛逼的公司已經可以進行資源檔名的混淆了,這樣就更加增大了代碼閱讀難度了!在這裡給出該文章:美團Android資源混淆保護實踐

防止動態調試

所謂的動態調試就是使用 檢測調試器

檢測調試器

這個檢測很簡單:就是當我們的軟體檢測到串連到調試器的時候,就終止程式!
首先,我們在 AndroidManifest.xml 中的 Application 標籤中添加 android:debuggable="false" 這個屬性,使程式不可調試,如果有人想調試,必定要修改這個值,之後我們只要在代碼中添加下面短代碼來檢測該值是否變改變過,如果改變過就停止程式。

if((getApplicationInfo().flags &=                  ApplicationInfo.FLAG_DEBUGGABL)!=0){   android.os.Process.killProcess(android.os.Process.myPid());}

這樣就可以解決這個問題了

防止重新編譯

代碼在上傳的時候是需要對 app 進行的簽名的,而每個簽名檔案只有 app 開發人員才有,所以我們可以根據簽名的內容來進行對比。但是簽名的檔案過長不利於對比,我們用見面簽名內容的 hashCode 來比較。擷取這個值的代碼:

   public int getsignature(String packageName) {        try {            android.content.pm.Signature[] signatures=   getPackageManager().getPackageInfo(packageName.toString(),     PackageManager.GET_SIGNATURES).signatures;        return signatures[0].hashCode();        } catch (PackageManager.NameNotFoundException e) {        e.printStackTrace();        return 0;        }    }

我們只要在本地打包之後擷取到這個值,之後在每次程式啟動並執行時候,在擷取簽名的 hashCode 的來與我們之前在本地打包的值進行比較就行了!如果不同就直接關閉程式就行了!

NDK保護

就是關鍵代碼使用 C/C++ 代碼來寫,沒有研究過

加殼

在現有的代碼外加一層 C/C++ 代碼來保護,也沒有研究過

參考資料
  • Android 軟體安全與逆向分析

【轉】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.