• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Android 代碼混淆的使用情況分析*

      2021-06-22 01:58:16徐玄驥董帥克張智斌
      通信技術(shù) 2021年6期
      關(guān)鍵詞:重命名標(biāo)識符字符串

      徐玄驥,董帥克,張智斌

      (1.昆明理工大學(xué),云南 昆明 650600;2.螞蟻科技集團股份有限公司,浙江 杭州 310000)

      0 引言

      代碼對于普通開發(fā)者而言是非常重要的知識產(chǎn)權(quán)。為了保護代碼資源,防止其被隨意剽竊,開發(fā)者通常會使用代碼混淆這一技術(shù)。然而,代碼混淆無異于一把雙刃劍,雖然能有效防止開發(fā)者的代碼被惡意使用,但也極大程度上增加了安全分析師的分析成本。此外,惡意軟件開發(fā)者還可以利用代碼混淆來隱藏自己的真實意圖,從而逃脫自動分析工具的掃描。與傳統(tǒng)領(lǐng)域的應(yīng)用相比,因為Java 語言天生的易于逆向的特征,代碼混淆技術(shù)對于安卓(Android)應(yīng)用具有更重要的意義。

      Android 操作系統(tǒng)是使用人數(shù)最多的移動操作系統(tǒng)。統(tǒng)計信息[1]顯示,截至2020 年12 月,谷歌官方應(yīng)用程序商店(Google Play)共有超過350 萬款應(yīng)用可供下載,月平均下載人次超過500 萬。因此,對Android 應(yīng)用的代碼混淆技術(shù)使用情況進行調(diào)研具有很重要的意義。一方面,開發(fā)者可以了解到目前主流的代碼混淆技術(shù),并判斷是否要為自己的應(yīng)用添加相應(yīng)的保護。另一方面,安全分析師可以了解到不同種類的應(yīng)用在代碼混淆技術(shù)的使用方式上的異同,從而設(shè)計出更好的代碼分析 工具。

      目前,學(xué)術(shù)界已經(jīng)有部分針對Android 代碼混淆機制的研究。文獻[2]提出了針對Dalvik 字節(jié)碼的混淆方法,并針對市面上主流的反病毒軟件進行了測試,觀察其對混淆的抵抗能力。文獻[3]提出了一種開源的黑盒混淆工具,并提供了包括重簽名、隨機清單、重命名等多種混淆方法,從而可以幫助開發(fā)者方便快捷地為應(yīng)用添加代碼混淆。文獻[4]提出了一種針對Android 應(yīng)用的控制流混淆方法,通過插入多余控制流以及對原有控制流進行壓扁操作,從而提升了代碼被逆向破解的難度。文獻[5]提出了一種基于Dalvik 字節(jié)碼抽取以及重新映射的混淆方法,通過將Dalvik 操作碼重新映射成新操作碼進而封裝成SO 文件,可以顯著提高逆向工程的成本。以往的學(xué)術(shù)文獻,往往關(guān)注如何對Android應(yīng)用的現(xiàn)有混淆技術(shù)進行修改,而忽略了從全局的角度去發(fā)掘Android 應(yīng)用整體對代碼混淆使用情況的分析。

      基于此,設(shè)計并實現(xiàn)了一套針對Android 應(yīng)用的代碼混淆掃描框架,并對標(biāo)識符重命名、字符串加密、Java 反射以及應(yīng)用加殼4 種常見的代碼混淆手段設(shè)計了相應(yīng)的檢測算法。將檢測算法運行在超過10萬款A(yù)ndroid應(yīng)用上,并對統(tǒng)計結(jié)果進行了分析。

      1 基本原理

      1.1 APK 文件的結(jié)構(gòu)

      Android應(yīng)用程序包(Android Aapplication Package,APK)文件包含了一款A(yù)ndroid 應(yīng)用的全部內(nèi)容,通常由res、assets、lib、META-INF 這4 個路徑和AndroidManifest.xml、classes.dex、resources.arsc 這3 個文件組成。它們的具體用途如下。

      (1)res:此路徑下存放了Android 的資源文件,這些資源文件將會被映射到.R 文件當(dāng)中。

      (2)assets:此路徑與res 路徑功能類似,用來存放APK 的靜態(tài)資源文件。與res 路徑不同的是,開發(fā)者可以在此路徑下創(chuàng)建任意深度的子路徑,并且存放任意文件類型的文件。

      (3)lib:此路徑下存放著為不同CPU 平臺編譯的文件,通常是各種庫文件,如.so 文件等。

      (4)META-INF:此路徑用來存放一款應(yīng)用的簽名信息,可以用來校驗應(yīng)用的完整性。

      (5)AndroidManifest.xml:Android 應(yīng)用的清單文件,用來存放應(yīng)用的基本信息,包括名稱,版本,所需權(quán)限以及組件等。每個Android 應(yīng)用都只包含一個清單文件。

      (6)classes.dex:存放Android 應(yīng)用中的所有類信息。此文件可以被Android Dalvik 虛擬機理解并執(zhí)行。

      (7)resources.arsc:此文件存放應(yīng)用中的資源文件以及其對應(yīng)的ID。

      1.2 代碼混淆在Android 中的使用

      1.2.1 標(biāo)識符重命名

      在軟件開發(fā)過程中,開發(fā)者通常賦予變量名較多的語義信息,以保證程序的較高可讀性。然而,充足的語義也為逆向者提供了方便,在變量名的幫助下,逆向者可以輕易理解原作者的編程意圖,竊取其中重要的實現(xiàn),從而對開發(fā)者的知識產(chǎn)權(quán)產(chǎn)生威脅。

      標(biāo)識符重命名通過將變量中的語義信息抹除,可以有效增加逆向者的攻擊成本,從而被廣泛使用。如下代碼片段表明,經(jīng)過標(biāo)識符重命名之后,在沒有上下文的環(huán)境下,逆向者很難弄清類a 的實際含義。

      1.2.2 字符串加密

      由于應(yīng)用中的字符串包含了非常多的語義信息,逆向者通常會將其作為理解程序語義的突破口。如1.2.1 小節(jié)程序片段表明,即便混淆了程序中出現(xiàn)的標(biāo)識符名稱,有經(jīng)驗的逆向者仍然可以依靠字符串來猜測函數(shù)的功能。因此,字符串加密被作為一種有效的混淆手段。在Android 應(yīng)用開發(fā)的過程中,字符串加密可應(yīng)用在多個階段,包括Java 代碼編譯階段、Java 字節(jié)碼轉(zhuǎn)Dex 文件階段等。

      對于惡意代碼開發(fā)者來說,字符串加密能夠有效地抹除程序語義信息,抵御部分基于硬編碼特征的掃描工具的檢測。假如加密算法實現(xiàn)得足夠復(fù)雜,還能夠有效地增加逆向過程的時間成本。下面的代碼展示了字符串加密的例子。

      1.2.3 Java 反射

      Java 反射機制是一種具有與類進行動態(tài)交互能力的一種機制,是Java 語言的常用手段,能夠使得開發(fā)者在程序運行時了解類、方法和變量的信息,動態(tài)地創(chuàng)建類的實例或調(diào)用方法。反射強調(diào)動態(tài)交互,通過運行時加載,在需要時可以隨時隨意的利用反射這種機制來進行操作。在Android 程序開發(fā)領(lǐng)域,Java 反射通常在需要訪問隱藏屬性或者調(diào)用方法來改變原來程序的邏輯中使用,常用來調(diào)用標(biāo)注有hidden 注解的應(yīng)用程序編程接口(Application Programming Interface,API)。

      以下為使用Java 反射的一個簡單示例:

      反射在普通軟件中的使用與惡意軟件存在較大的差異。普通軟件通常會利用反射進行Java 本地接口(Java Native Interface,JNI)調(diào)用或后向兼容性的檢測,惡意軟件則會利用反射去隱藏控制流,從而抵抗靜態(tài)分析工具的檢測,或使用反射將原本正常的函數(shù)調(diào)用變得十分臃腫,加強對逆向者的 干擾。

      1.2.4 應(yīng)用加殼

      加殼是一種廣泛應(yīng)用的代碼保護技巧。在加殼之后,原應(yīng)用將會被加密并被稱為“殼”的新應(yīng)用所替代。當(dāng)用戶在屏幕點擊應(yīng)用時,新應(yīng)用將被啟動,在啟動的過程中同時完成解密與還原操作,還原完成后再將程序控制權(quán)轉(zhuǎn)移給原應(yīng)用。在實際生產(chǎn)環(huán)境中,“殼”的解密過程通常較為復(fù)雜,難以通過靜態(tài)分析的方式將加密后的原應(yīng)用解密,進而可以大大增加逆向工程的成本與開銷。

      2 掃描框架的設(shè)計與實現(xiàn)

      圖1 展示了本文所使用的掃描框架的設(shè)計原理。為了增加掃描結(jié)果的覆蓋性,從3 種不同的數(shù)據(jù)源中爬取Android 應(yīng)用程序,使用Androguard 工具[6]對其進行解包。無法解包成功的應(yīng)用實例將被剔除。在解包之后,使用自行設(shè)計的4 種混淆手段檢測方法對應(yīng)用進行掃描,并對掃描結(jié)果進行手工分析與匯總。

      圖1 掃描框架設(shè)計

      2.1 標(biāo)識符重命名的檢測方法

      通過對多種Android 代碼混淆工具進行調(diào)研,研究發(fā)現(xiàn),使用了標(biāo)識符重命名的Android 程序在標(biāo)識符的分布上會與未混淆的Android 程序產(chǎn)生較大差異。為了準(zhǔn)確地表示這種差異,設(shè)計了基于3-Gram[7]詞頻的標(biāo)識符重命名檢測算法,其具體流程如下。

      (1)數(shù)據(jù)預(yù)處理:針對某Android 應(yīng)用,提取其全部標(biāo)識符名稱,組成集合Set_id。

      (2)特征生成:針對Set_id 中的所有標(biāo)識符,使用3-Gram 方法抽取其所有元組,統(tǒng)計各元組的出現(xiàn)頻次,組成固定長度的向量并作歸一化。

      (3)模型訓(xùn)練:從開源倉庫F-Droid 下載3 147 款未經(jīng)混淆的Android 應(yīng)用程序組成集合Set_app,使用兩種不同的混淆器(ProGuard 和DashO)對Set_app 中的應(yīng)用程序的標(biāo)識符進行重命名,進而生成了未經(jīng)混淆與經(jīng)過混淆的兩種正負(fù)樣本集合。對樣本集合中的應(yīng)用程序進行數(shù)據(jù)預(yù)處理與特征生成得到特征集合Set_feat,再依靠特征集合Set_feat訓(xùn)練支持向量機(Support Vector Machine,SVM)分類器。

      訓(xùn)練出來的SVM 分類器可以判斷某Android 應(yīng)用是否進行了標(biāo)識符重命名混淆。

      2.2 字符串的檢測方法

      由1.2.2 小節(jié)可知,加密能夠?qū)ndroid 應(yīng)用中的字符串變得隨機,并且難以理解。而字符串的隨機性可以用信息熵來描述。加密后的字符串較之普通字符串,往往擁有更高的信息熵。

      信息熵的通用計算公式為:

      式中,N表示事件的個數(shù),Pi表示事件i的發(fā)生概率。

      在本系統(tǒng)的實現(xiàn)中,抽取了一個Android 應(yīng)用中出現(xiàn)的所有字符串并將其合并。假設(shè)合并后的字符串為S中出現(xiàn)的字符種類共為N,Pi表示第i個字符Xi出現(xiàn)的概率,則,其中S.count(Xi)表示Xi在S中出現(xiàn)的次數(shù),S.length表示字符串的長度。最終通過式(1)計算獲得信息熵。

      接下來,進一步復(fù)用了2.1 小節(jié)展示的思路,針對一款A(yù)ndroid 應(yīng)用抽取其全部字符串并組合,計算其信息熵,并使用信息熵來訓(xùn)練SVM 分類器。

      2.3 Java 反射檢測方法

      Java 提供了多種反射API 來實現(xiàn)不同的目的,這是Java語言的一種高級特征。本文主要關(guān)注[Class.forName()→getMethod()→invoke()]操作序列,一方面因為這種操作序列的Java 反射操作中最常見的模式,另一方面這種操作序列能夠隱性地轉(zhuǎn)移程序的控制流,從而作為一種混淆手段躲避靜態(tài)掃描工具的檢測。在檢測到Java 反射的使用后,對解包產(chǎn)生的Smali 文件進行了進一步的分析,通過后向切片的方法獲取Java 反射調(diào)用的真實對象,并分析其調(diào)用意圖。

      2.4 應(yīng)用加殼檢測方法

      應(yīng)用加殼通常有較高的開發(fā)門檻,因此開發(fā)者往往選擇專門廠商提供的應(yīng)用加殼服務(wù),如梆梆加固、360 加固等。由于應(yīng)用加殼功能通常作為一種云服務(wù)出售,使用某廠商加殼功能的應(yīng)用在代碼層面通常具有相似的特征?;诖?,人工分析了若干應(yīng)用加殼廠商,并從中抽取了相應(yīng)的靜態(tài)特征進行掃描,若某應(yīng)用命中了這條特征,則可以認(rèn)為它使用了該廠商的應(yīng)用加殼服務(wù)。本文選取的特征如 表1 所示。

      表1 常用應(yīng)用加殼服務(wù)及其對應(yīng)的靜態(tài)特征

      3 掃描結(jié)果與分析

      3.1 數(shù)據(jù)集

      為了使掃描的結(jié)果更具有代表性,從3 種不同渠道收集了共114 560 款A(yù)ndroid 應(yīng)用。數(shù)據(jù)集囊括了來自Google 官方市場和中國第三方市場的Android 應(yīng)用以及惡意軟件。具體的數(shù)量信息如表2所示。

      表2 數(shù)據(jù)集詳情

      3.2 標(biāo)識符重命名掃描

      表3 展示了數(shù)據(jù)集中標(biāo)識符重命名的掃描結(jié)果??梢钥闯?,中國第三方市場和惡意軟件中的Android 應(yīng)用使用標(biāo)識符重命名的頻率更高。而Google 官方市場中僅有不到一半的Android 應(yīng)用使用了標(biāo)識符重命名。對此現(xiàn)象的解釋是,Google 官方市場針對軟件剽竊提采取了更為嚴(yán)格的監(jiān)管措施,從而使得對于軟件開發(fā)者來說代碼混淆并不是必須的工作。

      表3 標(biāo)識符重命名使用情況

      在進一步人工判斷了惡意軟件與正常軟件針對標(biāo)識符重命名的不同策略后發(fā)現(xiàn),惡意軟件傾向于使用更復(fù)雜的命名策略,比如使用相似的字母組成不同的字符串,如Ill1II 與ll1II1 中使用了l、I、1這3 種不同的字符。除此之外,惡意軟件還常常利用Java 的重載特性,用毫無關(guān)聯(lián)的詞匯替代原有的標(biāo)識符。這種情況對安全分析師造成了較強的干擾。

      3.3 字符串加密掃描

      表4 展示了數(shù)據(jù)集中字符串加密的掃描情況??梢钥吹剑珿oogle 官方市場與中國第三方應(yīng)用市場中均極少使用字符串加密,而惡意軟件中使用字符串加密的樣例占比超過5&。

      表4 字符串加密使用情況

      通過進一步手工分析了使用字符串加密的惡意軟件樣例,發(fā)現(xiàn)字符串加密通常與標(biāo)識符重命名結(jié)合起來,通過將字符串的加解密函數(shù)名更改為毫無關(guān)聯(lián)的詞組,從而誤導(dǎo)安全分析師。比如,在軟件com.solodroid.materialwallpaper 中,字符串的解密函數(shù)被命名為NavigationItem;->getDrawable()。從字面分析,其意義可能為獲取圖像資源的函數(shù)。

      3.4 Java 反射掃描

      表5 展示了數(shù)據(jù)集中的Android 應(yīng)用對Java 反射的使用情況??梢钥闯?,反射作為一種Java 語言的高級用法,在各種類型的應(yīng)用中被使用的比例較為接近。

      表5 Java 反射使用情況

      進一步分析不同類型的Android 應(yīng)用使用反射調(diào)用的真實目標(biāo),發(fā)現(xiàn)惡意應(yīng)用傾向于使用Java 反射調(diào)用敏感的API,或使用Java 反射將普通的調(diào)用臃腫化,從而增加逆向分析師的分析成本。而普通應(yīng)用則通常只考慮應(yīng)用程序的兼容性。這種方法的差異可以從表6 中清晰地看出。

      表6 Java 反射調(diào)用頻率最高的前兩位使用情況

      3.5 應(yīng)用加殼掃描

      掃描結(jié)果顯示,在114 560 款A(yù)ndroid 應(yīng)用當(dāng)中,共有7 408 款應(yīng)用使用了加殼技術(shù),占比百分之6.5&。具體到各廠商提供的加殼服務(wù)的數(shù)據(jù)如表7 所示。

      表7 應(yīng)用加殼使用情況

      在進一步的人工分析當(dāng)中發(fā)現(xiàn),使用了加殼技術(shù)的應(yīng)用非常難于自動化分析,往往需要通過虛擬機或人工脫殼,才能夠獲取原應(yīng)用文件,此舉通常能夠比較好地保護開發(fā)者的代碼資源。

      4 結(jié)語

      在本文中,為了了解代碼混淆在Android 應(yīng)用上的使用情況。采集了來自3 種不同來源的Android應(yīng)用程序,并構(gòu)建了一個擁有10 余萬不同類型Android 應(yīng)用的數(shù)據(jù)庫。除此之外,設(shè)計了一套代碼混淆掃描框架,并將其部署于收集的數(shù)據(jù)集上。針對標(biāo)識符重命名、字符串加密、Java 反射以及應(yīng)用加殼4 種不同的代碼混淆技巧,進行自動化掃描和人工分析。掃描結(jié)果顯示,不同來源的Android應(yīng)用在代碼混淆的使用上差別較大。在實際應(yīng)用中,開發(fā)者應(yīng)該考慮更多地使用更高級的代碼混淆技巧,如字符串加密與應(yīng)用加殼等,從而更好地保護自己的代碼資源。

      猜你喜歡
      重命名標(biāo)識符字符串
      淺析5G V2X 通信應(yīng)用現(xiàn)狀及其側(cè)鏈路標(biāo)識符更新技術(shù)
      基于底層虛擬機的標(biāo)識符混淆方法
      用好Excel,文件批量重命名其實很簡單
      電腦報(2020年20期)2020-06-30 14:33:35
      批量更改網(wǎng)頁文件名稱
      電腦報(2020年11期)2020-06-30 14:32:35
      Windows 10下快速修改文件名
      電腦愛好者(2020年1期)2020-04-28 12:25:29
      基于區(qū)塊鏈的持久標(biāo)識符系統(tǒng)①
      數(shù)字美術(shù)館“數(shù)字對象唯一標(biāo)識符系統(tǒng)”建設(shè)需求淺議
      一種新的基于對稱性的字符串相似性處理算法
      依據(jù)字符串匹配的中文分詞模型研究
      玩轉(zhuǎn)批量重命名
      電腦迷(2012年16期)2012-04-29 00:44:03
      林口县| 泉州市| 寿宁县| 常山县| 眉山市| 兴安盟| 台江县| 措美县| 博客| 巩义市| 社旗县| 莱州市| 佛山市| 舒兰市| 壤塘县| 北辰区| 绵阳市| 襄樊市| 秦安县| 友谊县| 天水市| 鄄城县| 昌都县| 黑水县| 桂林市| 青河县| 阜南县| 镶黄旗| 大连市| 屏南县| 平谷区| 西丰县| 津市市| 和林格尔县| 承德市| 瑞丽市| 苍溪县| 郎溪县| 专栏| 乐平市| 临泉县|