基于進程模擬的二進制程序分析系統(tǒng)的制作方法
【專利摘要】一種電子數(shù)據(jù)監(jiān)控【技術(shù)領(lǐng)域】的基于進程模擬的二進制程序分析系統(tǒng),包括:模擬器引擎模塊、內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口、線程管理模塊、中央處理模塊和提供應(yīng)用程序接口的分析組件接口,其中:模擬器引擎模塊分別連接內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口和分析組件接口,進程管理模塊分別與內(nèi)存管理模塊、中央處理模塊和系統(tǒng)調(diào)用接口相連,線程管理模塊分別與內(nèi)存管理模塊、進程管理模塊和中央處理模塊相連;本發(fā)明不依賴于對程序的靜態(tài)逆向分析,而采用完全動態(tài)分析的方法,能夠避免大部分程序保護技術(shù)造成的影響。
【專利說明】基于進程模擬的二進制程序分析系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及的是一種電子數(shù)據(jù)監(jiān)控【技術(shù)領(lǐng)域】的系統(tǒng),具體是一種基于進程模擬的二進制程序分析系統(tǒng)。
【背景技術(shù)】
[0002]在計算機安全領(lǐng)域中,對各類軟件尤其是惡意程序的逆向分析是程序安全分析的基礎(chǔ)工作。由于缺少了相關(guān)的語義信息,針對二進制程序的逆向分析往往十分困難,需要消耗大量的人力物力。因此,為了輔助分析人員進行逆向分析,相應(yīng)的自動化程序分析方法和分析平臺也應(yīng)運而生。
[0003]為了實現(xiàn)自動化的程序分析,需要對程序運行時的指令流、控制流和數(shù)據(jù)流進行細粒度地監(jiān)視,同時需要獲取程序運行中的處理器、內(nèi)存等相關(guān)信息。目前對程序運行時信息的獲取主要采用進程調(diào)試、全系統(tǒng)模擬以及動態(tài)二進制插樁等技術(shù)來實現(xiàn)。但是,目前的分析技術(shù)均存在若干問題,其中進程調(diào)試采用操作系統(tǒng)的調(diào)試API實現(xiàn),對目前惡意程序常用的反調(diào)試手段往往無能為力;全系統(tǒng)模擬技術(shù)對整個計算機平臺進行模擬,與分析無關(guān)的大量指令如操作系統(tǒng)內(nèi)核占用了大部分的模擬時間,導(dǎo)致分析效率很低;而動態(tài)二進制插樁由于改變了程序的指令流和控制流,對于一些經(jīng)過保護的程序如被加殼或混淆后的程序往往無法進行分析。因此,目前的分析方案在面對當(dāng)前日益復(fù)雜的程序時常常無法滿足分析要求。
[0004]經(jīng)過對現(xiàn)有技術(shù)的檢索發(fā)現(xiàn),中國專利文獻號CN101814053,
【公開日】2010_08_25,記載了一種基于功能模型的二進制代碼漏洞發(fā)現(xiàn)方法,首先基于靜態(tài)逆向分析系統(tǒng)建立代碼功能模型,并基于所述代碼功能模型構(gòu)造初始測試用例集;其次,通過動態(tài)測試與回放分析系統(tǒng)依據(jù)覆蓋率控制和選路策略在動態(tài)測試平臺上加載測試用例集,并采用動態(tài)路徑約束優(yōu)化和約束求解、基于代的路徑遍歷算法進行測試用例集的調(diào)整,以及根據(jù)回放分析進行異常的精細分析及漏洞定位;第三,靜態(tài)逆向分析系統(tǒng)和動態(tài)測試與回放分析系統(tǒng)均將各自分析得到的程序?qū)傩源嫒牍δ苣P椭?,并以功能模型中的程序?qū)傩詠碇笇?dǎo)各自的分析測試工作。但該技術(shù)與本發(fā)明相比的缺陷及不足在于:第一,該技術(shù)依賴于靜態(tài)逆向分析,而目前軟件保護技術(shù)的廣泛使用使得分析人員往往無法進行有效的靜態(tài)分析,因此從目前的很多程序尤其是惡意程序中提取靜態(tài)分析結(jié)果是比較困難的;第二,該技術(shù)的分析方法僅能對程序的異常運行情況加以檢測并分析可能的漏洞,而無法檢測程序的潛在惡意攻擊行為,尤其是目前的各類攻擊方法如ROP (Return-Oriented Programming)層出不窮,該技術(shù)無法對程序中存在的能夠被這類攻擊所利用的漏洞進行檢測;第三,在目前各類動態(tài)代碼執(zhí)行被廣泛使用的情況下,如插件(Plugin)、用戶腳本(User Scripting)、即時編譯(Just-1n-time Compilation)等等,該技術(shù)無法對這類動態(tài)生成或加載的代碼進行有效分析,因此進一步限定了其分析范圍。
【發(fā)明內(nèi)容】
[0005]本發(fā)明針對現(xiàn)有技術(shù)存在的上述不足,提供一種基于進程模擬的二進制程序分析系統(tǒng),針對現(xiàn)有技術(shù)的不足之處,從程序的底層即系統(tǒng)硬件結(jié)構(gòu)和操作系統(tǒng)的級別對程序進行運行環(huán)境的模擬,不干涉程序的正常運行,而對程序的運行過程如數(shù)據(jù)流向等內(nèi)容進行監(jiān)控。本發(fā)明不依賴于對程序的靜態(tài)逆向分析,而采用完全動態(tài)分析的方法,能夠避免大部分程序保護技術(shù)造成的影響。通過對分析系統(tǒng)進行擴展并自定義攻擊行為,本發(fā)明能夠在攻擊代碼被執(zhí)行前進行檢測和攔截;并且通過引入動態(tài)污點分析等手段,能夠?qū)γ舾袛?shù)據(jù)流向進行分析和跟蹤,避免造成數(shù)據(jù)和隱私的泄露。并且,本發(fā)明不依賴于程序的靜態(tài)分析結(jié)果,能夠?qū)討B(tài)生成代碼進行完整分析。
[0006]本發(fā)明是通過以下技術(shù)方案實現(xiàn)的,本發(fā)明包括:模擬器引擎模塊、內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口、線程管理模塊、中央處理模塊和提供應(yīng)用程序接口的分析組件接口,其中:模擬器引擎模塊分別連接內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口和分析組件接口,分別傳輸運行狀態(tài)信息和運行指令、進程管理和線程調(diào)度信息、系統(tǒng)API調(diào)用數(shù)據(jù)、調(diào)試信息和分析組件事件等,控制、協(xié)調(diào)各個模塊并降低不同模塊之間的耦合度;進程管理模塊分別與中央處理模塊、內(nèi)存管理模塊和系統(tǒng)調(diào)用接口相連,分別傳輸處理器調(diào)度信息和運行狀態(tài)信息、內(nèi)存管理數(shù)據(jù)以及系統(tǒng)調(diào)用參數(shù)轉(zhuǎn)換及封裝等信息,線程管理模塊分別與進程管理模塊、內(nèi)存管理模塊和中央處理模塊相連,分別傳輸線程運行狀態(tài)及調(diào)度信息、線程內(nèi)存數(shù)據(jù)訪問以及處理器運行狀態(tài);
[0007]所述的模擬器引擎模塊為各個組件提供統(tǒng)一的協(xié)調(diào)控制,并驅(qū)動各個組件運行完成被模擬進程的加載、初始化、運行和清除,該模擬器引擎模塊包括:驅(qū)動單元、操作系統(tǒng)掛鉤單元和調(diào)試單元,其中:驅(qū)動單元與內(nèi)存管理模塊和進程管理模塊相連,接收運行狀態(tài)信息,發(fā)送運行指令;操作系統(tǒng)掛鉤單元與進程管理模塊相連,接收進程管理模塊的系統(tǒng)API調(diào)用并傳遞給底層操作系統(tǒng),返回API調(diào)用結(jié)果;調(diào)試單元連接系統(tǒng)調(diào)用接口和分析組件接口進行應(yīng)用程序調(diào)試;
[0008]所述的內(nèi)存管理模塊包括:虛擬內(nèi)存管理單元、堆管理單元和棧管理單元,其中:虛擬內(nèi)存管理單元向線程管理模塊傳輸內(nèi)存訪問數(shù)據(jù),并與模擬器引擎模塊的驅(qū)動單元相連以傳輸運行狀態(tài)信息;堆管理單元從進程管理模塊接收堆管理指令,完成進程中堆內(nèi)存的管理;棧管理單元從線程管理模塊接收線程運行狀態(tài),完成所有線程中棧內(nèi)存的管理。
[0009]所述的虛擬內(nèi)存管理單元采用分頁方案對4GB虛擬內(nèi)存進行管理;同時模擬Windows的虛擬內(nèi)存管理行為,完成操作系統(tǒng)級別的內(nèi)存分配、回收及訪問權(quán)限控制。
[0010]所述的堆管理單元和棧管理單元分別傳輸?shù)倪M程中堆的管理信息、進程中各線程棧內(nèi)存的管理,全局虛擬內(nèi)存頁分配與回收等。
[0011]所述的進程中堆的管理信息包括:堆的建立銷毀和內(nèi)存分配;堆內(nèi)存權(quán)限設(shè)置;堆容量調(diào)整與重分配等。
[0012]所述的進程管理模塊包括:線程調(diào)度管理單元、狀態(tài)驅(qū)動單元和系統(tǒng)API封裝單元,其中:線程調(diào)度管理單元與中央處理模塊相連接收進程中所有線程的調(diào)度信息,完成線程的調(diào)度以及創(chuàng)建和銷毀;狀態(tài)驅(qū)動單元與模擬器引擎模塊相連,接收模擬器引擎模塊的運行指令,完成主線程及其他線程的運行驅(qū)動并傳輸運行狀態(tài)信息;系統(tǒng)API封裝單元與系統(tǒng)調(diào)用接口相連接收線程管理模塊的系統(tǒng)API調(diào)用,封裝參數(shù)并傳輸至模擬器引擎模塊進行調(diào)用。[0013]所述的進程管理模塊用于對進程的完整執(zhí)行流程進行驅(qū)動;維護該進程所包含的所有線程及其調(diào)度;進程中系統(tǒng)句柄(Handle)維護及內(nèi)存地址分配;以及進程PEB(Process Environment Block)等數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建及維護。
[0014]所述的線程管理模塊包括:環(huán)境信息模擬單元、驅(qū)動線程單元和執(zhí)行單元,其中:環(huán)境信息模擬單元與進程管理單元相連,接收線程的運行時狀態(tài)信息并建立模擬運行時環(huán)境供線程使用;驅(qū)動線程單元與進程管理單元相連,接收線程運行指令并傳輸線程運行狀態(tài);執(zhí)行單元與中央處理模塊的線程狀態(tài)單元相連用于完成處理器指令循環(huán)并在結(jié)束時終止線程。
[0015]所述的環(huán)境信息模擬模塊建立的供線程使用的模擬運行時環(huán)境包括:入口點、參數(shù)、標志位、堆棧地址和大小及TEB (Thread Environment Block);
[0016]所述的線程管理模塊維護模擬進程中單個線程的環(huán)境信息,并驅(qū)動線程從入口點開始的執(zhí)行過程,同時判斷終止條件并結(jié)束線程;同時用于由該線程動態(tài)加載的其他模塊(DLL)的載入和初始化;
[0017]所述的中央處理模塊內(nèi)置有分別與進程管理模塊和線程管理模塊相連的寄存器和狀態(tài)單元且分別傳輸處理器調(diào)度信息和線程運行狀態(tài)及調(diào)度信息。
[0018]所述的傳輸處理器調(diào)度信息和線程運行狀態(tài)及調(diào)度信息包括:處理器標志位(eflags)、運行狀態(tài)信息;并對x86指令集、x87FPU指令集、MMX指令集和SSE指令集提供了解釋模擬函數(shù),從而實現(xiàn)完整處理器功能的模擬。
[0019]所述的中央處理模塊上設(shè)有異常管理器,用于傳遞處理器異常信息及異常處理結(jié)果,該異常管理器構(gòu)造異常的環(huán)境信息并執(zhí)行異常處理函數(shù)。
[0020]所述的分析組件接口為系統(tǒng)提供API接口,使得分析人員能夠很容易地編寫分析組件,完成自動化程序分析;
[0021]所述的模擬器引擎模塊分別連接加載器、反匯編引擎和與附加的調(diào)試組件相連、用于進行應(yīng)用程序調(diào)試的調(diào)試接口,其中:加載器解析待分析進程的可執(zhí)行PE文件并將解析結(jié)果通過模擬器引擎模塊加載至內(nèi)存管理模塊,反匯編引擎對單條x86指令進行反匯編,解析出指令的操作碼、源操作數(shù)、目的操作數(shù)等信息;調(diào)試接口用于傳遞調(diào)試信息,可進行應(yīng)用程序及模擬器自身的調(diào)試;
[0022]所述的待分析進程的可執(zhí)行PE文件是指=Windows中的可執(zhí)行程序以PE格式存在,模擬器加載并解析PE文件使其能夠被模擬執(zhí)行;
[0023]本發(fā)明涉及一種基于上述系統(tǒng)的進程優(yōu)化方法,包括以下步驟:
[0024]步驟一、對待分析進程進行輕量級x86指令集模擬,即以程序運行效率損失在兩個數(shù)量級以內(nèi)的前提下進行x86指令集的模擬處理和虛擬內(nèi)存環(huán)境,
[0025]所述的步驟一具體包括:
[0026]1.1使用啟發(fā)式遞歸反匯編算法對于每條處理器指令提供靜態(tài)的反匯編信息;
[0027]所述的啟發(fā)式遞歸反匯編算法包括以下步驟:
[0028]1.1.1針對PE文件中的各條指令進行以下步驟的判斷。
[0029]1.1.2定位入口點指令E,當(dāng)該指令E為有效指令則對其進行反匯編處理后執(zhí)行步驟1.1.3,否則跳過該條指令并重新執(zhí)行步驟1.1.2。
[0030]1.1.3當(dāng)反匯編處理后的指令E為跳轉(zhuǎn)指令,則對指令E的跳轉(zhuǎn)目標進行反匯編處理。
[0031]1.1.4在指令E的尾部添加該指令的長度信息并返回步驟1.1.2處理下一條指令,直至完成所有指令的處理后返回反匯編處理得到的指令集合S。
[0032]1.2利用反匯編信息模擬各條指令的執(zhí)行流程,包括寄存器、內(nèi)存數(shù)據(jù)以及標志位的值。
[0033]1.3提取內(nèi)存訪問數(shù)據(jù)、寄存器值變化信息用于程序分析。
[0034]所述的內(nèi)存訪問數(shù)據(jù)包括:內(nèi)存地址和內(nèi)存數(shù)據(jù)、寄存器值、標志位改變信息以及異常f目息。
[0035]步驟二、模擬若干操作系統(tǒng)行為保證待分析進程運行在可控的環(huán)境中,具體包括:
[0036]2.1進程初始化階段對被模擬的程序進行加載和初始化,確定進程中各模塊中各段(section)的內(nèi)存分布情況,并確定入口點以及終止條件。
[0037]2.2內(nèi)存管理使用分頁式的內(nèi)存管理機制,包括:以頁為單位的虛擬內(nèi)存分配、回收和訪問權(quán)限控制。
[0038]2.3線程管理模塊用于維護多線程程序中的線程建立、銷毀以及線程調(diào)度,使多線程程序在共享內(nèi)存的模型下能夠被正常執(zhí)行。
[0039]2.4異常處理用于在處理器發(fā)生異常時的操作系統(tǒng)異常處理機制,使程序的異常處理例程能夠運行在模擬環(huán)境中。
[0040]步驟三、對進程中的操作系統(tǒng)API調(diào)用進行封裝,交由操作系統(tǒng)直接執(zhí)行;
[0041]所述的操作系統(tǒng)API是指:操作系統(tǒng)提供給用戶進程的應(yīng)用程序接口,使用戶程序能夠利用操作系統(tǒng)功能。
[0042]3.1攔截所有模擬進程的API調(diào)用,核心API由模擬器引擎模塊直接模擬執(zhí)行,其他API發(fā)送至操作系統(tǒng)執(zhí)行;
[0043]所述的核心API包括:內(nèi)存管理AP1、線程管理AP1、調(diào)試AP1、操作系統(tǒng)參數(shù)獲取API 等。
[0044]3.2完成API調(diào)用時的參數(shù)轉(zhuǎn)換,包括:模擬內(nèi)存地址和真實地址的映射。
[0045]3.3操作系統(tǒng)在API執(zhí)行完畢后返回模擬器引擎模塊,處理執(zhí)行結(jié)果。
[0046]步驟四、為模擬執(zhí)行過程中的動態(tài)運行時信息提供應(yīng)用程序接口,并將模擬器各組件的執(zhí)行過程封裝為事件,以事件處理的方式提供應(yīng)用程序接口,最終使得分析程序能夠利用這些信息進行程序優(yōu)化。
[0047]所述的動態(tài)運行時信息包括:指令流、數(shù)據(jù)流和控制流。
[0048]所述的事件包括:指令執(zhí)行事件、內(nèi)存訪問事件、操作系統(tǒng)API調(diào)用事件、線程調(diào)度事件。
技術(shù)效果
[0049]I)對被分析程序進行指令級別的模擬執(zhí)行,使用輕量級x86指令集解釋器來提供細粒度的運行時信息;
[0050]2)對待分析進程中與程序分析無關(guān)的內(nèi)容,如系統(tǒng)調(diào)用的執(zhí)行采用包裝或模擬的方式,交由底層操作系統(tǒng)執(zhí)行,保證分析效率;
[0051]3)模擬若干操作系統(tǒng)行為如內(nèi)存管理、線程管理及異常處理等,保證被分析程序運行在可控的環(huán)境中;
[0052]4)為程序的自動化分析提供良好的接口,使得程序的模擬執(zhí)行和分析能夠同步高效進行。
[0053]與目前已有的分析方案相比,本發(fā)明幾乎不受反調(diào)試手段的影響,同時不修改待分析進程的原始指令和數(shù)據(jù),運行效率比全系統(tǒng)模擬提高了一至二個數(shù)量級,同時穩(wěn)定性和兼容性較二進制插樁有了極大的提高。在該分析系統(tǒng)的基礎(chǔ)上,能夠高效進行程序的算法及協(xié)議分析、漏洞挖掘及檢測、程序性能分析、內(nèi)存調(diào)試、程序行為分析以及惡意程序檢測等多種自動化分析手段,對程序安全分析提供了可靠的支持。
【專利附圖】
【附圖說明】
[0054]圖1為本發(fā)明系統(tǒng)結(jié)構(gòu)圖;
[0055]圖2為進程管理模塊的結(jié)構(gòu)示意圖;
[0056]圖3為線程管理模塊的結(jié)構(gòu)示意圖;
[0057]圖4為本發(fā)明運行流程圖。
【具體實施方式】
[0058]下面對本發(fā)明的實施例作詳細說明,本實施例在以本發(fā)明技術(shù)方案為前提下進行實施,給出了詳細的實施方式和具體的操作過程,但本發(fā)明的保護范圍不限于下述的實施例。
實施例1
[0059]以常用多線程網(wǎng)絡(luò)通信程序curl, exe (http://curl, haxx.se)為例,說明具體的實施過程。
[0060]如圖1所示,包括:模擬器引擎模塊、內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口、線程管理模塊、中央處理模塊和提供應(yīng)用程序接口的分析組件接口,其中:模擬器引擎模塊分別連接內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口和分析組件接口,分別傳輸內(nèi)存訪問數(shù)據(jù)、線程調(diào)度和處理器訪問數(shù)據(jù)、系統(tǒng)調(diào)用參數(shù)及其封裝以及模擬器事件和環(huán)境信息,控制、協(xié)調(diào)各個模塊并降低不同模塊之間的耦合度;進程管理模塊分別與內(nèi)存管理模塊、中央處理模塊和系統(tǒng)調(diào)用接口相連,分別傳輸內(nèi)存管理數(shù)據(jù)如內(nèi)存分配回收、處理器調(diào)度信息以及系統(tǒng)調(diào)用參數(shù)轉(zhuǎn)換及封裝等信息,線程管理模塊分別與內(nèi)存管理模塊、進程管理模塊和中央處理模塊相連,分別傳輸線程數(shù)據(jù)在內(nèi)存中的分布情況、線程運行狀態(tài)及調(diào)度信息、以及處理器運行狀態(tài);
[0061]所述的模擬器引擎模塊包括:公用的系統(tǒng)接口,為各個組件提供統(tǒng)一的協(xié)調(diào)控制,并驅(qū)動各個組件運行完成被模擬進程的加載、初始化、運行和清除;
[0062]所述的內(nèi)存管理模塊分別與堆和棧相連,分別傳輸進程中堆的管理信息如堆的建立銷毀和內(nèi)存分配、進程中各線程棧內(nèi)存的管理,內(nèi)存管理模塊包括:虛擬內(nèi)存管理單元,采用分頁方案對4GB虛擬內(nèi)存進行管理;同時模擬Windows的虛擬內(nèi)存管理行為,完成操作系統(tǒng)級別的內(nèi)存分配、回收及訪問權(quán)限控制;
[0063]內(nèi)存管理模塊:模擬Windows的分頁內(nèi)存管理機制,用于待分析進程的內(nèi)存分配和回收以及權(quán)限管理,為系統(tǒng)的內(nèi)存管理API提供底層的模擬實現(xiàn),同時維護待分析進程的堆和棧;
[0064]所述的進程管理模塊包括:用于對進程的完整執(zhí)行流程進行驅(qū)動;維護該進程所包含的所有線程及其調(diào)度;進程中系統(tǒng)句柄(Handle)維護及內(nèi)存地址分配;以及進程PEB(Process Environment Block)等數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建及維護;
[0065]進程管理模塊:維護待分析進程相關(guān)的上下文信息,管理待分析進程的所有線程;
[0066]所述的線程管理模塊包括:維護模擬進程中單個線程的環(huán)境信息,如入口點、參數(shù)、標志位、堆棧地址和大小及TEB等,并驅(qū)動線程從入口點開始的執(zhí)行過程,同時判斷終止條件并結(jié)束線程;同時用于由該線程動態(tài)加載的其他模塊(DLL)的載入和初始化;
[0067]所述的中央處理模塊包括:為完整的中央處理模塊提供模擬環(huán)境、包括寄存器、處理器標志位(eflags)、運行狀態(tài)信息等;并對x86指令集、x87FPU指令集、MMX指令集和SSE指令集提供了解釋模擬函數(shù),從而實現(xiàn)完整處理器功能的模擬;以及子模塊異常管理器;其中異常管理器與處理器模塊連接,傳遞處理器異常信息及異常處理結(jié)果;
[0068]線程管理模塊和中央處理模塊:為每個線程維護獨立的中央處理模塊環(huán)境,包括寄存器、處理器標志位及寄存器其它運行時數(shù)據(jù),中央處理模塊對待分析進程的各條指令進行模擬解釋執(zhí)行;
[0069]系統(tǒng)調(diào)用接口:接管待分析進程中的API調(diào)用,對核心API,如內(nèi)存相關(guān),采用模擬執(zhí)行,其他API則交由操作系統(tǒng)直接運行,保證運行效率;
[0070]分析組件接口為系統(tǒng)提供API接口,使得分析人員能夠很容易地編寫分析組件,完成自動化程序分析;
[0071]所述的模擬器引擎模塊分別連接加載器、反匯編引擎和與附加的調(diào)試組件相連、用于進行應(yīng)用程序調(diào)試的調(diào)試接口,其中:加載器解析待分析進程的可執(zhí)行PE文件并將解析結(jié)果通過模擬器引擎模塊加載至內(nèi)存管理模塊,反匯編引擎對單條x86指令進行反匯編,解析出指令的操作碼、源操作數(shù)、目的操作數(shù)等信息;調(diào)試接口用于傳遞調(diào)試信息,可進行應(yīng)用程序及模擬器自身的調(diào)試;
[0072]所述的待分析進程的可執(zhí)行PE文件是指=Windows中的可執(zhí)行程序以PE格式存在,模擬器加載并解析PE文件使其能夠被模擬執(zhí)行;
實施例2
[0073]如圖2所示,本發(fā)明所述系統(tǒng)運行時經(jīng)歷加載、初始化、運行分析、終止等過程。
[0074]步驟一、加載待分析進程的PE文件和依賴的動態(tài)鏈接庫,建立完整的Windowsx86虛擬運行時環(huán)境;
[0075]所述的運行時環(huán)境包括線性內(nèi)存地址空間、中央處理模塊環(huán)境以及相關(guān)的操作系統(tǒng)功能;
[0076]步驟二、對待分析進程進行指令模擬執(zhí)行,使用輕量級的x86指令集模擬器提供細粒度的運行時信息,并進行后續(xù)分析,具體步驟包括:
[0077]2.1使用啟發(fā)式遞歸反匯編算法嘗試反匯編所有指令;
[0078]2.2構(gòu)造處理器模擬環(huán)境,利用反匯編信息精確模擬各條指令的執(zhí)行流程;
[0079]2.3提取內(nèi)存訪問數(shù)據(jù)、寄存器值等信息用于程序分析;
[0080]所述的輕量級的x86指令集模擬器是指:高性能的、以低代價運行的x86指令集模擬器,能夠在對程序正常執(zhí)行不造成顯著影響的情況下對x86指令集進行模擬執(zhí)行;
[0081]所述的細粒度的劃分具體是:精確到對操作系統(tǒng)可見的最細粒度,即指令、寄存器這一級別,而非諸如動態(tài)二進制插樁等方案常采用的基本塊或函數(shù)這一級別;
[0082]所述的運行時信息具體是指:內(nèi)存訪問信息如內(nèi)存地址和內(nèi)存數(shù)據(jù)、寄存器值、標志位改變信息以及可能產(chǎn)生的異常信息等;
[0083]步驟三、模擬若干操作系統(tǒng)行為保證待分析進程運行在可控的環(huán)境中,具體步驟包括:
[0084]3.1加載curl, exe的程序主體和依賴的系統(tǒng)模塊(DLL),使用地址空間隨機化(ASLR)分配各組件的基地址,確定內(nèi)存布局;同時確定程序入口點以及終止條件;
[0085]3.2對進程虛擬內(nèi)存空間采用分頁管理,其中頁面大小為4KB ;對每個頁面維護其狀態(tài)信息(空閑、保留或提交)以及訪問控制權(quán)限(可讀、可寫、可執(zhí)行)等,并由虛擬內(nèi)存管理單元統(tǒng)一管理內(nèi)存頁面的分配和回收;
[0086]3.3線程管理模塊用于管理進程中的所有線程,包括在程序初始化時的主線程、執(zhí)行過程中的線程建立和銷毀;
[0087]3.4異常處理器接管在處理器發(fā)生異常時的操作系統(tǒng)異常處理機制,在模擬器環(huán)境中運行程序的異常處理例程;
[0088]所述的操作系統(tǒng)行為具體是指:進程初始化、內(nèi)存管理、線程管理、異常處理等;
[0089]步驟四、對進程中的所有操作系統(tǒng)API進行封裝,并部分交由操作系統(tǒng)直接執(zhí)行,具體步驟包括:
[0090]4.1攔截所有模擬進程的API調(diào)用,對核心API(如內(nèi)存分配API VirtualAlloc ())由模擬器直接模擬執(zhí)行,其他API (如網(wǎng)絡(luò)API socket ())發(fā)送至操作系統(tǒng)執(zhí)行;
[0091]4.2完成API調(diào)用時的參數(shù)轉(zhuǎn)換,對其中的指針類型參數(shù)進行模擬內(nèi)存地址和真實地址的映射,對于復(fù)雜結(jié)構(gòu)體和新分配的堆數(shù)據(jù)進行深度拷貝映射至模擬內(nèi)存空間;
[0092]4.3API執(zhí)行完畢后返回模擬器控制,清除堆棧并解析API返回結(jié)果;
[0093]所述的操作系統(tǒng)API是指操作系統(tǒng)提供給用戶進程的應(yīng)用程序接口,使用戶程序能夠利用操作系統(tǒng)功能。
[0094]步驟五、為模擬執(zhí)行過程中的動態(tài)運行時信息如指令流、數(shù)據(jù)里和控制流提供應(yīng)用程序接口,使得分析程序能夠利用這些信息進行程序分析,具體為:將模擬器的執(zhí)行過程封裝為事件,以事件處理的方式提供應(yīng)用程序接口 ;主要包括指令執(zhí)行事件、內(nèi)存訪問事件、操作系統(tǒng)API調(diào)用事件、線程調(diào)度事件等等;針對curl, exe的執(zhí)行流程,能夠獲取到其中的所有指令執(zhí)行事件,包括寄存器和標志位改變等參數(shù);能夠獲取諸如網(wǎng)絡(luò)API調(diào)用事件,并能夠從中解析網(wǎng)絡(luò)數(shù)據(jù);同時能夠重建程序運行時環(huán)境用于描述程序行為等。
【權(quán)利要求】
1.一種基于進程模擬的二進制程序分析系統(tǒng),其特征在于,包括:模擬器引擎模塊、內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口、線程管理模塊、中央處理模塊和提供應(yīng)用程序接口的分析組件接口,其中:模擬器引擎模塊分別連接內(nèi)存管理模塊、進程管理模塊、系統(tǒng)調(diào)用接口和分析組件接口,分別傳輸運行狀態(tài)信息和運行指令、進程管理和線程調(diào)度信息、系統(tǒng)API調(diào)用數(shù)據(jù)、調(diào)試信息和分析組件事件,控制、協(xié)調(diào)各個模塊并降低不同模塊之間的耦合度;進程管理模塊分別與中央處理模塊、內(nèi)存管理模塊和系統(tǒng)調(diào)用接口相連,分別傳輸處理器調(diào)度信息和運行狀態(tài)信息、內(nèi)存管理數(shù)據(jù)以及系統(tǒng)調(diào)用參數(shù)轉(zhuǎn)換信息及封裝信息,線程管理模塊分別與進程管理模塊、內(nèi)存管理模塊和中央處理模塊相連,分別傳輸線程運行狀態(tài)及調(diào)度信息、線程內(nèi)存數(shù)據(jù)訪問以及處理器運行狀態(tài)。
2.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征是,所述的模擬器引擎模塊包括:驅(qū)動單元、操作系統(tǒng)掛鉤單元和調(diào)試單元,其中:驅(qū)動單元與內(nèi)存管理模塊和進程管理模塊相連,接收運行狀態(tài)信息,發(fā)送運行指令;操作系統(tǒng)掛鉤單元與進程管理模塊相連,接收進程管理模塊的系統(tǒng)API調(diào)用并傳遞給底層操作系統(tǒng),返回API調(diào)用結(jié)果;調(diào)試單元連接系統(tǒng)調(diào)用接口和分析組件接口進行應(yīng)用程序調(diào)試。
3.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征是,所述的內(nèi)存管理模塊包括:虛擬內(nèi)存管理單元、堆管理單元和棧管理單元,其中:虛擬內(nèi)存管理單元向線程管理模塊傳輸內(nèi)存訪問數(shù)據(jù),并與模擬器引擎模塊的驅(qū)動單元相連以傳輸運行狀態(tài)信息;堆管理單元從進程管理模塊接收堆管理指令,完成進程中堆內(nèi)存的管理;棧管理單元從線程管理模塊接收線程運行狀態(tài),完成所有線程中棧內(nèi)存的管理。
4.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征是,所述的進程管理模塊包括:線程調(diào)度管理單元、狀態(tài)驅(qū)動單元和系統(tǒng)API封裝單元,其中:線程調(diào)度管理單元與中央處理模塊相連接收進程中所有線程的調(diào)度信息,完成線程的調(diào)度以及創(chuàng)建和銷毀;狀態(tài)驅(qū)動單元與模擬器引擎模塊相連,接收模擬器 引擎模塊的運行指令,完成主線程及其他線程的運行驅(qū)動并傳輸運行狀態(tài)信息;系統(tǒng)API封裝單元與系統(tǒng)調(diào)用接口相連接收線程管理模塊的系統(tǒng)API調(diào)用,封裝參數(shù)并傳輸至模擬器弓I擎模塊進行調(diào)用。
5.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征是,所述的線程管理模塊包括:環(huán)境信息模擬單元、驅(qū)動線程單元、執(zhí)行單元,其中:環(huán)境信息模擬單元與進程管理單元相連,接收線程的運行時狀態(tài)信息并建立模擬運行時環(huán)境供線程使用;驅(qū)動線程單元與進程管理單元相連,接收線程運行指令并傳輸線程運行狀態(tài);執(zhí)行單元與中央處理模塊的線程狀態(tài)單元相連用于完成處理器指令循環(huán)并在結(jié)束時終止線程。
6.根據(jù)權(quán)利要求1-5任一項所述的系統(tǒng),其特征是,所述的中央處理模塊上設(shè)有異常管理器,用于傳遞處理器異常信息及異常處理結(jié)果,該異常管理器構(gòu)造異常的環(huán)境信息并執(zhí)行異常處理函數(shù)。
7.一種基于上述任一項權(quán)利要求所述系統(tǒng)的進程優(yōu)化方法,其特征在于,包括以下步驟: 步驟一、對待分析進程進行輕量級x86指令集模擬,即以程序運行效率損失在兩個數(shù)量級以內(nèi)的前提下進行x86指令集的模擬處理和虛擬內(nèi)存環(huán)境; 步驟二、模擬若干操作系統(tǒng)行為保證待分析進程運行在可控的環(huán)境中; 步驟三、對進程中的操作系統(tǒng)API調(diào)用進行封裝,交由操作系統(tǒng)直接執(zhí)行;步驟四、為模擬執(zhí)行過程中的動態(tài)運行時信息提供應(yīng)用程序接口,并將模擬器各組件的執(zhí)行過程封裝為事件,以事件處理的方式提供應(yīng)用程序接口,最終使得分析程序能夠利用這些信息進行程序優(yōu)化。
8.根據(jù)權(quán)利要求7所述的方法,其特征是,所述的步驟一具體包括: 步驟1.D使用啟發(fā)式遞歸反匯編算法對于每條處理器指令提供靜態(tài)的反匯編信息; 1.1.1針對PE文件中的各條指令進行以下步驟的判斷; 1.1.2定位入口點指令E,當(dāng)該指令E為有效指令則對其進行反匯編處理后執(zhí)行步驟1.1.3,否則跳過該條指令并重新執(zhí)行步驟1.1.2 ; 1.1.3當(dāng)反匯編處理后的指令E為跳轉(zhuǎn)指令,則對指令E的跳轉(zhuǎn)目標進行反匯編處理; 1.1.4在指令E的尾部添加該指令的長度信息并返回步驟1.1.2處理下一條指令,直至完成所有指令的處理后返回反匯編處理得到的指令集合S ; 步驟1.2)利用反匯編信息模擬各條指令的執(zhí)行流程,包括寄存器、內(nèi)存數(shù)據(jù)以及標志位的值; 步驟1.3)提取內(nèi)存訪問數(shù)據(jù)、寄存器值變化信息用于程序分析。
9.根據(jù)權(quán)利要求7所述的方法,其特征是,所述的步驟二具體包括: 步驟2.1)進程初始化階段對被模擬的程序進行加載和初始化,確定進程中各模塊中各段的內(nèi)存分布情況,并確定入口點以及終止條件; 步驟2.2)內(nèi)存管理使用分頁式的內(nèi)存管理機制,包括:以頁為單位的虛擬內(nèi)存分配、回收和訪問權(quán)限控制 ; 步驟2.3)線程管理模塊用于維護多線程程序中的線程建立、銷毀以及線程調(diào)度,使多線程程序在共享內(nèi)存的模型下能夠被正常執(zhí)行; 步驟2.4)異常處理用于在處理器發(fā)生異常時的操作系統(tǒng)異常處理機制,使程序的異常處理例程能夠運行在模擬環(huán)境中。
10.根據(jù)權(quán)利要求7所述的方法,其特征是,所述的步驟三具體為: 步驟3.1)攔截所有模擬進程的API調(diào)用,核心API由模擬器引擎模塊直接模擬執(zhí)行,其他API發(fā)送至操作系統(tǒng)執(zhí)行; 步驟3.2)完成API調(diào)用時的參數(shù)轉(zhuǎn)換,包括:模擬內(nèi)存地址和真實地址的映射; 步驟3.3)操作系統(tǒng)在API執(zhí)行完畢后返回模擬器引擎模塊,處理執(zhí)行結(jié)果。
【文檔編號】G06F21/52GK103440457SQ201310426028
【公開日】2013年12月11日 申請日期:2013年9月18日 優(yōu)先權(quán)日:2013年8月20日
【發(fā)明者】谷大武, 趙若旭, 劉慧 , 張媛媛, 李卷孺 申請人:上海交通大學(xué)