天天看點

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

轉載自:http://www.520monkey.com/archives/992

一、前言

最近想爆破一個app,沒有加殼,簡單的使用Jadx打開檢視源碼,結果把我逗樂了,代碼中既然都是中文,而且是一些比較奇葩的中文字句,如圖所示:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

瞬間感覺懵逼了,這app真會玩,我們知道因為Java語言是支援雙字元的,是以可以将包名,類名,變量名,方法名定義成中文,或者其他國家的語言都可以的。是以本身這種做法是不會運作報錯的,比如下面我們建立一個Java工程看一下效果:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

運作是沒有任何問題的。看到這裡的時候覺得很好奇,是以就先沒去看他的源碼了,而是想着怎麼實作這種混淆的功能。下面就來介紹一下這種高度混淆的原理:

二、分析混淆工具源碼

首先我們知道每個正式app釋出之前都會進行代碼混淆,而關于混淆的知識點,可以自行搜尋了解了,混淆有很多好處,優化代碼,增加安全性等,而混淆一般是采用了proguard.jar工具,這個工具混淆之後的代碼預設都是26個大小寫字母,是以如果想把代碼混淆成中文,那麼就需要對這個工具下手。幸好這個工具是開源的,是以從網上搜他的源碼下載下傳下來,導入工程即可:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

找到入口類Proguard,這裡為了示範友善,咋們就直接模拟一個指令直接運作看效果,關于指令後面會說到。這裡有一個解析指令的類功能:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

這裡可以看到混淆規則,也就是我們一般用到的proguard.cfg檔案,後面會介紹這個檔案内容。那麼下面我們就不要在深入代碼了,直接找到混淆代碼的地方即可,可以通過包名中有obfuscate快速找到這個類:SimpleNameFactory

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

進入這個類檢視内容,有一個生成混淆名的方法:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

這裡CHARACTER_COUNT=26,也就是字母的個數,再看看charAt方法:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

這個方法也很簡單,就是取52個字元中的順序一個。是以newName方法的實作邏輯就是:從52個字元中依次取出字元,如果發現這個字元被使用過了,就取下一個,如果單個字元被用完了,就雙字元,依次類推多字元等。是以這裡還有一個全局的名稱字元緩存池:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

用來記錄這個字元名稱有沒有被用過,是以通讀了一遍代碼,沒什麼難度,而且這個類還有一個測試方法:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

直接運作看看效果:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

看到了,會生成不同字元名。

三、修改混淆工具

是以知道了上面的代碼邏輯之後,下面我們就可以動手來修改這個類,讓他生成中文詞語,首先去網上搜一下中文字元的範圍,然後在定義一個生成五個字的詞語方法即可:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

這裡可以看到韓文,日文的範圍,是以我們不僅可以修改成中文,也可以修改成其他國家的語言,然後定義一個随機五字詞語的方法:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

生成不規則詞句之後,修改newName方法實作:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

然後我們在運作一下測試方法:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

看結果,我們已經實作成功了。到這裡其實我們已經将proguard.jar改造成功了,下面為了示範修改的結果,需要用一個apk做測試,我們随便弄一個apk,因為這裡不想給一個工程編寫腳本,然後将系統的proguard.jar工具替換成我們修改之後的proguard.jar。是以就直接拿到apk中的classes.dex檔案,然後将其轉化成classes.jar檔案。然後直接放到這個proguard工程中運作即可。

四、運作混淆工具

下面簡單看一下運作proguard工程需要準備哪些東西:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

因為我們操作的是Android應用需要引用到系統api是以需要導入android.jar,然後就是混淆規則檔案proguard.pro:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

這裡要說明就是引用第三方的jar,和輸入輸出jar檔案路徑設定,其他的設定都是正常的混淆規則,不多解釋了,下面就直接用上面得到app中的dex檔案轉化之後的jar檔案作為案例,運作proguard工程:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

看到混淆之後的jar檔案,和混淆的map檔案了。接下來咋們在将混淆之後的jar檔案打包回去,首先用dx指令将jar檔案變成classes.dex檔案,然後直接替換apk中原始的dex檔案,在重新簽名即可。最後咋們在用Jadx工具打開這個apk檢視内容:

Android 把Apk混淆成中文語言代碼一、前言二、分析混淆工具源碼三、修改混淆工具四、運作混淆工具五、技術總結 六、總結

看到了,我們成功了将原來的apk混淆成中文語言的代碼了,而對于這種混淆也是可以增加閱讀難度的。當然這個apk安裝運作也是不會報錯的,這裡就不示範了。

五、技術總結

到這裡我們就成功的實作了,如何将一個apk混淆成功中文語言代碼的功能了。下面還需要總結幾點:

1、本文主要是利用proguard是開源項目,修改他的混淆代碼達到我們的目的。

2、本文是将其代碼改成中文語言的,而從我們分析的過程中可以知道,可以變成其他國家的語言都是可以的。

3、本文為了友善就随機生成一個五字詞語,而如果你想生成一些有規則有個性的詞語,可以自定義一個詞語庫,然後随機取即可。

4、本文為了示範友善,就沒有正式的編寫一個編譯腳本,而是通過簡單粗暴的方式混淆jar方式進行操作。

5、這種高度混淆對于反編譯之後代碼閱讀難度有一定的增強,因為看慣了英文,一下子看中文反而不習慣了。

項目下載下傳位址:因為proguard工具是開源的,是以我沒必要上傳了,大家可以自己搜尋項目即可。

六、總結

本文就簡單的介紹了Android中的一種高度混淆技巧,讓我們的代碼變得更難讀懂,增加安全性。主要修改了混淆工具來實作這一功能。如果你看懂了文章,就可以自己定義屬于你們項目的個性化混淆政策。最後如果閱讀完了文章,一定要記得多多點贊分享,如果有打賞那就最好了!