美团Android资源混淆保护实践
前言
Android應(yīng)用中的APK安全性一直遭人詬病,市面上充斥著各種被破解或者漢化的應(yīng)用,破解者可以非常簡(jiǎn)單的通過(guò)破解工具就能對(duì)一個(gè)APK進(jìn)行反編譯、破解、漢化等等,這樣就可以修改原有代碼的邏輯、添加新代碼、添加或修改資源、或者更有甚者植入病毒等等,從而破壞原有APK的安全和用戶體驗(yàn),最終傷害到用戶和原有的開(kāi)發(fā)者。
而事物都是有兩方面的,有矛就有盾,針對(duì)Android應(yīng)用安全的各種方案應(yīng)運(yùn)而生,大家比較熟悉一般是各類加殼加固的工具,我們可以使用這些工具來(lái)保護(hù)我們的APK,加殼加固是另外一個(gè)話題了,我們這里不對(duì)加殼加固進(jìn)行介紹,后續(xù)如果有機(jī)會(huì)會(huì)單獨(dú)開(kāi)一個(gè)話題討論,我們?cè)陂_(kāi)發(fā)過(guò)程中可以通過(guò)ProGuard或者DexGuard來(lái)保護(hù)我們的代碼,從而實(shí)現(xiàn)相對(duì)的代碼安全,但我們的資源呢?我們往往忽略對(duì)資源文件的保護(hù),那這里將要分享的是如果采用常規(guī)方式對(duì)APK中的資源文件進(jìn)行保護(hù)。
資源安全
資源安全這個(gè)話題目前大家關(guān)注度不算太高,相比較而言大家更關(guān)注代碼安全,目前市面上各類APP基本都使用了ProGuard來(lái)保護(hù)代碼的安全,但對(duì)資源文件的保護(hù)力度都不大,其實(shí)資源文件是存在比較大的安全隱患,那資源會(huì)有哪些安全隱患呢?下面我們通過(guò)一個(gè)比較簡(jiǎn)單的例子來(lái)說(shuō)明下保護(hù)資源文件的重要性。
我們先用最常見(jiàn)的apktool工具來(lái)反編譯一個(gè)應(yīng)用來(lái)看看,通過(guò)運(yùn)行下面命令就能進(jìn)行反編譯;
apktool d -s xxx.apk反編譯成功后我們來(lái)看下反編譯得到的文件結(jié)構(gòu)(見(jiàn)下圖);
通過(guò)上圖中的目錄結(jié)構(gòu),我們可以看到這個(gè)應(yīng)用的資源文件大概有:anim、drawable、layout、menu、values等等,我們可以通過(guò)修改這些文件夾下的資源文件,并通過(guò)apktool進(jìn)行回編譯(apktool b 命令)就能創(chuàng)建一個(gè)經(jīng)過(guò)修改過(guò)的APK應(yīng)用,例如我們修改下圖中紅色橫線所標(biāo)示的layout文件,就能往原有APK的支付信息(根據(jù)資源名稱猜測(cè)這個(gè)layout的意圖)中添加一些我們自己的東西;
這個(gè)問(wèn)題主要是因?yàn)槲覀冊(cè)陂_(kāi)發(fā)過(guò)程中倡導(dǎo)命名的規(guī)范性,一般都要求在命名時(shí)做到見(jiàn)名知意,這樣能夠方便我們自己的理解和維護(hù),但同時(shí)這也方便了破解者,破解者可以輕松的根據(jù)文件名稱來(lái)猜測(cè)這個(gè)文件的意圖和作用,從而做破壞性的修改。
通過(guò)這個(gè)例子我們可以看出目前資源安全的重要性,那如何做到資源安全呢?安全都是相對(duì)的,沒(méi)有絕對(duì)的安全,我們接下來(lái)要討論的是類似Proguard方式的對(duì)我們的資源進(jìn)行保護(hù)。我們主要是通過(guò)修改AAPT工具來(lái)對(duì)資源進(jìn)行保護(hù),為了方便理解,下面先講一下Android應(yīng)用是怎么查找資源的。
Android查找資源的流程
在Android系統(tǒng)中,每一個(gè)應(yīng)用程序一般都會(huì)配置很多資源,用來(lái)適配不同密度、大小和方向的屏幕,以及適配不同的國(guó)家、地區(qū)和語(yǔ)言等等。這些資源是在應(yīng)用程序運(yùn)行時(shí)自動(dòng)根據(jù)設(shè)備的當(dāng)前配置信息進(jìn)行適配的。這也就是說(shuō),給定一個(gè)相同的資源ID,在不同的設(shè)備配置之下,查找到的可能是不同的資源。
這個(gè)查找過(guò)程對(duì)應(yīng)用程序來(lái)說(shuō),是完全透明的,這個(gè)過(guò)程主要是靠Android資源管理框架來(lái)完成的,而Android資源管理框架實(shí)際是由AssetManager和Resources兩個(gè)類來(lái)實(shí)現(xiàn)的。其中,Resources類可以根據(jù)ID來(lái)查找資源,而AssetManager類根據(jù)文件名來(lái)查找資源。事實(shí)上,如果一個(gè)資源ID對(duì)應(yīng)的是一個(gè)文件,那么Resources類是先根據(jù)ID來(lái)找到資源文件名稱,然后再將該文件名稱交給AssetManager類來(lái)打開(kāi)對(duì)應(yīng)的文件的。基本流程如下圖:
通過(guò)上圖我們可以看到Resources是通過(guò)resources.arsc把Resource的ID轉(zhuǎn)化成資源文件的名稱,然后交由AssetManager來(lái)加載的。
而Resources.arsc這個(gè)文件是存放在APK包中的,他是由AAPT工具在打包過(guò)程中生成的,他本身是一個(gè)資源的索引表,里面維護(hù)者資源ID、Name、Path或者Value的對(duì)應(yīng)關(guān)系,AssetManager通過(guò)這個(gè)索引表,就可以通過(guò)資源的ID找到這個(gè)資源對(duì)應(yīng)的文件或者數(shù)據(jù)。
AAPT介紹
AAPT是Android Asset Packaging Tool的縮寫(xiě),它存放在SDK的tools/目錄下,AAPT的功能很強(qiáng)大,可以通過(guò)它查看查看、創(chuàng)建、更新壓縮文件(如 .zip文件,.jar文件, .apk文件), 它也可以把資源編譯為二進(jìn)制文件,并生成resources.arsc, AAPT這個(gè)工具在APK打包過(guò)程中起到了非常重要作用,在打包過(guò)程中使用AAPT對(duì)APK中用到的資源進(jìn)行打包,這里不對(duì)AAPT這個(gè)工具做過(guò)多的討論,只看一下AAPT這個(gè)工具在打包過(guò)程中起到的作用,下圖是AAPT打包的流程:
AAPT這個(gè)工具在打包過(guò)程中主要做了下列工作:
.ap_這個(gè)文件會(huì)在生成APK時(shí)放入APK包中, .ap_ 這個(gè)文件本身是一個(gè)ZIP包,他里面包含resources.arsc、AndroidManifest.xml、assets以及所有的資源文件,下圖是UNZIP后的截圖:
可以看出*.ap_這個(gè)文件中包含的內(nèi)容,這個(gè)文件存放在build/intermediates/res的目錄下,下圖是這個(gè)文件存放的路徑截圖:
資源保護(hù)
我們這里參考Proguard Obfuscator方式,對(duì)APK中資源文件名使用簡(jiǎn)短無(wú)意義名稱進(jìn)行替換,給破解者制造困難,從而做到資源的相對(duì)安全;通過(guò)上面分析,我們可以看出通過(guò)修改AAPT在生成resources.arsc和*.ap_時(shí)把資源文件的名稱進(jìn)行替換,從而保護(hù)資源。
通過(guò)閱讀AAPT編譯資源的代碼,我們發(fā)現(xiàn)修改AAPT在處理資源文件相關(guān)的源碼是能夠做到資源文件名的替換,下面是Resource.cpp中makeFileResources()的修改的代碼片段:
上述代碼是在ResourceTable和Assets中添加資源文件時(shí), 對(duì)資源文件名稱進(jìn)行修改,這就能夠做到資源文件名稱的替換,這樣通過(guò)使用修改過(guò)的AAPT編譯資源并進(jìn)行打包,我們?cè)儆蒙厦嬷v到的apktool這個(gè)工具進(jìn)行反編譯,下圖是反編譯后的截圖:
發(fā)現(xiàn)什么變化了嗎?在res目錄下熟悉的layout、drawable、anim、menu等文件夾不見(jiàn)了,那他們?nèi)ツ牧四?#xff1f;因?yàn)閍pktool工具把它們放到了unknown文件夾下了,見(jiàn)下圖:
讓我們來(lái)看一下unknown文件夾,你會(huì)發(fā)現(xiàn)資源文件名已經(jīng)被簡(jiǎn)短無(wú)意義名稱進(jìn)行替換了,這樣會(huì)給反編譯者制造理解上的困難,反編譯者需要消耗一定的時(shí)間來(lái)搞清楚這些資源文件的作用,資源混淆帶來(lái)的另外一個(gè)好處是能明顯減小APK的大小,資源混淆既能保護(hù)資源文件的安全又能減小安裝包的大小,那我們何樂(lè)而不為呢?
這樣通過(guò)修改AAPT,我們可以在代碼零修改的基礎(chǔ)下就能做到相對(duì)的資源安全,當(dāng)然安全是相對(duì)的,沒(méi)有絕對(duì)的安全。
原文地址: ?http://tech.meituan.com/mt-android-resource-obfuscation.html
總結(jié)
以上是生活随笔為你收集整理的美团Android资源混淆保护实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美团Android DEX自动拆包及动态
- 下一篇: Android-FixBug热修复框架的