一種數(shù)據(jù)流跟蹤方法
【專利摘要】本發(fā)明公開了一種數(shù)據(jù)流跟蹤方法,包括三個(gè)階段:客戶操作系統(tǒng)指令靜態(tài)反匯編,根據(jù)靜態(tài)的客戶機(jī)x86指令生成對(duì)應(yīng)的污點(diǎn)傳播指令,進(jìn)行污點(diǎn)數(shù)據(jù)傳播更新操作,對(duì)于在靜態(tài)反匯編時(shí)不能獲取的內(nèi)存操作數(shù)物理地址,通過采用共享緩存的方式在動(dòng)態(tài)執(zhí)行過程中獲??;編譯產(chǎn)生宿主機(jī)執(zhí)行代碼,根據(jù)上一階段的污點(diǎn)指令生成宿主機(jī)上的可執(zhí)行代碼,以處理函數(shù)的形式進(jìn)行生成,方便下一階段的執(zhí)行;開啟新的執(zhí)行線程,執(zhí)行污點(diǎn)指令,逐條取出污點(diǎn)指令,調(diào)用其處理函數(shù)。本發(fā)明方法通過將污點(diǎn)跟蹤操作和模擬器動(dòng)態(tài)二進(jìn)制翻譯執(zhí)行模塊分離,實(shí)現(xiàn)基于x86指令級(jí)的污點(diǎn)語義翻譯和并行化的污點(diǎn)傳播更新,減少無用的污點(diǎn)跟蹤操作,提高系統(tǒng)和用戶的交互體驗(yàn)。
【專利說明】一種數(shù)據(jù)流跟蹤方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)安全領(lǐng)域,更具體地說,本發(fā)明涉及一種數(shù)據(jù)流跟蹤方法。
【背景技術(shù)】
[0002]數(shù)據(jù)流跟蹤技術(shù)是一種在信息安全領(lǐng)域被廣泛使用的安全技術(shù)。采用字節(jié)級(jí)的污點(diǎn)標(biāo)記對(duì)低級(jí)的機(jī)器狀態(tài)(CPU寄存器、物理內(nèi)存、磁盤塊等等)進(jìn)行污點(diǎn)標(biāo)記,同時(shí)攔截和分析系統(tǒng)指令流,分析出指令流對(duì)污點(diǎn)標(biāo)記的影響從而更新和維護(hù)污點(diǎn)標(biāo)記。為了獲得數(shù)據(jù)流跟蹤所需的細(xì)粒度分析能力,污點(diǎn)跟蹤系統(tǒng)需要采用動(dòng)態(tài)二進(jìn)制插樁技術(shù)對(duì)目標(biāo)應(yīng)用程序進(jìn)行插樁或者通過模擬器運(yùn)行目標(biāo)系統(tǒng)。
[0003]基于動(dòng)態(tài)二進(jìn)制插樁技術(shù)實(shí)現(xiàn)的污點(diǎn)跟蹤系統(tǒng)由于需要獲得被目標(biāo)程序更高的權(quán)限級(jí),因此通常只適用于應(yīng)用層的應(yīng)用程序的插樁?;谀M器的污點(diǎn)跟蹤系統(tǒng)通過在模擬器比如QEMU中運(yùn)行整個(gè)目標(biāo)系統(tǒng)環(huán)境,能夠?qū)?nèi)核級(jí)的代碼進(jìn)行跟蹤。但是,當(dāng)前基于模擬器實(shí)現(xiàn)的污點(diǎn)跟蹤系統(tǒng)比如TEMU、Arg0S等,都存在性能開銷過大的問題。
[0004]QEMU模擬器在對(duì)CPU進(jìn)行模擬運(yùn)行目標(biāo)系統(tǒng)時(shí),首先通過對(duì)目標(biāo)系統(tǒng)的二進(jìn)制代碼塊進(jìn)行反匯編,翻譯成一種類似精簡指令集計(jì)算機(jī)(Reduced Instruction SetComputer, RISC)的平臺(tái)無關(guān)的中間指令,然后進(jìn)一步將這些中間指令編譯成能夠運(yùn)行于宿主操作系統(tǒng)上的指令運(yùn)行。傳統(tǒng)的基于QEMU的污點(diǎn)跟蹤系統(tǒng)在實(shí)現(xiàn)時(shí)都是在中間指令級(jí)進(jìn)行修改,然而一條x86指令往往會(huì)被翻譯成多條中間指令,比如對(duì)于pUSh%ebX這條x86指令,QEMU會(huì)將其翻譯成對(duì)應(yīng)的5條中間指令:Id_i32tmp0, env, $0xc; ld_i32tmp2, env, $0x10;movi_i32tmpl4, $0xfffffffc;add_i32tmp2, tmp2, tmpl4;qemu_st32tmp0, tmp2, $0x0; st_i32tmp2, env, $0x10。因此對(duì)于一條 x86 指令,原本只需要進(jìn)行一次污點(diǎn)更新操作,基于中間指令實(shí)現(xiàn),將會(huì)產(chǎn)生對(duì)應(yīng)的多次污點(diǎn)傳播更新操作,而其中大部分操作都是對(duì)QEMU內(nèi)部變量進(jìn)行的跟蹤更新,是無用的操作?;谥虚g指令實(shí)現(xiàn)的污點(diǎn)跟蹤系統(tǒng),實(shí)現(xiàn)簡單直接,卻存在大量無用的操作,導(dǎo)致性能開銷比較大。
【發(fā)明內(nèi)容】
[0005]針對(duì)現(xiàn)有技術(shù)的以上缺陷或改進(jìn)需求,本發(fā)明提供了一種數(shù)據(jù)流跟蹤方法,該方法基于模擬器進(jìn)行數(shù)據(jù)流跟蹤的優(yōu)化,包括對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的階段、編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段和最終代碼執(zhí)行的階段,其中:
[0006]在對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的階段,模擬器對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的同時(shí)產(chǎn)生污點(diǎn)指令,污點(diǎn)指令為特定的編碼形式,固定大小為4個(gè)字節(jié),包括操作碼(opcode)、源操作數(shù)、目的操作數(shù)以及ArgLogPos字段;
[0007]在編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段,對(duì)之前產(chǎn)生的污點(diǎn)指令進(jìn)行編譯產(chǎn)生宿主機(jī)上運(yùn)行的指令,每一個(gè)污點(diǎn)指令對(duì)應(yīng)于一個(gè)處理函數(shù),用于執(zhí)行該污點(diǎn)指令代表的污點(diǎn)更新操作;
[0008]在最終代碼執(zhí)行階段,開啟新的線程執(zhí)行污點(diǎn)指令,進(jìn)行污點(diǎn)跟蹤的操作,執(zhí)行的過程就是逐條取出污點(diǎn)指令并調(diào)用污點(diǎn)指令處理函數(shù)。
[0009]進(jìn)一步優(yōu)選地,所述污點(diǎn)指令固定大小為4個(gè)字節(jié),其中包括操作碼(opcode),占4個(gè)bit位;源操作數(shù)和目的操作數(shù),分別占6個(gè)bit位,以及ArgLogPos字段,占16個(gè)bit位,ArgLogPos字段指定了內(nèi)存操作數(shù)地址在共享緩存ArgLog的位置。
[0010]進(jìn)一步優(yōu)選地,在所述客戶操作系統(tǒng)指令進(jìn)行反匯編的階段,具體進(jìn)行如下操作:
[0011](1-1)取出客戶操作系統(tǒng)的一條指令進(jìn)行反匯編;
[0012](1-2)判斷當(dāng)前客戶操作系統(tǒng)的指令是否會(huì)產(chǎn)生污點(diǎn)傳播;如果不會(huì)產(chǎn)生污點(diǎn)傳播,則轉(zhuǎn)入步驟(1-6);
[0013](1-3)判斷當(dāng)前客戶操作系統(tǒng)的指令是否包括內(nèi)存操作數(shù),即是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)的地址;如果沒有包括內(nèi)存操作數(shù),則轉(zhuǎn)入步驟(5);
[0014](1-4)在ArgLog共享緩存中分配一塊空間,用于后面保存動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址,將該空間在ArgLog中的地址寫入污點(diǎn)指令的ArgLogPos字段中;
[0015](1-5)分析客戶操作系統(tǒng)的指令,編碼污點(diǎn)指令的opcode,源操作數(shù)和目的操作數(shù)字段;
[0016](1-6)判斷當(dāng)前客戶操作是否還有指令需要進(jìn)行翻譯;如果還有指令需要進(jìn)行翻譯,則轉(zhuǎn)入步驟(1-1)。
[0017]進(jìn)一步優(yōu)選地,在編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段,具體進(jìn)行如下操作:
[0018](2-1)從第一階段生成的污點(diǎn)指令緩存中取出一條污點(diǎn)指令;
[0019](2-2)判斷當(dāng)前污點(diǎn)指令是否存在處理函數(shù);如果已經(jīng)存在處理函數(shù),則轉(zhuǎn)入步驟(2-6);
[0020](2-3)判斷當(dāng)前污點(diǎn)指令是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)地址;如果不需要,則轉(zhuǎn)入步驟(2-5);
[0021](2-4)通知模擬器后端編譯TCG模塊,在運(yùn)行過程中動(dòng)態(tài)獲取需要的內(nèi)存操作數(shù)地址寫入ArgLog指定的共享內(nèi)存中;
[0022](2-5)在處理函數(shù)代碼緩存中為污點(diǎn)指令編譯對(duì)應(yīng)的處理函數(shù);
[0023](2-6)判斷是否還有污點(diǎn)指令需要進(jìn)行處理;如果有,則轉(zhuǎn)入步驟(2-1)。
[0024]進(jìn)一步優(yōu)選地,在最終代碼執(zhí)行階段,具體進(jìn)行如下操作:
[0025](3-1)創(chuàng)建新的線程,調(diào)用污點(diǎn)跟蹤執(zhí)行函數(shù)去執(zhí)行污點(diǎn)跟蹤指令;
[0026](3-2)線程在執(zhí)行過程中,從污點(diǎn)指令緩存中取出一條污點(diǎn)指令,已污點(diǎn)指令為下標(biāo)在處理函數(shù)緩存中尋址到對(duì)應(yīng)的處理函數(shù)并調(diào)用執(zhí)行;
[0027](3-3)判斷當(dāng)前污點(diǎn)指令需要的內(nèi)存操作數(shù)地址是否已經(jīng)在ArgLog緩存中;如果已經(jīng)寫入,則轉(zhuǎn)入步驟(3-5);
[0028](3-4)等待模擬器執(zhí)行主線程將動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址寫入ArgLog緩存中;
[0029](3-5)判斷污點(diǎn)指令是否執(zhí)行完畢;如果沒有執(zhí)行完畢,則轉(zhuǎn)入步驟(3-2);
[0030](3-6)撤銷線程。
[0031]總體而言,通過本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,具有以下有益效果:
[0032]( I)模塊化的污點(diǎn)跟蹤系統(tǒng)實(shí)現(xiàn)[0033]本發(fā)明相對(duì)于傳統(tǒng)的污點(diǎn)跟蹤系統(tǒng),將污點(diǎn)更新操作和模擬器本身的動(dòng)態(tài)二進(jìn)制翻譯執(zhí)行過程視為獨(dú)立的兩個(gè)過程,從而在實(shí)現(xiàn)過程中可以以完全獨(dú)立的模塊進(jìn)行實(shí)現(xiàn),傳統(tǒng)的污點(diǎn)跟蹤系統(tǒng)需要對(duì)模擬器的內(nèi)部函數(shù)進(jìn)行大量修改,耦合性太強(qiáng)。
[0034](2)聞效的污點(diǎn)跟蹤系統(tǒng)性能
[0035]本發(fā)明設(shè)計(jì)了一套獨(dú)立的污點(diǎn)跟蹤指令,在對(duì)客戶機(jī)指令進(jìn)行反匯編的時(shí)候就產(chǎn)生對(duì)應(yīng)的污點(diǎn)指令,從而能夠基于x86指令級(jí)進(jìn)行污點(diǎn)更新操作,傳統(tǒng)的污點(diǎn)跟蹤系統(tǒng)在中間指令級(jí)進(jìn)行污點(diǎn)更新操作,導(dǎo)致大量無用的操作過程,因此本發(fā)明的污點(diǎn)跟蹤系統(tǒng)能夠獲取非常聞的污點(diǎn)跟蹤性能。
[0036](3)提聞目標(biāo)系統(tǒng)和用戶交互體驗(yàn)
[0037]污點(diǎn)指令的執(zhí)行是由獨(dú)立的線程進(jìn)行執(zhí)行,達(dá)到和目標(biāo)系統(tǒng)運(yùn)行的主線程并行執(zhí)行的效果,可以提高在模擬器中運(yùn)行的系統(tǒng)對(duì)用戶的交互體驗(yàn)。傳統(tǒng)的污點(diǎn)跟蹤系統(tǒng)污點(diǎn)傳播的代碼和主線程的執(zhí)行代碼混合,將會(huì)嚴(yán)重影響系統(tǒng)運(yùn)行時(shí)和用戶的交互。。
【專利附圖】
【附圖說明】
[0038]圖1為本發(fā)明對(duì)模擬器動(dòng)態(tài)二進(jìn)制翻譯過程的擴(kuò)展流程示意圖;
[0039]圖2為本發(fā)明設(shè)計(jì)的污點(diǎn)指令格式示意圖;
[0040]圖3為本發(fā)明反匯編客戶操作系統(tǒng)指令生成污點(diǎn)指令的流程圖;
[0041]圖4為本發(fā)明編譯污點(diǎn)指令生成宿主機(jī)執(zhí)行代碼的流程圖;
[0042]圖5為本發(fā)明執(zhí)行污點(diǎn)指令的流程圖。
【具體實(shí)施方式】
[0043]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
[0044]本發(fā)明針對(duì)x86指令和污點(diǎn)跟蹤操作設(shè)計(jì)了一套簡單的污點(diǎn)跟蹤指令集,同時(shí)修改模擬器的動(dòng)態(tài)二進(jìn)制翻譯流程,在對(duì)客戶操作系統(tǒng)進(jìn)行動(dòng)態(tài)二進(jìn)制翻譯生成宿主機(jī)代碼執(zhí)行的過程中同步生成一套虛擬的污點(diǎn)跟蹤指令集并執(zhí)行,用以完成污點(diǎn)跟蹤操作。本發(fā)明將污點(diǎn)跟蹤操作視為一個(gè)獨(dú)立的過程,和模擬器的動(dòng)態(tài)二進(jìn)制翻譯過程獨(dú)立,最終在執(zhí)行的過程中和模擬器原本的執(zhí)行過程也是完全獨(dú)立,可以在不同的線程上執(zhí)行,從而進(jìn)一步提高污點(diǎn)跟蹤系統(tǒng)的性能。整個(gè)過程如圖1所示,圖中右邊部分為模擬器本身的翻譯過程,首先對(duì)客戶操作系統(tǒng)的代碼塊(x86)進(jìn)行反匯編生成中間指令(TCG),然后將中間指令進(jìn)一步編譯成宿主機(jī)上運(yùn)行的指令(x86),最后由QEMU的執(zhí)行線程去執(zhí)行最終翻譯好的指令塊。在這個(gè)過程中,本發(fā)明添加了圖中左邊所示的流程,在模擬器反匯編客戶操作系統(tǒng)生成中間指令的同時(shí),本發(fā)明針對(duì)客戶操作系統(tǒng)的x86指令生成污點(diǎn)跟蹤指令(taintinstruction),這些污點(diǎn)跟蹤指令的功能是負(fù)責(zé)進(jìn)行對(duì)應(yīng)的污點(diǎn)更新操作。然后對(duì)生成的污點(diǎn)跟蹤指令進(jìn)行編譯生成宿主機(jī)執(zhí)行的代碼,最后通過開辟新的線程去執(zhí)行生成的宿主機(jī)代碼完成污點(diǎn)跟蹤操作。
[0045]下面詳細(xì)講述本發(fā)明針對(duì)x86指令設(shè)計(jì)的用于完成污點(diǎn)更新操作的污點(diǎn)指令。污點(diǎn)更新操作是數(shù)據(jù)流跟蹤系統(tǒng)的關(guān)鍵操作,通過對(duì)系統(tǒng)執(zhí)行過程中的指令流進(jìn)行分析,能夠知道污點(diǎn)標(biāo)記在系統(tǒng)中的傳播過程,比如對(duì)于x86指令mov%ebx, %eax,這條指令將會(huì)導(dǎo)致eax寄存器的污點(diǎn)標(biāo)志傳播到ebx寄存器中。污點(diǎn)更新操作就是完成污點(diǎn)標(biāo)志更新的過程。對(duì)于x86指令集,污點(diǎn)更新操作可以總結(jié)為兩種,一種是設(shè)置(set)操作,另一種是合并(merge)操作。Set操作把目的操作數(shù)的污點(diǎn)標(biāo)記設(shè)置成源操作數(shù)的污點(diǎn)標(biāo)記,比如對(duì)于上面的這條mov指令,就是屬于set操作,即Set (dst=ebx, src=eax)。Merge操作將會(huì)合并源操作數(shù)的污點(diǎn)標(biāo)記和目的操作數(shù)的污點(diǎn)標(biāo)記。比如對(duì)于add%eax, %ebx指令。同時(shí)在x86指令集中存在大量條件指令和REP指令,因此總結(jié)taint opcode有6種操作。分別為設(shè)置(Set)、合并(Merge)、條件設(shè)置(CondSet)、條件合并(CondMerge)、重復(fù)設(shè)置(RepSet)、重復(fù)合并(RepMerge),對(duì)于這6種操作,在污點(diǎn)指令中通過OxOO到0x05進(jìn)行編碼。
[0046]除了 opcode之外,污點(diǎn)指令還包括需要進(jìn)行污點(diǎn)標(biāo)記更新的源操作數(shù)和目的操作數(shù),污點(diǎn)指令格式如圖2所示。Opcode占4個(gè)bit,源操作數(shù)和目的操作數(shù)分別占6個(gè)bit。最后還有一個(gè)16個(gè)bit的ArgLogPos字段。
[0047]對(duì)于x86中的涉及到內(nèi)存尋址的指令,在靜態(tài)反匯編的過程中無法獲取到內(nèi)存操作數(shù)的地址,比如push%ebX指令,這條指令將ebx寄存器壓入內(nèi)存堆棧中,對(duì)于污點(diǎn)更新操作來說,需要更新由esp指定的堆棧內(nèi)存的污點(diǎn)標(biāo)記為ebx寄存器的污點(diǎn)標(biāo)記,但是在靜態(tài)反匯編過程中,是不能得到esp寄存器中的值,也就是在靜態(tài)反匯編過程中獲取不到堆棧內(nèi)存的地址。本發(fā)明通過在污點(diǎn)指令中添加ArgLogPos字段解決這個(gè)問題。首先修改模擬器的動(dòng)態(tài)二進(jìn)制翻譯執(zhí)行模塊,在系統(tǒng)運(yùn)行過程中動(dòng)態(tài)獲取到esp寄存器的值,然后預(yù)先開辟一塊共享緩沖區(qū)ArgLog,動(dòng)態(tài)獲取的esp寄存器值寫入該共享緩沖區(qū)中,當(dāng)污點(diǎn)指令在執(zhí)行時(shí),從該共享緩沖區(qū)中就能夠獲取到之前保存的esp寄存器的值,污點(diǎn)指令中的ArgLogPos用于指定當(dāng)前污點(diǎn)指令需要的動(dòng)態(tài)獲取的參數(shù)在共享緩沖區(qū)中的地址。
[0048]每一條污點(diǎn)跟蹤指令固定為4個(gè)字節(jié),在執(zhí)行時(shí)從翻譯好的指令緩存中逐條讀取出污點(diǎn)指令,調(diào)用對(duì)應(yīng)的處理函數(shù)進(jìn)行污點(diǎn)指令的“執(zhí)行”,由單獨(dú)的線程負(fù)責(zé)污點(diǎn)跟蹤指令的執(zhí)行,從而完成污點(diǎn)更新操作。
[0049]本發(fā)明采用一種優(yōu)化的數(shù)據(jù)流跟蹤機(jī)制提高基于模擬器的數(shù)據(jù)流跟蹤系統(tǒng)的性能,通過對(duì)模擬器的動(dòng)態(tài)二進(jìn)制翻譯執(zhí)行過程進(jìn)行面向數(shù)據(jù)流跟蹤的優(yōu)化和修改實(shí)現(xiàn)。主要體現(xiàn)在三個(gè)階段:1、對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的階段2、編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段3、最終代碼執(zhí)行的階段。
[0050]對(duì)于第一階段,如圖3所示,主要步驟如下:
[0051](1-1)取出客戶操作系統(tǒng)的一條指令進(jìn)行反匯編。
[0052](1-2)判斷當(dāng)前客戶操作系統(tǒng)的指令是否會(huì)產(chǎn)生污點(diǎn)傳播。如果不會(huì)產(chǎn)生污點(diǎn)傳播,則轉(zhuǎn)入步驟(1-6)。
[0053](1-3)判斷當(dāng)前客戶操作系統(tǒng)的指令是否包括內(nèi)存操作數(shù),即是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)的地址。如果沒有包括內(nèi)存操作數(shù),則轉(zhuǎn)入步驟(5)。
[0054](1-4)在ArgLog共享緩存中分配一塊空間,用于后面保存動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址,將該空間在ArgLog中的地址寫入污點(diǎn)指令的ArgLogPos字段中。
[0055](1-5)分析客戶操作系統(tǒng)的指令,編碼污點(diǎn)指令的opcode,源操作數(shù)和目的操作數(shù)字段。[0056](1-6)判斷當(dāng)前客戶操作是否還有指令需要進(jìn)行翻譯。如果還有指令需要進(jìn)行翻譯,則轉(zhuǎn)入步驟(1-1)。
[0057](1-7)結(jié)束。
[0058]本階段在模擬器對(duì)客戶操作系統(tǒng)x86指令進(jìn)行反匯編的同時(shí),產(chǎn)生對(duì)應(yīng)的污點(diǎn)指令,每一條污點(diǎn)指令固定編碼為4個(gè)字節(jié),包含了需要進(jìn)行的污點(diǎn)更新操作。通過這種方式,一方面實(shí)現(xiàn)在x86指令級(jí)進(jìn)行污點(diǎn)跟蹤,避免在中間指令級(jí)進(jìn)行帶來的大量無用污點(diǎn)跟蹤操作;另一方面,通過開辟新線程執(zhí)行污點(diǎn)指令,實(shí)現(xiàn)污點(diǎn)更新操作和模擬器主線程的分離,達(dá)到并行化地執(zhí)行污點(diǎn)更新。
[0059]對(duì)于第二階段,如圖4所示,主要步驟如下:
[0060](2-1)從第一階段生成的污點(diǎn)指令緩存中取出一條污點(diǎn)指令。
[0061](2-2)判斷當(dāng)前污點(diǎn)指令是否存在處理函數(shù)。如果已經(jīng)存在處理函數(shù),則轉(zhuǎn)入步驟(2-6)。
[0062](2-3)判斷當(dāng)前污點(diǎn)指令是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)地址。如果不需要,則轉(zhuǎn)入步驟(2-5)。
[0063](2-4)通知模擬器后端編譯TCG模塊,在運(yùn)行過程中動(dòng)態(tài)獲取需要的內(nèi)存操作數(shù)地址寫入ArgLog指定的共享內(nèi)存中。
[0064](2-5)在處理函數(shù)代碼緩存中為污點(diǎn)指令編譯對(duì)應(yīng)的處理函數(shù)
[0065](2-6)判斷是否還有污點(diǎn)指令需要進(jìn)行處理。如果有,則轉(zhuǎn)入步驟(2-1)。
[0066](2-7)結(jié)束。
[0067]本步驟在模擬器對(duì)中間指令進(jìn)行編譯產(chǎn)生宿主機(jī)指令的同時(shí),對(duì)污點(diǎn)指令也進(jìn)行編譯,取出每一條污點(diǎn)指令,檢查污點(diǎn)指令是否有對(duì)應(yīng)的污點(diǎn)指令處理函數(shù),如果沒有,在污點(diǎn)指令處理函數(shù)緩存中動(dòng)態(tài)為其生成。通過采用動(dòng)態(tài)生成和緩存的方式對(duì)污點(diǎn)指令進(jìn)行編譯生成對(duì)應(yīng)的處理函數(shù),能夠?qū)ο到y(tǒng)的空間和時(shí)間要求進(jìn)行平衡。如果采用靜態(tài)為所有污點(diǎn)指令編寫對(duì)應(yīng)處理函數(shù)的方式,污點(diǎn)指令處理函數(shù)代碼將會(huì)占用系統(tǒng)可執(zhí)行文件空間,同時(shí)運(yùn)行時(shí)加載進(jìn)內(nèi)存占用系統(tǒng)內(nèi)存空間。另一方面,動(dòng)態(tài)生成處理函數(shù),能夠減小最終可執(zhí)行文件大小和減少運(yùn)行時(shí)對(duì)系統(tǒng)的內(nèi)存要求,系統(tǒng)在運(yùn)行時(shí)并非所有的污點(diǎn)指令都會(huì)產(chǎn)生,只有產(chǎn)生的污點(diǎn)指令才需要有對(duì)應(yīng)的處理函數(shù)。但是動(dòng)態(tài)生成會(huì)帶來額外的生成開銷,通過采用緩存的方式,能夠避免重復(fù)地生成相同的污點(diǎn)指令處理函數(shù)。
[0068]對(duì)于第三階段,如圖5所示,主要步驟如下:
[0069](3-1)創(chuàng)建新的線程,調(diào)用污點(diǎn)跟蹤執(zhí)行函數(shù)去執(zhí)行污點(diǎn)跟蹤指令。
[0070](3-2)線程在執(zhí)行過程中,從污點(diǎn)指令緩存中取出一條污點(diǎn)指令,已污點(diǎn)指令為下標(biāo)在處理函數(shù)緩存中尋址到對(duì)應(yīng)的處理函數(shù)并調(diào)用執(zhí)行。
[0071](3-3)判斷當(dāng)前污點(diǎn)指令需要的內(nèi)存操作數(shù)地址是否已經(jīng)在ArgLog緩存中。如果已經(jīng)寫入,則轉(zhuǎn)入步驟(3-5)。
[0072](3-4)等待模擬器執(zhí)行主線程將動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址寫入ArgLog緩存中。
[0073](3-5)判斷污點(diǎn)指令是否執(zhí)行完畢。如果沒有執(zhí)行完畢,則轉(zhuǎn)入步驟(3-2)。
[0074](3-6)撤銷線程。
[0075](3-7)結(jié)束。
[0076]本階段在模擬器執(zhí)行動(dòng)態(tài)翻譯過后的代碼的同時(shí),開辟新的執(zhí)行線程,去執(zhí)行污點(diǎn)指令,污點(diǎn)指令的執(zhí)行過程,即逐條取出污點(diǎn)指令,調(diào)用對(duì)應(yīng)的污點(diǎn)指令處理函數(shù)。因?yàn)槲埸c(diǎn)指令為固定大小的4個(gè)字節(jié),因此預(yù)先分配一塊內(nèi)存數(shù)組,記錄所有污點(diǎn)指令的污點(diǎn)處理函數(shù)地址,只需要以污點(diǎn)指令為下標(biāo),就能夠在這個(gè)數(shù)組中快速定位到對(duì)應(yīng)的污點(diǎn)處理函數(shù)地址并調(diào)用。數(shù)組中的處理函數(shù)地址由上一階段生成處理函數(shù)時(shí)進(jìn)行填入。采用新的線程執(zhí)行污點(diǎn)指令,能夠和模擬器主線程并行執(zhí)行,由于污點(diǎn)指令執(zhí)行過程中進(jìn)行污點(diǎn)傳播更新操作,而這些更新操作往往會(huì)占用大量的CPU運(yùn)行時(shí)間。因此和模擬器主線程并行處理時(shí),不會(huì)影響主線程和用戶交互的體驗(yàn),同時(shí)在多核系統(tǒng)中,新的線程在獨(dú)立的CPU中運(yùn)行,達(dá)到真正的并行執(zhí)行,性能會(huì)更進(jìn)一步提升。
[0077]本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種數(shù)據(jù)流跟蹤方法,其特征在于,該方法基于模擬器進(jìn)行數(shù)據(jù)流跟蹤的優(yōu)化,包括對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的階段、編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段和最終代碼執(zhí)行的階段,其中: 在對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的階段,模擬器對(duì)客戶操作系統(tǒng)指令進(jìn)行反匯編的同時(shí)產(chǎn)生污點(diǎn)指令,污點(diǎn)指令為特定的編碼形式,固定大小為4個(gè)字節(jié),包括操作碼(opcode)、源操作數(shù)、目的操作數(shù)以及ArgLogPos字段; 在編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段,對(duì)之前產(chǎn)生的污點(diǎn)指令進(jìn)行編譯產(chǎn)生宿主機(jī)上運(yùn)行的指令,每一個(gè)污點(diǎn)指令對(duì)應(yīng)于一個(gè)處理函數(shù),用于執(zhí)行該污點(diǎn)指令代表的污點(diǎn)更新操作; 在最終代碼執(zhí)行階段,開啟新的線程執(zhí)行污點(diǎn)指令,進(jìn)行污點(diǎn)跟蹤的操作,執(zhí)行的過程就是逐條取出污點(diǎn)指令并調(diào)用污點(diǎn)指令處理函數(shù)。
2.根據(jù)權(quán)利要求1所述的數(shù)據(jù)流跟蹤方法,其特征在于,在所述客戶操作系統(tǒng)指令進(jìn)行反匯編的階段,具體進(jìn)行如下操作: (1-1)取出客戶操作系統(tǒng)的一條指令進(jìn)行反匯編; (1-2)判斷當(dāng)前客戶操作系統(tǒng)的指令是否會(huì)產(chǎn)生污點(diǎn)傳播;如果不會(huì)產(chǎn)生污點(diǎn)傳播,則轉(zhuǎn)入步驟(1-6); (1-3)判斷當(dāng)前客戶操作系統(tǒng)的指令是否包括內(nèi)存操作數(shù),即是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)的地址;如果沒有包括內(nèi)存操作數(shù),則轉(zhuǎn)入步驟(5); (1-4)在ArgLog共享緩存中分配一塊空間,用于后面保存動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址,將該空間在ArgLog中的地址寫入污點(diǎn)指令的ArgLogPos字段中; (1-5)分析客戶操作系統(tǒng)的指令,編`碼污點(diǎn)指令的opcode,源操作數(shù)和目的操作數(shù)字段; (1-6)判斷當(dāng)前客戶操作是否還有指令需要進(jìn)行翻譯;如果還有指令需要進(jìn)行翻譯,則轉(zhuǎn)入步驟(1-1)。
3.根據(jù)權(quán)利要求1或2所述的數(shù)據(jù)流跟蹤方法,其特征在于,在編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段,具體進(jìn)行如下操作: (2-1)從第一階段生成的污點(diǎn)指令緩存中取出一條污點(diǎn)指令; (2-2)判斷當(dāng)前污點(diǎn)指令是否存在處理函數(shù);如果已經(jīng)存在處理函數(shù),則轉(zhuǎn)入步驟(2-6); (2-3)判斷當(dāng)前污點(diǎn)指令是否需要?jiǎng)討B(tài)獲取內(nèi)存操作數(shù)地址;如果不需要,則轉(zhuǎn)入步驟(2-5); (2-4)通知模擬器后端編譯TCG模塊,在運(yùn)行過程中動(dòng)態(tài)獲取需要的內(nèi)存操作數(shù)地址寫入ArgLog指定的共享內(nèi)存中; (2-5)在處理函數(shù)代碼緩存中為污點(diǎn)指令編譯對(duì)應(yīng)的處理函數(shù); (2-6)判斷是否還有污點(diǎn)指令需要進(jìn)行處理;如果有,則轉(zhuǎn)入步驟(2-1)。
4.根據(jù)權(quán)利要求1至3任一項(xiàng)所述的數(shù)據(jù)流跟蹤方法,其特征在于,在編譯產(chǎn)生宿主機(jī)執(zhí)行代碼的階段,具體進(jìn)行如下操作: (3-1)創(chuàng)建新的線程,調(diào)用污點(diǎn)跟蹤執(zhí)行函數(shù)去執(zhí)行污點(diǎn)跟蹤指令; (3-2)線程在執(zhí)行過程中,從污點(diǎn)指令緩存中取出一條污點(diǎn)指令,已污點(diǎn)指令為下標(biāo)在處理函數(shù)緩存中尋址到對(duì)應(yīng)的處理函數(shù)并調(diào)用執(zhí)行; (3-3)判斷當(dāng)前污點(diǎn)指令需要的內(nèi)存操作數(shù)地址是否已經(jīng)在ArgLog緩存中;如果已經(jīng)寫入,則轉(zhuǎn)入步驟(3-5); (3-4)等待模擬器執(zhí)行主線程將動(dòng)態(tài)獲取的內(nèi)存操作數(shù)地址寫入ArgLog緩存中; (3-5)判斷 污點(diǎn)指令是否執(zhí)行完畢;如果沒有執(zhí)行完畢,則轉(zhuǎn)入步驟(3-2); (3-6)撤銷線程。
【文檔編號(hào)】G06F21/52GK103714288SQ201310733715
【公開日】2014年4月9日 申請(qǐng)日期:2013年12月26日 優(yōu)先權(quán)日:2013年12月26日
【發(fā)明者】鄒德清, 金海 , 袁勁楓 申請(qǐng)人:華中科技大學(xué)