• 
    

    
    

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

      ?

      系統(tǒng)虛擬化環(huán)境下客戶(hù)機(jī)系統(tǒng)調(diào)用信息捕獲與分析①

      2019-03-11 06:02:14崔超遠(yuǎn)李勇鋼
      關(guān)鍵詞:客戶(hù)機(jī)調(diào)用進(jìn)程

      寧 強(qiáng),崔超遠(yuǎn),李勇鋼

      1(中國(guó)科學(xué)院 合肥物質(zhì)科學(xué)研究院 智能機(jī)械研究所,合肥 230031)

      2(中國(guó)科學(xué)技術(shù)大學(xué),合肥 230026)

      系統(tǒng)調(diào)用被廣泛應(yīng)用于進(jìn)程行為分析和惡意軟件入侵檢測(cè)[1]等方面.系統(tǒng)調(diào)用信息的捕獲和分析是開(kāi)展這些工作的關(guān)鍵.Ether[2]是一個(gè)基于硬件虛擬化的客戶(hù)機(jī)自省工具,其用來(lái)進(jìn)行惡意軟件分析.Ether利用x86快速系統(tǒng)調(diào)用條目機(jī)制的特性,在系統(tǒng)調(diào)用執(zhí)行期間,其系統(tǒng)調(diào)用攔截機(jī)制使用x86處理器上的特殊寄存器,在一個(gè)已有地址上產(chǎn)生頁(yè)錯(cuò)誤.Ether通過(guò)接收該地址上產(chǎn)生頁(yè)錯(cuò)誤的信號(hào)判斷一個(gè)系統(tǒng)調(diào)用的產(chǎn)生.Nitro[3]同樣也是一個(gè)使用硬件虛擬化擴(kuò)展的用于客戶(hù)機(jī)自省的開(kāi)源項(xiàng)目,它在 KVM[4](Kernel Virtual Machine,內(nèi)核虛擬機(jī))平臺(tái)上實(shí)現(xiàn).KVM由兩個(gè)部分組成,一個(gè)是基于QEMU[5]的用戶(hù)空間應(yīng)用程序,一個(gè)是提供實(shí)際虛擬化功能的Linux內(nèi)核模塊.Nitro將這兩部分進(jìn)行了擴(kuò)展,實(shí)現(xiàn)了系統(tǒng)調(diào)用的跟蹤和監(jiān)控.目前捕獲系統(tǒng)調(diào)用的同類(lèi)方法由于不能預(yù)知每個(gè)客戶(hù)機(jī)操作系統(tǒng)的類(lèi)型及其運(yùn)行的應(yīng)用,無(wú)法制定統(tǒng)一的系統(tǒng)調(diào)用信息捕獲和解析規(guī)則,故僅能獲取系統(tǒng)調(diào)用原始信息,無(wú)法解析參數(shù)和返回值等重要信息.此外,現(xiàn)有方法沒(méi)有考慮到捕獲系統(tǒng)調(diào)用的性能開(kāi)銷(xiāo)問(wèn)題,沒(méi)有對(duì)系統(tǒng)調(diào)用以進(jìn)程為劃分界限進(jìn)行分類(lèi).由于不同系統(tǒng)調(diào)用的參數(shù)類(lèi)型不同,參數(shù)解析面臨很大的困難.針對(duì)以上問(wèn)題,本文在KVM虛擬化平臺(tái)上建立了一個(gè)實(shí)時(shí)捕獲和分析客戶(hù)機(jī)內(nèi)系統(tǒng)調(diào)用的系統(tǒng).該系統(tǒng)根據(jù)不同系統(tǒng)調(diào)用建立相應(yīng)的分析規(guī)則,實(shí)現(xiàn)了對(duì)系統(tǒng)調(diào)用序列的捕獲以及對(duì)參數(shù)和返回值的解析.通過(guò)exit()系統(tǒng)調(diào)用判斷出進(jìn)程的終止操作,并將進(jìn)程從監(jiān)視目標(biāo)中移除,從而區(qū)分系統(tǒng)調(diào)用序列所屬的不同進(jìn)程.

      1 系統(tǒng)設(shè)計(jì)

      1.1 設(shè)計(jì)目標(biāo)

      系統(tǒng)調(diào)用監(jiān)視系統(tǒng)旨在利用虛擬化技術(shù)[6]在客戶(hù)機(jī)外部實(shí)現(xiàn)對(duì)其內(nèi)部系統(tǒng)調(diào)用序列進(jìn)行實(shí)時(shí)捕獲,并對(duì)參數(shù)和返回值進(jìn)行解析.同時(shí),不對(duì)宿主機(jī)和客戶(hù)機(jī)帶來(lái)太大的性能開(kāi)銷(xiāo).因此設(shè)計(jì)目標(biāo)包括以下三個(gè)方面:

      (1)實(shí)現(xiàn)對(duì)系統(tǒng)調(diào)用參數(shù)和返回值的快速捕獲.基于此點(diǎn)要求,需要在處理系統(tǒng)調(diào)用引發(fā)異常時(shí),對(duì)系統(tǒng)調(diào)用進(jìn)入和退出指令進(jìn)行模擬;然后在模擬過(guò)程中獲取客戶(hù)機(jī)VCPU信息,從中提取參數(shù)和返回值的原始信息(即二進(jìn)制信息);

      (2)將低層次的系統(tǒng)調(diào)用信息還原成高層次語(yǔ)義[7].即在捕獲到系統(tǒng)調(diào)用的二進(jìn)制信息后,使用內(nèi)核自省工具libvmi[8]將其解析為高層次語(yǔ)義信息;

      (3)引入較小的性能開(kāi)銷(xiāo).在確??焖俨东@系統(tǒng)調(diào)用參數(shù)和返回值的前提下,使用線程池技術(shù)快速獲取并解析多個(gè)VCPU的二進(jìn)制信息,盡量減小對(duì)宿主機(jī)和客戶(hù)機(jī)帶來(lái)的性能開(kāi)銷(xiāo).

      1.2 系統(tǒng)總體架構(gòu)

      系統(tǒng)總體架構(gòu)如圖1所示,主要由KVM內(nèi)核功能擴(kuò)展模塊、監(jiān)聽(tīng)模塊、信息處理模塊和參數(shù)解析模塊四部分組成.系統(tǒng)運(yùn)行過(guò)程中,監(jiān)聽(tīng)模塊將修改硬件規(guī)范使系統(tǒng)調(diào)用陷入的指令發(fā)送給KVM內(nèi)核功能擴(kuò)展模塊,然后KVM內(nèi)核功能擴(kuò)展模塊將捕獲到的系統(tǒng)調(diào)用低層次語(yǔ)義信息發(fā)送給監(jiān)聽(tīng)模塊.信息處理模塊將低層次語(yǔ)義信息轉(zhuǎn)化為系統(tǒng)調(diào)用名和系統(tǒng)調(diào)用號(hào)這些高層次語(yǔ)義信息.參數(shù)解析模塊完成系統(tǒng)調(diào)用參數(shù)的解析.

      圖1 系統(tǒng)架構(gòu)

      實(shí)現(xiàn)該系統(tǒng)需要解決模擬指令的重寫(xiě)、語(yǔ)義的轉(zhuǎn)換和進(jìn)程的區(qū)分三個(gè)關(guān)鍵問(wèn)題.在由快速系統(tǒng)調(diào)用指令引起的異常發(fā)生時(shí),VMM[9](Virtual Machine Monitor,虛擬機(jī)監(jiān)控器)捕獲該異常進(jìn)行處理后對(duì)指令進(jìn)行模擬.模擬指令需要解決的首要問(wèn)題就是對(duì)指令進(jìn)行重寫(xiě),重寫(xiě)后的指令一方面要維持原有指令的功能,另一方面要滿(mǎn)足捕獲系統(tǒng)調(diào)用的需求,即得到VCPU寄存器信息.解決模擬指令重寫(xiě)的方法是在KVM模擬指令的函數(shù)(如em_syscall())中加入kvm_arch_vcpu_ioctl_get_regs()函數(shù)和kvm_arch_vcpu_ioctl_get_sregs()函數(shù)來(lái)獲取通用寄存器信息和特殊寄存器信息,這些信息對(duì)應(yīng)了系統(tǒng)調(diào)用的參數(shù)和返回值.語(yǔ)義的轉(zhuǎn)換包含兩方面,一個(gè)是解析系統(tǒng)調(diào)用名,方法是獲取其在內(nèi)核符號(hào)表中的虛擬地址,然后使用libvmi的translate_v2ksym()進(jìn)行解析,另一個(gè)是解析系統(tǒng)調(diào)用參數(shù),針對(duì)字符串類(lèi)型的參數(shù),需使用libvmi的read_str_va()進(jìn)行解析.捕獲系統(tǒng)調(diào)用時(shí)需要區(qū)分已終止的進(jìn)程和正在運(yùn)行的進(jìn)程,其目的在于防止重復(fù)捕獲同名同號(hào)新舊進(jìn)程的系統(tǒng)調(diào)用造成新進(jìn)程系統(tǒng)調(diào)用序列不再準(zhǔn)確,提高捕獲效率,解決進(jìn)程區(qū)分問(wèn)題的方法是識(shí)別進(jìn)程是否調(diào)用了exit()或exit_group()函數(shù).

      2 系統(tǒng)實(shí)現(xiàn)

      2.1 系統(tǒng)調(diào)用的捕獲

      當(dāng)前基于x86架構(gòu)的操作系統(tǒng)大多使用基于syscall指令和基于sysenter指令的快速系統(tǒng)調(diào)用.針對(duì)這兩種類(lèi)型的系統(tǒng)調(diào)用需要采用不同的捕獲方法.

      客戶(hù)機(jī)正常執(zhí)行時(shí)syscall指令不會(huì)陷入到VMM中,因此無(wú)法實(shí)現(xiàn)對(duì)基于syscall指令系統(tǒng)調(diào)用的捕獲.根據(jù)Intel軟件開(kāi)發(fā)手冊(cè)上的硬件規(guī)范可知,在將EFER寄存器的SCE標(biāo)志位置0時(shí)執(zhí)行syscall指令,系統(tǒng)會(huì)發(fā)生UD未定義的無(wú)效操作碼異常陷入,這樣就成功實(shí)現(xiàn)了對(duì)基于syscall指令系統(tǒng)調(diào)用的捕獲.

      基于sysenter指令的系統(tǒng)調(diào)用同樣依賴(lài)于一組MSR特殊寄存器,分別是SYSENTER_CS_MSR,SYSENTER_ESP_MSR 和 SYSENTER_EIP_MSR.為了使客戶(hù)機(jī)系統(tǒng)在執(zhí)行sysenter指令時(shí)能陷入到VMM中,需要修改相關(guān)的硬件規(guī)范.基于sysenter指令的系統(tǒng)調(diào)用入口地址保存在上述MSR寄存器中,因此可以先將MSR寄存器原始值先保存起來(lái),然后裝入一組NULL非法值,系統(tǒng)在執(zhí)行sysenter指令時(shí)由于找不到系統(tǒng)調(diào)用入口地址會(huì)產(chǎn)生GP通用保護(hù)錯(cuò)異常陷入,這樣就成功實(shí)現(xiàn)了對(duì)基于sysenter指令系統(tǒng)調(diào)用的捕獲.

      在客戶(hù)機(jī)運(yùn)行時(shí),用戶(hù)模式下的監(jiān)聽(tīng)模塊首先將設(shè)置系統(tǒng)調(diào)用捕獲的指令通過(guò)/dev/kvm設(shè)備文件的iotcl調(diào)用發(fā)送給KVM內(nèi)核模塊,當(dāng)客戶(hù)機(jī)內(nèi)的程序執(zhí)行系統(tǒng)調(diào)用時(shí)發(fā)生異常陷入到VMM,KVM內(nèi)核模塊捕獲到系統(tǒng)調(diào)用并將信息返回給監(jiān)聽(tīng)模塊,監(jiān)聽(tīng)模塊收到事件信息后停止監(jiān)聽(tīng)并關(guān)閉/dev/kvm設(shè)備文件的ioctl調(diào)用.

      2.2 模擬指令的重寫(xiě)

      對(duì)于VM中發(fā)生的異常,必須要識(shí)別出該異常是由于客戶(hù)機(jī)正常執(zhí)行過(guò)程中引起的還是由于改變了系統(tǒng)調(diào)用指令正常執(zhí)行條件引起的.為此本文在內(nèi)核處理異常的代碼中加入了對(duì)客戶(hù)機(jī)異常的判斷,其原理是判斷發(fā)生異常時(shí)VCPU的狀態(tài),即:使用is_invalid_opcode()識(shí)別無(wú)效操作碼異常,若異常在客戶(hù)模式下產(chǎn)生,則是正常情況下產(chǎn)生的異常,就使用kvm_queue_exception()將異常注入到 Guest OS 中處理;否則,使用emulate_instruction()對(duì)引起異常的系統(tǒng)調(diào)用指令進(jìn)行模擬,最后返回 Guest OS.使用 is_general_protection()識(shí)別通用保護(hù)異常,若異常發(fā)生時(shí)VCPU處于sysenter_sysexit狀態(tài),則模擬系統(tǒng)調(diào)用指令,最后返回Guest OS;否則是正常情況下產(chǎn)生的異常,將異常注入到Guest OS 中處理.

      異常識(shí)別和處理的方法如算法1所示.第1-6行用于識(shí)別和處理無(wú)效操作碼異常.第7-12行用于識(shí)別和處理通用保護(hù)異常.

      算法1.異常識(shí)別和處理算法輸入:異常信息intr_info,客戶(hù)機(jī)虛擬CPU信息vcpu輸出:順利處理完異常,返回 11. IF(is_invalid_opcode(intr_info))2. IF(is_guest_mode(vcpu))3. kvm_queue_exception(vcpu);4. RETURN 1;5. ELSE emulate_instruction(vcpu);6. RETURN 1;7. ELSE IF(is_general_protection(intr_info))8. IF(is_sysenter_sysexit(vcpu))9. emulate_instruction(vcpu);10. RETURN 1;11. ELSE kvm_queue_exception(vcpu);12. RETURN 1;

      模擬指令是處理異常中的關(guān)鍵環(huán)節(jié),對(duì)該指令的重寫(xiě)是獲取系統(tǒng)調(diào)用信息的關(guān)鍵因素.客戶(hù)機(jī)在執(zhí)行完若干條傳遞系統(tǒng)調(diào)用參數(shù)的傳送指令后執(zhí)行sysenter快速系統(tǒng)調(diào)用指令從用戶(hù)態(tài)快速進(jìn)入內(nèi)核態(tài),進(jìn)入內(nèi)核態(tài)后執(zhí)行wrmsr特權(quán)指令實(shí)現(xiàn)MSRs寄存器的初始化工作.由于修改了硬件規(guī)范,因此在執(zhí)行wrmsr特權(quán)指令時(shí)客戶(hù)機(jī)會(huì)產(chǎn)生異常陷入到VMM中,為了恢復(fù)客戶(hù)機(jī)系統(tǒng)調(diào)用的正常執(zhí)行,VMM需要對(duì)系統(tǒng)調(diào)用指令進(jìn)行模擬.對(duì)模擬指令進(jìn)行重寫(xiě)有兩個(gè)目的,一個(gè)是重寫(xiě)模擬sysenter進(jìn)入指令獲取系統(tǒng)調(diào)用的參數(shù),另一個(gè)是重寫(xiě)模擬sysexit退出指令獲取系統(tǒng)調(diào)用的返回值,重寫(xiě)的方法是在內(nèi)核代碼arch/x86/kvm/emulate.c下的em_sysenter()和em_sysexit()函數(shù)中添加kvm_arch_vcpu_ioctl_get_regs()函數(shù)和kvm_arch_vcpu_ioctl_get_sregs()函數(shù).

      2.3 語(yǔ)義的轉(zhuǎn)換

      語(yǔ)義的轉(zhuǎn)換是將內(nèi)核擴(kuò)展模塊捕獲到的系統(tǒng)調(diào)用低層次語(yǔ)義信息轉(zhuǎn)換為高層次語(yǔ)義信息,信息處理模塊完成對(duì)系統(tǒng)調(diào)用名和系統(tǒng)調(diào)用號(hào)的解析,參數(shù)解析模塊完成對(duì)系統(tǒng)調(diào)用參數(shù)的解析.實(shí)現(xiàn)語(yǔ)義的轉(zhuǎn)換必須要不斷向KVM內(nèi)核模塊發(fā)送獲取VCPU事件信息的請(qǐng)求,在客戶(hù)機(jī)中有多個(gè)VCPU的情況下,如果只創(chuàng)建一個(gè)線程來(lái)監(jiān)聽(tīng)多個(gè)VCPU的事件信息,那么每捕獲到一個(gè)VCPU上的系統(tǒng)調(diào)用就需要暫停一次客戶(hù)機(jī),客戶(hù)機(jī)暫停時(shí)間相應(yīng)地增長(zhǎng)了;如果針對(duì)每個(gè)VCPU創(chuàng)建一個(gè)監(jiān)聽(tīng)線程,那么客戶(hù)機(jī)暫停時(shí)間將縮短為多個(gè)監(jiān)聽(tīng)線程中耗時(shí)最長(zhǎng)的一個(gè),相比于單監(jiān)聽(tīng)線程客戶(hù)機(jī)性能得到了提升.本文在監(jiān)聽(tīng)模塊中使用了線程池技術(shù),其原理是引入concurrent.futures模塊,該模塊可實(shí)現(xiàn)并行計(jì)算,即使用ThreadPoolExecutor類(lèi)把監(jiān)聽(tīng)多個(gè)VCPU事件信息的工作分配給多個(gè)Python線程處理,進(jìn)而實(shí)現(xiàn)系統(tǒng)調(diào)用二進(jìn)制信息的快速獲取和解析,降低了客戶(hù)機(jī)暫停時(shí)間,提升了客戶(hù)機(jī)的性能.

      2.3.1 系統(tǒng)調(diào)用名和系統(tǒng)調(diào)用號(hào)解析

      在內(nèi)核中維護(hù)著一張符號(hào)表System.map被稱(chēng)作內(nèi)核符號(hào)表,該表記錄了內(nèi)核中所有符號(hào)(函數(shù),全局變量等)的地址及名稱(chēng),這其中就包括系統(tǒng)調(diào)用表和系統(tǒng)調(diào)用名的地址和名稱(chēng).系統(tǒng)調(diào)用表sys_call_table中各表項(xiàng)是指向?qū)崿F(xiàn)各種系統(tǒng)調(diào)用的內(nèi)核函數(shù)的函數(shù)指針,系統(tǒng)調(diào)用執(zhí)行時(shí),系統(tǒng)調(diào)用處理程序會(huì)讀取rax寄存器來(lái)獲取系統(tǒng)調(diào)用號(hào),將其乘以4(32位下為4,64位下為8)生成偏移地址,然后以sys_call_table為基址,基址加上偏移地址可得系統(tǒng)調(diào)用表項(xiàng)地址,使用libvmi對(duì)表項(xiàng)地址進(jìn)行解析可得系統(tǒng)調(diào)用服務(wù)例程地址,最后使用libvmi解析服務(wù)例程地址可得系統(tǒng)調(diào)用名.

      解析系統(tǒng)調(diào)用名的方法如算法2所示.第1行定義了64位下系統(tǒng)調(diào)用表項(xiàng)大小.第2行根據(jù)系統(tǒng)調(diào)用號(hào)rax計(jì)算系統(tǒng)調(diào)用表項(xiàng)的地址.第3行使用libvmi的read_addr_va()解析表項(xiàng)地址得到系統(tǒng)調(diào)用服務(wù)例程地址.第4行使用libvmi的translate_v2ksm()解析系統(tǒng)調(diào)用服務(wù)例程地址得到系統(tǒng)調(diào)用名.第5行返回系統(tǒng)調(diào)用名.

      算法2.系統(tǒng)調(diào)用名解析算法輸入:系統(tǒng)調(diào)用表地址sys_call_table_addr,系統(tǒng)調(diào)用號(hào)rax輸出:系統(tǒng)調(diào)用名sys_call_name 1.#define VOID_P_SIEZ 8 2.p_addr = sys_call_table+rax*VOID_P_SIZE 3.addr = libvmi.read_addr_va(paddr)4.sys_call_name = libvmi.translate_v2ksym(addr)5.RETURN sys_call_name

      2.3.2 系統(tǒng)調(diào)用參數(shù)解析

      基于syscall指令的系統(tǒng)調(diào)用其參數(shù)存放在rdi、rsi、rdx、r10、r8 和 r9 寄存器中,而基于 sysenter指令的系統(tǒng)調(diào)用其參數(shù)存放在rbx、rcx、rdx、rsi、rdi、rbp中.不同的系統(tǒng)調(diào)用參數(shù)個(gè)數(shù)和類(lèi)型也不同,為了解決系統(tǒng)調(diào)用參數(shù)解析困難的問(wèn)題,設(shè)計(jì)了參數(shù)解析模塊.該模塊根據(jù)不同類(lèi)型的系統(tǒng)調(diào)用設(shè)置了相應(yīng)的系統(tǒng)調(diào)用參數(shù)處理規(guī)則.例如,針對(duì)文件進(jìn)行操作的open和access系統(tǒng)調(diào)用,其第一個(gè)參數(shù)是所要操作文件的文件名,對(duì)該參數(shù)的處理規(guī)則就是將存放參數(shù)的寄存器中的地址信息轉(zhuǎn)換為文件名對(duì)應(yīng)的字符串,轉(zhuǎn)換方法為使用libvmi的read_str_va()函數(shù).

      2.4 進(jìn)程區(qū)分

      現(xiàn)有的系統(tǒng)調(diào)用捕獲方法在運(yùn)行系統(tǒng)調(diào)用監(jiān)控程序時(shí),沒(méi)有考慮到進(jìn)程終結(jié)的問(wèn)題,即不能判斷已經(jīng)退出的進(jìn)程,并將屬于該進(jìn)程的系統(tǒng)調(diào)用序列從整個(gè)系統(tǒng)調(diào)用的序列中剔除.這樣就會(huì)存在兩個(gè)弊端:第一,存在與已退出舊進(jìn)程同名同號(hào)的新進(jìn)程,由于監(jiān)控程序無(wú)法判斷舊進(jìn)程的退出,故會(huì)重新掃描舊進(jìn)程的系統(tǒng)調(diào)用序列并加入新進(jìn)程的系統(tǒng)調(diào)用序列,造成新進(jìn)程系統(tǒng)調(diào)用序列不再準(zhǔn)確.第二,對(duì)于監(jiān)控程序捕獲到的多個(gè)進(jìn)程的系統(tǒng)調(diào)用序列,在上述情況下,每個(gè)進(jìn)程的系統(tǒng)調(diào)用序列都不再準(zhǔn)確,監(jiān)控程序所捕獲到的以一個(gè)進(jìn)程系統(tǒng)調(diào)用序列為單位的總系統(tǒng)調(diào)用序列相應(yīng)地也不再準(zhǔn)確.以上存在的弊端會(huì)嚴(yán)重降低系統(tǒng)調(diào)用序列捕獲的準(zhǔn)確率,對(duì)宿主機(jī)的性能也會(huì)產(chǎn)生影響.

      針對(duì)以上問(wèn)題,我們需要在捕獲系統(tǒng)調(diào)用時(shí)及時(shí)判斷進(jìn)程是否退出,如果進(jìn)程退出,就將屬于該進(jìn)程的系統(tǒng)調(diào)用序列從總的系統(tǒng)調(diào)用序列中移除.在操作系統(tǒng)中,進(jìn)程退出一般會(huì)顯式或隱式地調(diào)用exit()或exit_group()函數(shù),兩者的區(qū)別在于前者只退出該進(jìn)程,而后者是退出屬于該進(jìn)程組的所有進(jìn)程,兩者最后都會(huì)調(diào)用內(nèi)核中的do_exit()函數(shù)(位于kernel/exit.c函數(shù)中).在捕獲系統(tǒng)調(diào)用時(shí),判斷進(jìn)程是否會(huì)調(diào)用此函數(shù),如果調(diào)用了,說(shuō)明進(jìn)程已經(jīng)退出,將其從總的系統(tǒng)調(diào)用序列中移除并寫(xiě)到文件中.

      3 實(shí)驗(yàn)與分析

      3.1 實(shí)驗(yàn)環(huán)境

      本實(shí)驗(yàn)是在Linux操作系統(tǒng)下進(jìn)行的,以KVM作為虛擬化平臺(tái),設(shè)計(jì)并實(shí)現(xiàn)了系統(tǒng)調(diào)用監(jiān)控系統(tǒng),Qemu版本為2.8;宿主機(jī)操作系統(tǒng)版本為ubuntu-16.04-desktop-amd64,內(nèi)核版本為 4.9,CPU采用24核Intel(R)Xeon(R)CPU E5-2620 v2 @ 2.10 GHz;客戶(hù)機(jī)操作系統(tǒng)版本為ubuntu-12.04-server-amd64,內(nèi)核版本為 3.2.0-23-generic,VCPU 為單核,內(nèi)存為 1 GB.

      3.2 實(shí)驗(yàn)結(jié)果與分析

      3.2.1 系統(tǒng)調(diào)用捕獲分析

      從宿主機(jī)中捕獲的客戶(hù)機(jī)系統(tǒng)調(diào)用序列如圖2所示(左側(cè)是客戶(hù)機(jī)外部視圖,右側(cè)是客戶(hù)機(jī)內(nèi)部視圖),通過(guò)交叉視圖對(duì)比發(fā)現(xiàn),客戶(hù)機(jī)內(nèi)外系統(tǒng)調(diào)用序列完全一致,說(shuō)明在客戶(hù)機(jī)外部可以捕獲到客戶(hù)機(jī)內(nèi)完整的系統(tǒng)調(diào)用序列.

      圖2 系統(tǒng)調(diào)用序列的捕獲

      由于解析的系統(tǒng)調(diào)用序列較長(zhǎng),所以此處僅選擇部分解析的系統(tǒng)調(diào)用序列進(jìn)行分析,客戶(hù)機(jī)內(nèi)外系統(tǒng)調(diào)用參數(shù)和返回值對(duì)比如圖3所示.

      圖3 系統(tǒng)調(diào)用參數(shù)和返回值

      Open系統(tǒng)調(diào)用第一個(gè)參數(shù)為打開(kāi)文件的路徑名.由內(nèi)外視圖對(duì)比可以發(fā)現(xiàn),open分別打開(kāi)了/etc/ld.so.cache 和/lib/x86_64-linux-gnu/libc.so.6 文件,這兩個(gè)文件分別表示Linux動(dòng)態(tài)共享庫(kù)緩存文件和Glibc動(dòng)態(tài)庫(kù)文件.O_RDONLY表示以只讀方式打開(kāi)文件,O_CLOEXEC表示在進(jìn)程執(zhí)行exec系統(tǒng)調(diào)用時(shí)關(guān)閉此打開(kāi)的文件描述符,兩者進(jìn)行或操作后值為0x80000.客戶(hù)機(jī)內(nèi)外部得到的返回值都為3.對(duì)比發(fā)現(xiàn),客戶(hù)機(jī)外部捕獲到的open系統(tǒng)調(diào)用參數(shù)和返回值是正確的.

      Access系統(tǒng)調(diào)用是檢查調(diào)用進(jìn)程是否可以對(duì)指定的文件執(zhí)行某種操作.由圖可見(jiàn),客戶(hù)機(jī)進(jìn)程調(diào)用了access來(lái)確定/etc/ld.so.nohwcap文件是否存在,F_OK在頭文件unistd.h中的預(yù)定義為0.對(duì)比發(fā)現(xiàn),客戶(hù)機(jī)外部捕獲到的access系統(tǒng)調(diào)用參數(shù)和返回值是正確的.

      Mmap系統(tǒng)調(diào)用是將一個(gè)文件或者其它對(duì)象映射進(jìn)內(nèi)存.其第3個(gè)參數(shù)PROT_READ和第4個(gè)參數(shù)MAP_PRIVATE在sys/types.h中分別定義為1和2,其余參數(shù)也一致.但是得到的返回值有差異,這是由于strace改變了原來(lái)系統(tǒng)調(diào)用的走向,使得返回值發(fā)生了改變.為了驗(yàn)證客戶(hù)機(jī)外部得到的mmap返回值是否正確,本文選擇在測(cè)試程序運(yùn)行過(guò)程中輸出mmap的返回值,如圖4所示.對(duì)比發(fā)現(xiàn),客戶(hù)機(jī)外部捕獲到的mmap、open和write系統(tǒng)調(diào)用參數(shù)和返回值是正確的.

      由于本系統(tǒng)對(duì)模擬系統(tǒng)調(diào)用進(jìn)入的指令進(jìn)行重寫(xiě),捕獲到了參數(shù),并對(duì)參數(shù)進(jìn)行解析將低層次語(yǔ)義信息轉(zhuǎn)換為高層次語(yǔ)義信息.對(duì)模擬系統(tǒng)調(diào)用退出的指令進(jìn)行重寫(xiě),捕獲到了返回值.以上實(shí)驗(yàn)數(shù)據(jù)充分說(shuō)明本系統(tǒng)在捕獲系統(tǒng)調(diào)用方面具有高效性和準(zhǔn)確性的特點(diǎn).

      圖4 mmap、open 和 write 參數(shù)返回值

      3.2.2 性能分析

      本文實(shí)驗(yàn)使用了Nbench工具分別對(duì)宿主機(jī)和客戶(hù)機(jī)的性能進(jìn)行了分析.Nbench是一個(gè)簡(jiǎn)單的用于測(cè)試處理器和存儲(chǔ)器性能的基準(zhǔn)測(cè)試工具,它的測(cè)試結(jié)果主要分為MEM、INT和FP,MEM指數(shù)主要體現(xiàn)處理器總線、CACHE和存儲(chǔ)器性能,INT指整數(shù)處理性能,FP指雙精度浮點(diǎn)性能.測(cè)試所得數(shù)據(jù)能夠反映宿主機(jī)和客戶(hù)機(jī)在不同狀態(tài)下的性能,即原始狀態(tài)的性能①、運(yùn)行監(jiān)控程序獲取系統(tǒng)調(diào)用原始信息的性能②和對(duì)信息進(jìn)行處理時(shí)的性能③,宿主機(jī)性能比較如圖5所示,客戶(hù)機(jī)性能比較如圖6所示.

      圖5 宿主機(jī)性能比較

      根據(jù)圖5,可以發(fā)現(xiàn)運(yùn)行系統(tǒng)調(diào)用監(jiān)控程序?qū)λ拗鳈C(jī)并沒(méi)有什么影響,主要是由于宿主機(jī)只負(fù)責(zé)和客戶(hù)機(jī)進(jìn)行交互操作以及系統(tǒng)調(diào)用信息的處理等操作,而這些操作主要涉及處理器的計(jì)算和內(nèi)存的讀寫(xiě),所以性能下降不是很明顯.

      圖6 客戶(hù)機(jī)性能比較

      根據(jù)圖6,可以發(fā)現(xiàn)監(jiān)控程序在只捕獲客戶(hù)機(jī)系統(tǒng)調(diào)用原始信息的情況下,即運(yùn)行Nitro的情況下,客戶(hù)機(jī)的性能下降較小.當(dāng)監(jiān)控程序需要對(duì)系統(tǒng)調(diào)用信息進(jìn)行處理,也就是需要解析系統(tǒng)調(diào)用參數(shù)和返回值、進(jìn)程信息的時(shí)候,客戶(hù)機(jī)的性能下降較多,主要是由于客戶(hù)機(jī)在調(diào)用系統(tǒng)調(diào)用退出命令時(shí)陷入到VMM中,陷入期間宿主機(jī)獲取并解析系統(tǒng)調(diào)用參數(shù),客戶(hù)機(jī)調(diào)用系統(tǒng)調(diào)用退出命令時(shí)再次陷入VMM中,陷入期間宿主機(jī)獲取系統(tǒng)調(diào)用返回值,這兩步造成客戶(hù)機(jī)陷入時(shí)間過(guò)長(zhǎng).針對(duì)MEM、INT和FP測(cè)試結(jié)果,客戶(hù)機(jī)原始性能指數(shù)分別為22.7、29.1和45.7,開(kāi)啟信息處理之后客戶(hù)機(jī)的性能指數(shù)分別為2.8、2.5和2.7,性能開(kāi)銷(xiāo)比例分別為 8.1=22.7/2.8、11.64=29.1/2.5和16.9=45.7/2.7.

      綜上分析可知,性能開(kāi)銷(xiāo)在可接受的范圍內(nèi),并且在只獲取系統(tǒng)調(diào)用原始信息的情況下,性能開(kāi)銷(xiāo)比例只有1到1.5左右,性能要優(yōu)于熊海泉等人提出的非陷入系統(tǒng)調(diào)用指令捕獲方法[10],其方法首先在VMM中通過(guò)監(jiān)測(cè)CR3的更新來(lái)識(shí)別客戶(hù)機(jī)內(nèi)的當(dāng)前進(jìn)程,隨后通過(guò)修改硬件規(guī)范實(shí)現(xiàn)對(duì)基于sysenter和基于syscall指令系統(tǒng)調(diào)用的捕獲,最后基于netlink機(jī)制輸出系統(tǒng)調(diào)用信息.VMM在創(chuàng)建netlink連接向用戶(hù)空間發(fā)送系統(tǒng)調(diào)用信息時(shí)客戶(hù)機(jī)處于暫停狀態(tài),額外增加了客戶(hù)機(jī)的性能開(kāi)銷(xiāo),其方法對(duì)基于sysenter指令系統(tǒng)調(diào)用捕獲的開(kāi)銷(xiāo)比例為2.608=1238.8/475.0,對(duì)基于syscall指令系統(tǒng)調(diào)用捕獲的開(kāi)銷(xiāo)比例為2.195=1213.3/552.8.本監(jiān)控系統(tǒng)性能優(yōu)于其他方法的原因是在實(shí)現(xiàn)仿真指令的重寫(xiě)過(guò)程中即獲取到了系統(tǒng)調(diào)用信息并實(shí)時(shí)傳遞給用戶(hù)空間,同時(shí)考慮到客戶(hù)機(jī)存在多VCPU的情況,引入了線程池技術(shù)實(shí)現(xiàn)系統(tǒng)調(diào)用信息的快速捕獲和解析,大大提升了客戶(hù)機(jī)的性能.

      4 結(jié)束語(yǔ)

      為了解決捕獲客戶(hù)機(jī)系統(tǒng)調(diào)用時(shí)無(wú)法解析系統(tǒng)調(diào)用參數(shù)和返回值的問(wèn)題,本文在KVM虛擬化平臺(tái)上設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)系統(tǒng)調(diào)用監(jiān)控系統(tǒng).系統(tǒng)采用了模塊化的設(shè)計(jì),內(nèi)核功能擴(kuò)展模塊和用戶(hù)空間模塊相互配合.該系統(tǒng)不僅可以實(shí)時(shí)捕獲客戶(hù)機(jī)內(nèi)的系統(tǒng)調(diào)用序列,同時(shí)還可以解析系統(tǒng)調(diào)用的參數(shù)和返回值,將系統(tǒng)調(diào)用的原始信息轉(zhuǎn)換為高層次語(yǔ)義信息.

      目前該系統(tǒng)在解析系統(tǒng)調(diào)用原始信息時(shí)對(duì)客戶(hù)機(jī)帶來(lái)的性能開(kāi)銷(xiāo)較大,對(duì)用戶(hù)的使用有些影響.此外,系統(tǒng)未涉及針對(duì)基于系統(tǒng)調(diào)用的惡意軟件的分析,這些將是我們未來(lái)的研究工作.

      猜你喜歡
      客戶(hù)機(jī)調(diào)用進(jìn)程
      Reducing the global cancer burden with gastrointestinal screening: China’s 30 years practice
      核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
      債券市場(chǎng)對(duì)外開(kāi)放的進(jìn)程與展望
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
      社會(huì)進(jìn)程中的新聞學(xué)探尋
      我國(guó)高等教育改革進(jìn)程與反思
      Linux僵死進(jìn)程的產(chǎn)生與避免
      利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
      瘦客戶(hù)機(jī):安全與便捷的選擇
      鲁山县| 桐城市| 丰原市| 宜阳县| 巫山县| 榆中县| 开封县| 汤阴县| 扶风县| 安福县| 喀喇| 韶关市| 万安县| 乐陵市| 苏尼特右旗| 萨迦县| 齐齐哈尔市| 永寿县| 孙吴县| 丹棱县| 开化县| 张北县| 旬邑县| 遵义县| 卫辉市| 武强县| 资溪县| 利川市| 英山县| 凤庆县| 陕西省| 长垣县| 河源市| 合川市| 浦北县| 乌兰浩特市| 海晏县| 新化县| 车险| 雷波县| 太谷县|