潘偉
【摘要】 由于Android平臺(tái)的開放性和普及性,其上的應(yīng)用開發(fā)日益增多。但由于有Android系統(tǒng)及開發(fā)工具是開源的,所有有些個(gè)人和企業(yè)利用反向工程工具對(duì)他人開發(fā)的應(yīng)用進(jìn)行破解修改,作為自己的產(chǎn)品進(jìn)行發(fā)布銷售。這種行為嚴(yán)重侵害了原作者的利益。應(yīng)用商城的運(yùn)營(yíng)者為了保證自己運(yùn)營(yíng)的產(chǎn)品是正版產(chǎn)品,必須花費(fèi)大量人力進(jìn)行測(cè)試比對(duì)。而本文提出了通過提取Android程序包中函數(shù)調(diào)用關(guān)鍵字,并使用文本余弦相似度算法進(jìn)行盜版應(yīng)用自動(dòng)檢測(cè)的方法。并基于此方法對(duì)Android反盜版系統(tǒng)的基礎(chǔ)構(gòu)架進(jìn)行了設(shè)計(jì)。
【關(guān)鍵詞】 余弦相似度 Android應(yīng)用 版權(quán)保護(hù) 反向工程
一、引言
Android操作系統(tǒng)是由谷歌公司推出的基于Linux開源的嵌入式操作系統(tǒng),當(dāng)前它主要運(yùn)用于手機(jī)等移動(dòng)設(shè)備上。從2008年推出第一款基于Android的手機(jī)以來,在短短的5年里,它已超過了原有的塞班系統(tǒng)占領(lǐng)了手機(jī)市場(chǎng)份額第一的位置。截止2013年9月全世界采用這款系統(tǒng)的設(shè)備數(shù)量已經(jīng)達(dá)到10億臺(tái)[1]。
Android系統(tǒng)之所以能這樣受到廣大用戶和開發(fā)者的青睞,主要原因在于其開放的系統(tǒng)和易于上手的應(yīng)用開發(fā)平臺(tái),大大降低了第三方廠商進(jìn)入Android應(yīng)用開發(fā)的門檻。正是由于Android平臺(tái)和應(yīng)用開發(fā)技術(shù)相對(duì)透明,有些公司和個(gè)人為了其自身利益,剽竊他人應(yīng)用,進(jìn)行反向工程,替換小部分代碼、圖片文字,改頭換面作為自己的產(chǎn)品推向市場(chǎng)。這種行為嚴(yán)重?cái)_亂了Android應(yīng)用市場(chǎng),從長(zhǎng)遠(yuǎn)來說將影響整個(gè)產(chǎn)業(yè)鏈的健康發(fā)展。尤其對(duì)于“手機(jī)應(yīng)用商店”的運(yùn)營(yíng)方,應(yīng)該擔(dān)負(fù)起平臺(tái)推廣和銷售的應(yīng)用產(chǎn)品監(jiān)督和管控的職能,避免侵權(quán)的應(yīng)用在平臺(tái)運(yùn)營(yíng)。當(dāng)前,“手機(jī)應(yīng)用商店”的運(yùn)營(yíng)方多是以書面版權(quán)文檔審核,人工評(píng)測(cè)的方式進(jìn)行版權(quán)及內(nèi)容審查。這種方式費(fèi)時(shí)費(fèi)力,而且存在人員主觀因素。因此,需要一種由計(jì)算機(jī)輔助的應(yīng)用程序包自動(dòng)版權(quán)檢測(cè)工具。
二、Android應(yīng)用盜版手段分析
要反Android應(yīng)用盜版侵權(quán),就要了解常用的應(yīng)用盜版手段。作為Android應(yīng)用盜版者最容易獲得的是已編譯好可執(zhí)行的Android應(yīng)用程序包。這個(gè)包里包括了已編譯的執(zhí)行代碼、本地庫(kù)文件、圖片和字符串資源、相關(guān)應(yīng)用的配置文件等。應(yīng)用盜版者通過使用反向工程工具把APK包解開,轉(zhuǎn)化為可直接編輯修改的資源文件、配置文件、smali代碼和動(dòng)態(tài)鏈接庫(kù)文件[2]。最容易的應(yīng)用盜版方法,就是直接修改圖片和字符串資源,這樣可以快速地完成對(duì)外觀的修改,使其從用戶界面上完全不同于原應(yīng)用。還有一些技術(shù)較高的修改者會(huì)對(duì)配置文件和smali代碼進(jìn)行修改,改變應(yīng)用執(zhí)行的順序,跳過一些公司信息、版本信息、聯(lián)網(wǎng)激活等代碼,并植入一些自己的代碼,使得應(yīng)用運(yùn)行時(shí)的行為與原應(yīng)用有較大差異。但不論何種手段,是對(duì)于一個(gè)應(yīng)用盜版者,沒有源代碼,從成本考慮一般不能對(duì)程序運(yùn)行邏輯進(jìn)行大的調(diào)整,函數(shù)調(diào)用關(guān)系基本保持與原應(yīng)用一致。如果對(duì)應(yīng)用程序的片段引用,而程序的主體框架結(jié)構(gòu)都是自創(chuàng),則不應(yīng)該歸類為抄襲和盜版的一類。
通過對(duì)盜版者的修改行為分析,被盜版的Android 應(yīng)用和新應(yīng)用雖然在界面,圖片,文字,甚至用戶體驗(yàn)流程上可能有很大差異,但是盜版者從節(jié)約成本的經(jīng)濟(jì)利益角度考慮,不會(huì)對(duì)晦澀難懂的字節(jié)碼程序作大的修改。這就為進(jìn)行自動(dòng)代碼分析,提取代碼特征進(jìn)行比對(duì),最終為確定Android應(yīng)用相似度奠定了基礎(chǔ)。
三、文本余弦相似度概念和運(yùn)用
文本余弦相似度,是基于一段文字中各關(guān)鍵字的詞頻乘以它的權(quán)重而組成的向量來表示一個(gè)文本的特征,而每個(gè)文本都可以通過統(tǒng)計(jì)獲取到它的特征向量,而兩文本的相似度就是由它們特征向量在空間中的夾角余弦值來表示的。文本的余弦相似度在0到1間變化。如果0代表兩特征向量成直角正交,兩篇文本中沒有任何相同的關(guān)鍵詞,可以認(rèn)為兩篇文本沒有抄襲的嫌疑。如果1代表特征向量重合,兩篇文本具有完全相同的關(guān)鍵詞,而且出現(xiàn)的頻率完全相同,可以認(rèn)為兩篇文本有高度抄襲的嫌疑[3]。
要完整理解文本余弦相似度算法,必須先了解詞頻和逆向文件頻率TF-IDF的概念。TF-IDF是一種用于資訊檢索與文本挖掘的常用加權(quán)技術(shù)。詞頻TF表示詞條t在文檔d中出現(xiàn)的頻率。逆向文件頻率IDF表示詞條t在文檔庫(kù)中的稀有程度[4]。IDF越大,則說明詞條t具有很好的類別區(qū)分能力。
四、Android應(yīng)用相似度比較算法設(shè)計(jì)
正如前文分析的,作為Android應(yīng)用最難以修改的部分是程序邏輯。如何從程序包中提取出程序邏輯呢?一個(gè)常用的Android程序包反向工程工具Apktool是最好的選擇。在運(yùn)行帶反編譯參數(shù)的Apktool命令行后,會(huì)生成Davlik虛擬機(jī)語言(Android的Java虛擬機(jī))表述的程序文件(smali目錄)。它是類似于匯編語言的低級(jí)語言,只要做簡(jiǎn)單的匯編就能轉(zhuǎn)化為虛擬機(jī)可執(zhí)行字節(jié)碼[5]。正是由于此種特性,也就決定了其語法和格式的嚴(yán)謹(jǐn)性,語義上無二義性,可以作為比較Android應(yīng)用相似性的基礎(chǔ)文本。
首先,提取出反編譯后代碼中所有函數(shù)調(diào)用行,并通過空格把語句分成獨(dú)立的詞??梢苑纸鉃椴僮鞣?、參數(shù)、被調(diào)用的函數(shù)。而其中操作符和參數(shù)都是頻繁出現(xiàn)在每個(gè)應(yīng)用中,不能表示特定應(yīng)用的特征,應(yīng)該把其歸入到終止統(tǒng)計(jì)的詞中,避免干擾特征向量的有用關(guān)鍵詞信息。這樣就只有被調(diào)用的函數(shù)被納入關(guān)鍵詞TD-IDF向量,這個(gè)關(guān)鍵詞包括函數(shù)的類名、函數(shù)名、參數(shù)類型列表、返回值類型,是函數(shù)的最基本特征,是最不容易被篡改的內(nèi)容。這樣就可以對(duì)于在一個(gè)應(yīng)用中出現(xiàn)的所有被調(diào)用函數(shù)關(guān)鍵詞進(jìn)行詞頻統(tǒng)計(jì)。
得到詞頻TF后,還有一個(gè)關(guān)鍵參數(shù)IDF(逆向文件頻率)。這需要對(duì)所有可以收集到的應(yīng)用程序建立應(yīng)用反編譯庫(kù)(必須要有足夠數(shù)量,這對(duì)于專門進(jìn)行應(yīng)用商城運(yùn)營(yíng)的機(jī)構(gòu)是相對(duì)容易的),提取出每個(gè)應(yīng)用中被調(diào)用的函數(shù)。并以函數(shù)為查詢索引,統(tǒng)計(jì)包含這個(gè)函數(shù)調(diào)用的應(yīng)用個(gè)數(shù)。知道了應(yīng)用反編譯庫(kù)的總應(yīng)用個(gè)數(shù)和包含這個(gè)函數(shù)調(diào)用的應(yīng)用個(gè)數(shù),就能根據(jù)IDF公式計(jì)算出某個(gè)函數(shù)調(diào)用的IDF值。如果這個(gè)函數(shù)調(diào)用出現(xiàn)的應(yīng)用越少,這個(gè)函數(shù)調(diào)就越能表現(xiàn)出當(dāng)前應(yīng)用與其他應(yīng)用的區(qū)別,IDF值就越大,此函數(shù)調(diào)用在該應(yīng)用中的特征向量的權(quán)重就越大。
有了一個(gè)應(yīng)用中每個(gè)函數(shù)調(diào)用的TF和IDF,就能得到這個(gè)應(yīng)用程序特征向量。每個(gè)應(yīng)用都有這樣一個(gè)特征向量,這樣就可以把需要檢測(cè)的應(yīng)用的特征向量和應(yīng)用庫(kù)中的每個(gè)應(yīng)用的特征向量進(jìn)行組合計(jì)算余弦相似度。在得到相似度的值后,可以和設(shè)定相似度閥值比對(duì),比如超過95%的就設(shè)為高度可疑。這樣原本無方向大范圍的人工比對(duì)過程,改進(jìn)為人工對(duì)高度可疑的盜版應(yīng)用的比對(duì),提高了處理效率。對(duì)于每個(gè)被確定為正版應(yīng)用的Android包,最后被添加到大的應(yīng)用庫(kù)中,為未來其他應(yīng)用分析提供更精確地IDF和更豐富的特征向量。
五、Android應(yīng)用反盜版系統(tǒng)設(shè)計(jì)
Android應(yīng)用相似度比較的算法只是反盜版系統(tǒng)設(shè)計(jì)的核心,在系統(tǒng)實(shí)現(xiàn)時(shí)必須考慮到在成本和效率。因?yàn)闉閼?yīng)用的數(shù)量是十分龐大的,而且每個(gè)應(yīng)用中的函數(shù)少則數(shù)百,多則數(shù)千。在系統(tǒng)設(shè)計(jì)是要考慮如何低成本的存儲(chǔ)這些數(shù)據(jù)非結(jié)構(gòu)化的離散數(shù)據(jù)。顯然關(guān)系型數(shù)據(jù)庫(kù)對(duì)于這類數(shù)據(jù)存儲(chǔ)是低效和高成本的。可以考慮針對(duì)大數(shù)據(jù)和文本處理設(shè)計(jì)的Nosql數(shù)據(jù)庫(kù),比如開源的HBASE,可以有效降低成本,平滑擴(kuò)展。在運(yùn)算能力上,由于應(yīng)用庫(kù)中每個(gè)應(yīng)用都要和被檢測(cè)應(yīng)用進(jìn)行相似度比較,而且運(yùn)算涉及向量運(yùn)算,運(yùn)算量較大??紤]到縮短處理時(shí)間和提升用戶感知,可以使用多服務(wù)器并行算法,例如Map-reduce算法,把計(jì)算任務(wù)平攤到多臺(tái)廉價(jià)服務(wù)器上,避免采購(gòu)高價(jià)的高性能、多CPU的小型機(jī)[6]。最終的相似度計(jì)算結(jié)果可以保存到關(guān)系數(shù)據(jù)庫(kù)中,用戶可以通過多種索引便捷查詢,或以圖形化報(bào)表展示。
六、結(jié)語
關(guān)于如何打擊Android應(yīng)用盜版是維護(hù)產(chǎn)業(yè)健康發(fā)展的關(guān)鍵問題。這個(gè)問題需要從法律、管理和技術(shù)多個(gè)層面共同解決。而作為應(yīng)用商店運(yùn)營(yíng)者是有義務(wù)對(duì)其推廣的應(yīng)用進(jìn)行必要的過濾和審核,避免盜版應(yīng)用上線銷售。在本文中使用了文本余弦相似度算法,通過對(duì)應(yīng)用中的函數(shù)調(diào)用特征進(jìn)行比較,發(fā)現(xiàn)高度相似的應(yīng)用,為后續(xù)人工比對(duì)提供了方向和指導(dǎo)。這種方法簡(jiǎn)單易用,實(shí)現(xiàn)成本不高,能起到輔助判斷作用。當(dāng)然對(duì)于盜版者而言可能會(huì)有針對(duì)此方法故意加入一些無用的代碼段,干擾計(jì)算結(jié)果。因此,此方法還可以進(jìn)行改進(jìn),比如過濾掉不被調(diào)用的函數(shù)和代碼段,再進(jìn)行分析??偠灾?,盜版和反盜版總是不斷魔高一尺,道高一丈的過程。反盜版的方法需要針對(duì)盜版方式的變化不斷提升演進(jìn)。