最近要看各種paper 但是看的斷斷續(xù)續(xù)的,后面看前面的就忘光了(主要就是太忙……各種私人以及學(xué)習(xí)的是,不過還好申請(qǐng)弄完了 閑下來可以看看書了 哈哈),所以開個(gè)帖子把讀過的paper總結(jié)下,寫個(gè)心得吧。標(biāo)紅的是我的問題~哈哈
原文:HookFinder: Identifying and Understanding Malware Hooking Behaviors
source2download:點(diǎn)這里
引言:
這篇文章講述的內(nèi)容小有趣的說,主要介紹了一個(gè)系統(tǒng),把樣本的惡意程序放進(jìn)去能夠自動(dòng)分析出它的hook操作,包括hook了哪里,如何hook的。它結(jié)合一個(gè)特定的“虛擬機(jī)”(這么說不算太貼切 它文章里面用的是system-emulator這個(gè)詞,文章里面說這個(gè)和虛擬機(jī)不用,我估計(jì)是原理相同用途不同而已吧,后面就虛擬機(jī)這么叫吧),在物理層面它能夠獲取到程序執(zhí)行時(shí)的所有寄存器狀態(tài),在系統(tǒng)層面它能夠獲得系統(tǒng)信息,比如進(jìn)程模塊地址之類的東西,就跟windbg類似。然后通過跟蹤寄存器讀寫操作以及結(jié)合系統(tǒng)信息來檢測(cè)出程序的hook行為,它里面測(cè)試的樣例可都是kernel級(jí)別的rootkit喲,還是相當(dāng)強(qiáng)大的一個(gè)東東。
下面就開始吧,通過監(jiān)測(cè)寄存器(system-emulator提供的接口),那么我們便可以掌握內(nèi)存的讀寫情況,更犀利的是我們?nèi)绱吮憧梢员O(jiān)控所有對(duì)內(nèi)存讀寫的操作。然后通過一個(gè)叫Semantics Extrator(SE)的模塊來提取出操作系統(tǒng)層次的信息,打個(gè)比方,我捕獲到0x743292BC這個(gè)要被寫入東西,那么通過SE模塊我可以查出這個(gè)地址是系統(tǒng)內(nèi)核函數(shù)ObReferencebyPointors的函數(shù)空間,然而我又可以通過SE模塊知道我現(xiàn)在運(yùn)行的代碼段是在X驅(qū)動(dòng)模塊中的,那么顯然X驅(qū)動(dòng)就有可能是在修改系統(tǒng)代碼,正在進(jìn)行Data Hook。
聽起來很犀利哇?不過深入分析下去,還是有很多問題要解決的。多個(gè)模塊代碼都進(jìn)行了同樣的hook你又如何記錄存儲(chǔ)這些HOOK信息咧?如何實(shí)現(xiàn)自動(dòng)檢測(cè)HOOK?
那么文章中提出了設(shè)計(jì)了3個(gè)模塊(其實(shí)不止3個(gè) 我把工作相似的模塊合并了):Impact Engine,SE,Hook Detector
Impact Engine
何為impact在文中的意思就是改動(dòng),整體翻譯就是改動(dòng)檢測(cè)引擎(個(gè)人YY過來的)。這個(gè)引擎用來監(jiān)控標(biāo)記程序運(yùn)行時(shí),對(duì)系統(tǒng)內(nèi)存讀寫的動(dòng)作,以便下一步的分析。
這個(gè)引擎分2部分,Impact Marker和Impact Tracker
Impact Marker
監(jiān)控惡意代碼中的內(nèi)存讀寫分幾種情況,一種是在代碼中直接進(jìn)行內(nèi)存讀寫,另一種就是惡意代碼通過調(diào)用外部函數(shù)比如memcpy之類的來進(jìn)行內(nèi)存操作,文中主要討論了記錄外部調(diào)用的內(nèi)存操作的策略。
首先監(jiān)控內(nèi)存讀寫以及寄存器讀寫,但這2個(gè)操作是分開來處理的。對(duì)于外部函數(shù)調(diào)用讀寫內(nèi)存,我們只監(jiān)控外部變量的讀寫,至于外部變量如何判斷很簡單,查看寫入地址如否在線程堆棧的范圍內(nèi),若在則是局部變量,若不在,嘿嘿~外部變量。
那么對(duì)于寄存器讀寫的操作就顯得容易多了,因?yàn)樵趙indows系統(tǒng)下,返回值是通過eax傳遞的,文中說的是在函數(shù)開始時(shí)記錄eax的值,然后等函數(shù)結(jié)束后在比對(duì)eax的值是否與原來的一樣,如果不一樣,那么函數(shù)包含返回值則標(biāo)記之,如果不一樣,那么函數(shù)返回值是無效的。
當(dāng)然這里涉及到一個(gè)問題就是惡意代碼會(huì)動(dòng)態(tài)產(chǎn)生可執(zhí)行代碼丫,但是由于我們標(biāo)記了它內(nèi)存分配情況,那么只要在執(zhí)行時(shí)判斷下執(zhí)行的指令是否取自標(biāo)記的內(nèi)存段,若是,就認(rèn)為是惡意代碼自產(chǎn)生的可執(zhí)行代碼,然后對(duì)于這段代碼也采取同樣的監(jiān)控標(biāo)記方式來跟蹤它的輸入輸出。
Impact Tracker(IT)
這個(gè)模塊主要用來關(guān)聯(lián)這些標(biāo)記的內(nèi)存操作和內(nèi)存改動(dòng)的。如果在Impact Marker的標(biāo)記中,操作數(shù)的地址或數(shù)據(jù)是被標(biāo)記了的,則標(biāo)記上目的操作數(shù)的地址或數(shù)據(jù)。并且IT模塊對(duì)目的操作數(shù)每個(gè)標(biāo)記分配一個(gè)ID號(hào),并記錄每個(gè)ID號(hào)之間的關(guān)聯(lián),如此一來我們便可以捕獲惡意代碼對(duì)系統(tǒng)生成的改動(dòng),比如惡意代碼是如何改動(dòng)重要數(shù)據(jù)結(jié)構(gòu)的,當(dāng)然這些監(jiān)控對(duì)惡意代碼的磁盤讀寫,設(shè)備掛載,系統(tǒng)例程注冊(cè)同樣有效。因?yàn)檫@些操作的最終原理也不過是生成或改動(dòng)數(shù)據(jù)結(jié)構(gòu)而已。
Semantics Extractor
該模塊很簡單,就是從虛擬的系統(tǒng)中提取出需要的信息,比如說進(jìn)程的所有信息,線程的所有信息,驅(qū)動(dòng)模塊的所有信息等等,然后獲得這些需要的信息一般有2種方式,其一就是通過解析一些重要的數(shù)據(jù)結(jié)構(gòu)來獲得,比如EPROCESS,另一種方式就是向虛擬系統(tǒng)中插入一個(gè)模塊,在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)收集系統(tǒng)信息,主要通過設(shè)置回調(diào)函數(shù)的方式工作。比如收集進(jìn)程信息,在進(jìn)程創(chuàng)建銷毀的時(shí)候調(diào)用該模塊的處理例程等等。
此外SE模塊還負(fù)責(zé)解析函數(shù)符號(hào)名,確定是否是惡意代碼進(jìn)行的外部函數(shù)調(diào)用。主要是通過解析PE頭文件來實(shí)現(xiàn),這個(gè)就不累述了,一來我只是略懂,二來看雪上關(guān)于PE的資料我覺得已經(jīng)很透徹了~
HOOK Detector
這個(gè)模塊的判斷依據(jù)還比較簡單,判斷EIP寄存器載入的數(shù)據(jù)是否是被標(biāo)記了的,如果EIP載入了被標(biāo)記的數(shù)據(jù)(也就是說程序當(dāng)時(shí)運(yùn)行在非惡意代碼模塊的上下文,若不考慮這個(gè),則惡意代碼代碼執(zhí)行的內(nèi)部調(diào)用也會(huì)被誤判為HOOK)并且立即跳轉(zhuǎn)到了惡意代碼的模塊空間或者是惡意代碼分配的內(nèi)存空間內(nèi),則將其定義為一個(gè)HOOK。當(dāng)然這個(gè)辦法僅僅能用于數(shù)據(jù)HOOK,代碼HOOK的話還需另加討論,我們定義說如果在非惡意代碼上下文是運(yùn)行了被標(biāo)記為惡意代碼模塊的篡改數(shù)據(jù),并且EIP載入數(shù)據(jù)也被標(biāo)記并且跳轉(zhuǎn)到了惡意代碼空間,那么這就是一個(gè)代碼HOOK,然而這里又有一個(gè)問題,代碼HOOK和惡意代碼自產(chǎn)生的代碼性質(zhì)是一樣的,那么如何判斷這些被標(biāo)記的代碼是自產(chǎn)生代碼還是HOOK的數(shù)據(jù)咧?很簡單,自產(chǎn)生代碼存在的空間要么是惡意代碼模塊分配的,要么是占用了不屬于任何模塊的數(shù)據(jù)空間,而HOOK的數(shù)據(jù)肯定是覆蓋了系統(tǒng)調(diào)用的空間的,所以簡單的通過SE模塊查一下這段代碼是否在系統(tǒng)調(diào)用空間就OK了,如果是,則判斷為HOOK數(shù)據(jù),如果不是,在驗(yàn)證下是否滿足自產(chǎn)生代碼的條件。
類別:Host Security 查看評(píng)論文章來源:
http://hi.baidu.com/uestc%5Fay/blog/item/f9bae97af15009e60ad187f9.html