國網(wǎng)河南省商丘市供電公司 吳建輝 楊素梅 劉 偉 匡 琮
南京德軟信息科技發(fā)展有限公司 王 鵬
為了避免移動(dòng)應(yīng)用中用戶賬號(hào)和密碼被竊取、交易數(shù)據(jù)被破解以及篡改、預(yù)防釣魚欺詐的攻擊、以及捆綁流氓、惡意的應(yīng)用和游戲被外掛摧毀等情況出現(xiàn),越來越多的開發(fā)者不得不投入更多的時(shí)間和精力來考慮通信安全、代碼層面安全等方面的問題[1]。但在移動(dòng)應(yīng)用平臺(tái)上,攻和防是具有不對等性的,防御者往往沒有攻擊者的權(quán)限等級(jí)高。
隨著現(xiàn)代技術(shù)的不斷發(fā)展,有關(guān)移動(dòng)應(yīng)用中的逆向分析也變得越發(fā)容易,因此有很多網(wǎng)絡(luò)安全公司生產(chǎn)了許多加殼服務(wù),雖說在增添加殼措施之后,在對抗靜態(tài)分析方面取得了不錯(cuò)的效果,但在應(yīng)用運(yùn)行后會(huì)使源碼暴露在內(nèi)存中,從而讓攻擊者能夠輕易的獲取窗口期dump內(nèi)存,并且在進(jìn)行一些必要的修復(fù)措施,就能在IDA里面進(jìn)行閱讀分析。將移動(dòng)應(yīng)用中的代碼虛擬化后,就可以有效的防止上述情況的發(fā)生,即使被dump,IDA也不能獲取被虛擬化加固的代碼,因?yàn)槌绦蜻\(yùn)行時(shí)并不會(huì)將虛擬指令集還原為原生指令集。下面我們主要通過有關(guān)移動(dòng)應(yīng)用虛擬化加固的框架以及功能、虛擬化加固指令的實(shí)現(xiàn)這兩個(gè)方面進(jìn)行重點(diǎn)分析。
移動(dòng)虛擬化框架是由服務(wù)器端和移動(dòng)端兩部分組成的,在功能上也可以大致化為分級(jí)存儲(chǔ)管理、移動(dòng)應(yīng)用的RunTime以及離線的靜態(tài)模塊分析三大部分。
圖2.1 移動(dòng)應(yīng)用虛擬化框架設(shè)計(jì)
分級(jí)存儲(chǔ)管理(也稱為數(shù)據(jù)的遷移)主要是描述服務(wù)器端與移動(dòng)設(shè)備端之間的數(shù)據(jù)轉(zhuǎn)移過程以及有限網(wǎng)絡(luò)、WiFi等媒介的傳輸。當(dāng)移動(dòng)設(shè)備端的應(yīng)用適用于遷移,或者當(dāng)遷移到服務(wù)器端的函數(shù)執(zhí)行結(jié)束需要返回時(shí)時(shí),由該部分負(fù)責(zé)兩者之間的數(shù)據(jù)傳輸以及附帶的數(shù)據(jù)校驗(yàn)、安全等功能。
移動(dòng)應(yīng)用的RunTime有移動(dòng)端和服務(wù)端的dalvik虛擬機(jī)兩部分組成。當(dāng)應(yīng)用程序在移動(dòng)設(shè)備中被成功安裝后,就擁有了執(zhí)行的前提條件,從使用者操作移動(dòng)終端設(shè)備執(zhí)行某個(gè)程序開始,我們所用到的上述整個(gè)框架如圖2.1就開始發(fā)揮功效了:首先,當(dāng)移動(dòng)應(yīng)用啟動(dòng)時(shí),移動(dòng)系統(tǒng)就會(huì)自動(dòng)加載已經(jīng)分析好的離線文件存入內(nèi)存中,把它作為一個(gè)輸入用于動(dòng)態(tài)分析;而后,當(dāng)應(yīng)用程序開始運(yùn)行時(shí),首先判斷該程序是否屬于首次運(yùn)行,如果屬于就開始執(zhí)行訓(xùn)練,若不是就開始執(zhí)行遷移操作,移動(dòng)到服務(wù)端即可;最后,如果是進(jìn)行訓(xùn)練執(zhí)行操作的話,就得依據(jù)由動(dòng)態(tài)分析所得出的閾值設(shè)置參數(shù)和程序運(yùn)行時(shí)間來設(shè)定遷移操作的標(biāo)志位,以供后續(xù)移動(dòng)應(yīng)用程序的多次使用。最終實(shí)現(xiàn)移動(dòng)使用者的應(yīng)用程序毫不保留的遷移到云端去進(jìn)行運(yùn)行,已加速運(yùn)行的效率。
離線的靜態(tài)分析主要的工作是對移動(dòng)程序的apk文件進(jìn)行的逆向編譯解析,首先,要獲取該移動(dòng)應(yīng)用的一個(gè)相關(guān)的關(guān)系調(diào)用圖,其次,依據(jù)該關(guān)系調(diào)用圖用以區(qū)別與硬件相關(guān)與否的應(yīng)用程序,并且把不相關(guān)的那部分程序所對應(yīng)的消息保存到partition文件中,從而可以依據(jù)該文件的相應(yīng)記錄,判定出哪部分應(yīng)用程序中的哪些函數(shù)在移動(dòng)終端運(yùn)行,哪些應(yīng)用函數(shù)有可能轉(zhuǎn)移到服務(wù)器端運(yùn)行。
基于上述的理論介紹,我們可以清晰的發(fā)現(xiàn)有兩個(gè)方面是必須的也是最為關(guān)鍵的,一個(gè)方面是虛擬指令集,另一個(gè)方面是虛擬機(jī),對于虛擬指令集,我們可以暫時(shí)將一些帶有opcode的指令集進(jìn)行變形,生成相關(guān)數(shù)據(jù)直接回填到原文件中,已達(dá)到靜態(tài)分析的目的。
根據(jù)指令集的相關(guān)資料介紹,我們可以知道每一條指令主要由兩部分組成并決定的:一是指令的格式標(biāo)識(shí),二是位描述;以指令B|A|op|CCCC G|F|E|D為例,其中各項(xiàng)所代表的意思如下:字母B代表參數(shù)的個(gè)數(shù),字母C代表偏移位值,也就是方法的索引值,而字母A、D、E、F、G等則代表寄存器的一些參數(shù),op為操作碼,代表運(yùn)行的是哪一種操作。當(dāng)使用者的移動(dòng)應(yīng)用運(yùn)行后,程序會(huì)根據(jù)指令所代表的具體數(shù)據(jù)經(jīng)過跳轉(zhuǎn)表的方式去進(jìn)行解析操作。
為了使移動(dòng)設(shè)備中的應(yīng)用程序毫無錯(cuò)誤的移植到云端,即當(dāng)應(yīng)用函數(shù)運(yùn)行時(shí),函數(shù)能自主初始化一些相關(guān)有用的數(shù)據(jù)結(jié)構(gòu),已獲取其運(yùn)行環(huán)境等因素,就需要增添一些對應(yīng)的指令碼來實(shí)現(xiàn),用以滿足我們依據(jù)遷移情況操作的每一個(gè)移動(dòng)應(yīng)用程序,通過添加一條新的dalvik指令碼,通過遷移函數(shù)來運(yùn)行我們所期望的操作,進(jìn)而順利的完成相應(yīng)的準(zhǔn)備工作[2]。具體的實(shí)現(xiàn)步驟如下:
1)在文件/dalvik/opcode-gen/bytecode.txt目錄下,改寫指令碼中沒有用到的操作碼43,把它作為虛擬化加固指令的操作碼。圖3-1顯示其含義。
圖3-1 Dalvik虛擬機(jī)操作碼定義
2)在文件/dalvik/opcode-gen目錄下,運(yùn)行regen-all腳本文件,則會(huì)更新/dalvik/dx/src/com/Android/dx/dex/code目錄下的Dops.java、RopToDop.java文件,/dalvik/dx/src/com/Android/dx/io目錄下OpcodeInfo.java、Opcodes.java文件,/dalvik/libdex目錄下的DexOpcodes.cpp、DexOpcodes.h、InstrUtils.cpp文件,/libcore/dalvik/src/main/java/dalvik/bytecode目錄下的OpcodeInfo.java,Opcodes.java文件,在上述這些目錄文件中,會(huì)自動(dòng)生成很多與新添加指令相關(guān)的定義、說明和表等。
3)在文件/dalvik/vm/mterp/c目錄下,改寫OP_UNUSED_43.cpp為OP_VIR.cpp,即為虛擬化加固指令的具體實(shí)現(xiàn)方法,該指令的運(yùn)行流程大致為:首先是各種變量的初始化、遷移進(jìn)程的新建等操作;而后在hash table中,運(yùn)用相應(yīng)的結(jié)構(gòu)體,從函數(shù)中得到相應(yīng)的指令字節(jié)碼;之后,掛載起客戶的進(jìn)程,調(diào)用相關(guān)的應(yīng)用函數(shù)獲取其上下文的有關(guān)數(shù)據(jù),在經(jīng)過線程遷移發(fā)送出去;緊接著遷移線程通過服務(wù)器端回執(zhí)過來的結(jié)果在移動(dòng)端復(fù)原,接著做其他的一些事情,若失敗,則繼續(xù)在移動(dòng)終端執(zhí)行。
OP_VIR.cpp內(nèi)容的大致實(shí)現(xiàn)方法如下:
重新構(gòu)造解釋器的函數(shù)代碼,以解析新增的指令。詳細(xì)的操作步驟在文件/dalvik/vm/mterp目錄下,改寫config-portable文件中的op-end和op-start中的部分片段,添加相應(yīng)的虛擬化加固指令OP-VIR文件的引用就可以。
本文通過對虛擬化技術(shù)在移動(dòng)應(yīng)用虛擬化加固方面的研究,提出了在移動(dòng)應(yīng)用平臺(tái)上經(jīng)過增添新的指令來實(shí)現(xiàn)虛擬化的方法,該方法可以很好的起到程序加固的作用,有效的防止了內(nèi)存中程序代碼外露的可能性,并且對后續(xù)的靜動(dòng)態(tài)的解析也有著比較好的抵御效果。
[1]劉仙艷.移動(dòng)終端開放平臺(tái)--Android[J].信息通信技術(shù),2011,4:40-50.