談?wù)劥a混淆技術(shù)的原理、方法和未來(lái)

代碼混淆是什么?

????混淆從字面意思來(lái)說(shuō)是混合、雜糅,使一個(gè)事物變得難以區(qū)分或識(shí)別。代碼混淆是將計(jì)算機(jī)程序的源代碼或機(jī)器代碼,轉(zhuǎn)換成功能上等價(jià),但是難于閱讀和理解形式的行為。本文就Android上代碼混淆技術(shù)進(jìn)行展開(kāi)討論。

代碼混淆具體方案

混淆開(kāi)啟

在對(duì)應(yīng)模塊比如的build.gradle android 配置下進(jìn)行開(kāi)啟

android {  
    buildTypes {  
        release {  
            // 啟用代碼壓縮 開(kāi)啟混淆,這是使用 ProGuard 的前提。
            minifyEnabled true    
           // 啟用資源壓縮,移除未使用的資源
            shrinkResources true   
          // 混淆配置,proguard-android-optimize.txt是Android默認(rèn)配置,在Android SDK 工具目錄下,proguard-rules.pro是用戶自定義配置,該文件在項(xiàng)目根目錄下
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  
        }  
    }  
}

開(kāi)啟混淆后,在編譯過(guò)程中會(huì)將代碼中的類名、方法名和變量名替換為無(wú)意義的字符,從而使編譯后代碼變得難以理解,增加了黑客和其他開(kāi)發(fā)者反編譯SDK或者APK讀懂源碼的難度嗎,一定程度上增加了APK的安全性。混淆過(guò)程過(guò)程其實(shí)就是一些字符映射替換的過(guò)程,為了方便開(kāi)發(fā)者自己定位問(wèn)題,Android Studio 是有把這個(gè)這個(gè)映射文件打印出來(lái)的

混淆映射文件.png

混淆map大概是如下樣子

com.example.MyClass -> com.example.a.b.c.MyClass:  
    java.lang.String myField -> myField  
    int myMethod(java.lang.String) -> a(java.lang.String)

混淆配置

????主要是指定哪些代碼需要被混淆,以及哪些代碼不被混淆(比如一些類、方法在代碼中被反射調(diào)用就不能隨便更改方法名),這些在兩種文件中:proguard-rules.pro 和 consumer-rules.pro

  • proguard-rules.pro : 該文件是用于指定當(dāng)前模塊(無(wú)論是應(yīng)用模塊還是庫(kù)模塊)的混淆規(guī)則;
  • consumer-rules.pro:該文件主要用于庫(kù)模塊(Library Module),這個(gè)文件包含的規(guī)則不是當(dāng)前模塊編譯時(shí)候的混淆規(guī)則,而是告訴使用了這個(gè)庫(kù)模塊的模塊(即庫(kù)的消費(fèi)者)在混淆自己的代碼時(shí)應(yīng)該如何配置它的這個(gè)依賴庫(kù)。

混淆規(guī)則示例:

-keep public class com.example.MyClass:保留指定的類不被混淆。
-keep class com.example.** { *; }:保留指定包下的所有類和類成員。
-keepclassmembers class com.example.MyClass { public void myMethod(); }:保留類中的特定方法不被混淆。
-keepclassmembers class com.example.MyClass { *; }:保留類中的所有成員(字段和方法)。
-keepattributes *Annotation*:保留所有的注解。
-keepclassmembers enum * { *; }:保留所有枚舉類型的成員

代碼混淆技術(shù)的未來(lái)

????代碼混淆和理解混淆代碼是盾和矛的故事,未來(lái)AI大模型加持下 代碼混淆將變得更加容易,但閱讀起來(lái)更加難,同樣的AI加持的混淆代碼解析也會(huì)變得更加容易,具體來(lái)說(shuō)AI大模型可能在以下方面混淆場(chǎng)景發(fā)揮作用:

  • 智能混淆:AI大模型可以用于設(shè)計(jì)更復(fù)雜的混淆算法,這些算法能夠自動(dòng)地識(shí)別代碼中的關(guān)鍵部分,并以更有效的方式進(jìn)行混淆。通過(guò)機(jī)器學(xué)習(xí),這些模型可以學(xué)習(xí)如何最大化混淆效果,同時(shí)最小化對(duì)性能的影響;
  • 混淆解析以及策略優(yōu)化:AI可以幫助開(kāi)發(fā)者分析混淆后的代碼,并提供關(guān)于哪些部分需要進(jìn)一步混淆或哪些混淆策略更有效的反饋
  • 攻擊模式識(shí)別:AI大模型可以分析歷史上的攻擊模式,并據(jù)此設(shè)計(jì)混淆策略,使得針對(duì)特定攻擊模式的防御更加有效;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 代碼混淆對(duì)于每個(gè)入門的 Android 工程師來(lái)說(shuō)都不會(huì)太陌生,因?yàn)樵诰幾g正式版本時(shí),這是一個(gè)必不可少的過(guò)程...
    彭旭銳閱讀 5,503評(píng)論 2 44
  • 前言 最近在整理項(xiàng)目中的混淆,踩了很多坑,如果不打開(kāi)混淆,項(xiàng)目上線了等于裸奔,風(fēng)險(xiǎn)很大,混淆如果打開(kāi)了處理不好,會(huì)...
    Jesse505閱讀 3,040評(píng)論 1 4
  • 聲明 這篇文章更多的是做一個(gè)整理,內(nèi)容來(lái)自于ProGuard官方文檔以及各種博客等,相關(guān)文章的鏈接在參考目錄里,感...
    夷陵小祖閱讀 3,793評(píng)論 0 23
  • 本篇文章:自己在混淆的時(shí)候整理出比較全面的混淆方法,比較實(shí)用,自己走過(guò)的坑,淌出來(lái)的路。請(qǐng)大家不要再走回頭路,可能...
    Zane_Samuel閱讀 55,608評(píng)論 8 93
  • 一、為什么進(jìn)行混淆 Java 是一種跨平臺(tái)的、解釋型語(yǔ)言,Java 源代碼編譯成中間”字節(jié)碼”存儲(chǔ)于 class ...
    dongzi711閱讀 3,935評(píng)論 0 3

友情鏈接更多精彩內(nèi)容