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