藍智靈 宋宇波 唐 磊
(東南大學信息安全研究中心,南京 210096)
基于直接內核對象操作的進程偽裝保護方法
藍智靈 宋宇波 唐 磊
(東南大學信息安全研究中心,南京 210096)
針對目前基于隱藏的進程保護方法容易被Rootkit檢測工具檢測出而失效的情況,提出了一種基于直接內核對象操作(DKOM)的進程偽裝保護方法.該方法將進程隱藏方法中較為常用的DKOM技術與傳統的偽裝技術相結合,通過直接修改操作系統內核空間中存儲進程相關信息的數據結構,使進程在任務管理器中顯示為一些系統進程,以此達到保護進程的目的.進程信息的修改涉及內核的操作,由Windows驅動實現,該驅動兼容Windows 2000以上多個版本的操作系統,具有廣泛適用性.實驗結果顯示,經過該方法修改后,進程查看工具查看到的進程信息與正常的系統進程沒有差別.偽裝效果較好,用戶無法發覺,Rootkit檢測工具也不會提示異常.驗證了基于DKOM的進程偽裝保護方法的有效性.
直接內核對象操作;進程偽裝;進程保護
進程保護技術在信息安全領域中有著廣泛的應用.一方面惡意軟件使用進程保護技術來保護自身無法被用戶察覺,另一方面系統安全防護軟件也使用進程保護技術來保護自身不被惡意軟件破壞.
進程保護是指一般情況下,用戶不能通過非正常手段強制關閉特定進程,不能通過Windows進程管理器或一般的進程來結束特定進程[1].根據所要達到目標的不同,進程保護可分為保護進程不被非法操作關閉和保護進程不被發現2類.保護進程不被非法操作關閉的方法主要有[1-2]:Hook-API技術、DLL注入技術、遠程線程代碼注入技術以及多進程守護保護技術等;而保護進程不被發現主要采用進程隱藏技術或進程偽裝技術.本文主要研究的是第2類進程保護,即保護進程不被發現.
進程隱藏技術可以分為2類[3]:一類是基于Hook的進程隱藏技術,包括用戶模式的IAT Hook和EAT Hook技術以及內核模式的SSDT Hook技術;另一類是基于DKOM的進程隱藏技術[4].目前2種隱藏技術都有相應的檢測方法.
針對基于Hook的隱藏技術,有一種稱為“交叉視圖”[5]的方法可以用于檢測.該方法將用戶模式API獲取的進程列表與內核中獲取的進程列表進行比較,內核進程列表中多出來的進程即是被隱藏的進程,該檢測方法已被多數Rootkit檢測軟件采用.
而對于文獻[4,6]所提到的基于DKOM的進程隱藏技術,需要將被隱藏的進程從內核中的進程鏈表中移除,由于使用上述交叉視圖的檢測方法檢測不到,因而需要使用更為底層的檢測方法,如“基于線程調度”的檢測方法[7].DKOM進程隱藏技術雖然將被隱藏的進程從進程鏈表中移除,但卻不能從線程鏈表中移除,否則就得不到系統的調度,也就無法運行.因此,只需通過遍歷線程鏈表就能查找到被隱藏的進程.
除了以上方法外,還有不少其他的檢測方法,如遍歷PspCidTable表檢測方法[8]、基于執行路徑分析的檢測方法[9]以及基于虛擬機的檢測方法[10]等.可見,基于進程隱藏的保護方法并不是很有效的.
為了使保護進程不被發現,也可采用進程偽裝技術.傳統的偽裝方法主要有3種[11]:
1)程序取名為看似合法的程序,如securityupdate.exe 或 serverstart.exe.
2)程序取名與系統合法進程相似,如取名為scvhost.exe,而真實的系統進程為 svchost.exe.
3)程序取名與系統合法進程一樣,但放在非系統目錄下,如系統的svchost.exe存放于C:WindowsSystem32,而偽裝的程序 svchost.exe可以存放在C:WindowsSystem目錄下.
但對于這類方法所偽裝的進程,用戶只需在任務管理器中細心觀察就能發現.
綜上所述,上述的進程隱藏技術和進程偽裝技術對于進程保護已不是很有效,為此,本文將進程隱藏技術中較為常用的直接內核對象操作方法與傳統進程偽裝技術結合起來,提出了一種新的進程保護方法.該方法利用直接內核對象操作技術,通過修改內存中存儲進程相關信息的數據結構,包括進程名、進程路徑以及用戶名等信息,使進程在任務管理器中顯示為系統進程,從而達到偽裝進程的目的,最終實現進程保護.
操作系統中每個運行的程序,在內核中都有一些相關的結構體,保存著程序運行所需的信息,包括進程號、進程名以及可執行文件的路徑等.DKOM實現偽裝的原理就是對內核中這些結構體進行修改,使得應用層工具查看到的進程信息是修改過的信息,以此來達到偽裝的目的.
進程偽裝需要修改的信息,主要存在于下列結構體中:
上述的EPROCESS是內核中用來描述進程的結構體,它記錄著對應進程運行所需的各種信息.進程環境塊(process environment block,PEB)也記錄一些進程相關信息,EPROCESS結構中保存有指向對應PEB的地址信息.
由于DKOM技術需要對內核對象直接進行操作,而普通的用戶層程序并沒有權限對內核進行修改,所以用于實現偽裝的程序需要由驅動來實現.因為該程序不涉及即插即用之類的硬件操作,所以實現時沒有采用WDM或WDF驅動模型,而是采用NT式驅動開發.NT式驅動的安裝比較簡單,可以將驅動作為系統服務,使用Windows提供的服務管理API進行安裝和卸載.
下面假設在方案中是使用驅動C.sys把進程A.exe偽裝成B.exe.為了保證被偽裝的程序A.exe在任何時候運行都能夠被偽裝,驅動程序C.sys需要定時對進程列表進行查詢,看列表中是否有進程A.exe存在,若存在就將其相關的進程信息修改為B.exe的信息.驅動程序流程圖如圖1所示.
圖1 驅動程序流程圖
對進程進行偽裝需要先找到存儲進程信息的相關結構,而這些結構中最重要的是EPROCESS,因為其他結構都可由EPROCESS間接得到.使用微軟的Windbg調試工具對內核進行調試,可以得到EPROCESS與其他結構的關系,如圖2所示.
在EPROCESS結構體中有個成員叫ActiveProcessLinks,它是一個LIST_ENTRY結構體,這個結構有2個指針成員FLINK和BLINK,分別指向當前進程的前一個和后一個進程EPROCESS結構體中的ActiveProcessLinks成員.系統中所有進程的EPROCESS結構體通過ActiveProcessLinks成員構成了一個雙向鏈表.此外,Windows操作系統內部有個全局變量PsInitialSystemProcess,它是指向系統System進程EPROCESS結構的一個指針.因此,只要從System進程的EPROCESS結構開始,遍歷整個鏈表就能獲取所有進程的EPROCESS結構.查詢到需要被偽裝的進程的EPROCESS之后,再根據圖2所示關系,就可以找到其他所有相關的數據結構.
圖2 進程偽裝相關結構體間的關系
根據EPROCESS獲取到需要修改的數據結構后,就可以把相關信息修改為新的進程信息.這些結構 中,EPROCESS-> ImageFileName,SE_AUDIT_PROCESS_CREATION_INFO以及FileObject的修改方法一致,都是直接修改,如下所示:
但PEB結構的修改比較特殊,因為PEB結構是保存在各個進程各自的進程空間里,而不是在公共的內核空間中,在內核中是不能直接訪問的.要修改其中的數據,就必須先使用KeStackAttachProcess函數附著到相應的進程空間,修改完相關數據后,再使用KeUnstackDetachProcess函數解附著,離開相應的進程空間,實現如下:
如上所示,PEB中修改的結構包括Command-Line,ImagePathName 和 WindowTitle.
通過上述的修改,能夠實現進程名稱以及路徑信息的偽裝,但這樣還不夠全面.系統中每個運行的進程都有一個父進程,如果要把程序偽裝成svchost.exe這樣的系統進程,那就有必要把父進程修改為 svchost.exe 的父進程 services.exe.否則,即使被偽裝進程修改為svchost.exe,在進程查看器中看到該 svchost.exe的父進程不是 services.exe,仍然容易被發現有異常.要實現父進程的修改,需要修改存儲父進程號的結構EPROCESS->Inherited-FromUniqueProcessId.修改時,先通過 EPROCESS->UniqueProcessId獲取 services.exe的進程 ID,然后再填到被偽裝進程的EPROCESS->Inherited-FromUniqueProcessId結構中,就能實現父進程的修改.
另外,需要修改的信息還有進程所屬的用戶.在進程查看器中由用戶啟動的程序,用戶名一般為當前登錄系統的用戶,而系統進程的用戶名則為SYSTEM,LOCAL SERVICE或 NETWORK SERVICE等.要修改進程的用戶名,需要修改存放有用戶名信息的結構EPROCESS->Token,修改時只需將被偽裝進程的Token替換為系統進程的Token即可.
通過這些額外的修改之后,被偽裝進程與偽裝目標就更加接近,更具隱蔽性.
Windows操作系統每個內核版本的更新,都會對內核中的一些結構進行調整,主要是結構成員的變動.為了使進程偽裝適用于多個版本的操作系統,實現時使用了一些變量記錄各進程相關結構的偏移信息.在程序初始化時,先用PsGetVersion函數獲取操作系統版本信息,然后根據操作系統的主版本號和次版本號的不同,存儲各結構的偏移信息到指定的變量中.如EPROCESS->ImageFileName結構在Windows XP SP3以及Windows 7 RTM操作系統中的偏移分別是0x174和0x16C,該偏移信息就保存于EPROCESS_IMAGENAME_OFFSET變量中,之后的修改只要直接使用該變量即可.
另外,由于Windows 7操作系統中引入了DEP(data execution prevention),即數據執行保護的安全機制,在對進程PEB信息的修改時,需要在內核中先將進程的DEP標志置為0,關閉DEP保護,信息才能修改成功.
目前該測試程序支持的操作系統包括Windows 2000 SP4,Windows Server 2003 SP2,Windows XP SP3以及Windows 7 RTM.對于其他版本操作系統,只要使用Windbg進行內核調試,獲取各結構的偏移信息,就能很容易地進行擴展,支持新的操作系統.
測試環境為VMWare Workstation 7.1虛擬機.測試的操作系統包括Windows 2000 SP4,Windows Server 2003 SP2,Windows XP SP3以及 Windows 7 RTM.
測試是將操作系統自帶的記事本程序C:WindowsSystem32 otepad.exe偽裝成系統服務進程 C:WindowsSystem32svchost.exe.
查看結果采用的進程查看工具是Sysinternals公司開發的Process Explorer,該工具能查看到比系統自帶的任務管理器更為詳盡的進程信息.使用的Rootkit檢測工具是 XueTr[12],該工具可用于檢測系統中的可疑對象以及被隱藏的進程.
測試的具體步驟是:① 采用驅動加載程序加載用于實現偽裝的驅動程序;② 運行notepad.exe;③使用進程查看器Process Explorer查看進程信息,并記錄結果.為了查看各個結構影響進程的信息,測試時,先逐個修改結構,并查看結果,最后再修改全部結構,查看最終的偽裝效果.
測試時,發現各版本操作系統的測試結果是相同的.另外,實際測試時發現有些情況下,被偽裝程序的首次運行和非首次運行的結果是不同的,所以在記錄結果時,分為首次和非首次運行,如表1所示.
表1 進程信息的修改結果
從表1的測試結果可以看出,EPROCESS->ImageFileName結構并不影響進程查看器看到的進程信息.而 SeAuditProcessCreationInfo->Image-FileName和PEB->ProcessParameters分別影響進程名和路徑信息,EPROCESS->InheritedFromUniqueProcessId和EPROCESS->Token結構分別決定父進程和用戶名信息.
另外,從表中可以看出,FileObject->FileName結構比較特殊.被偽裝程序首次運行和非首次運行2種情況下,修改結構所得到的結果是不一樣的.首次運行對結構的修改并不能立即使進程名的修改生效,而經過首次修改后,被偽裝的進程只要再次運行,進程名就是svchost.exe,并不需要進行修改.這是由于操作系統會對FileObject的緩存處理,首次運行的程序被關閉后,其相應的FileObject結構并沒有被釋放,當程序再次被運行時,操作系統會直接從緩存的FileObject結構中讀取修改過的進程名信息,從而出現該結果.
從測試結果看,只需將相關的結構全部修改,就能達到較好的偽裝效果,進程查看器中看到的被偽裝程序與目標程序的信息相同.Process Explorer查看的進程信息如圖3所示,圖3(a)是notepad.exe偽裝后的進程信息,圖3(b)是正常svchost.exe的進程信息.可以看到,2個進程的信息除了Command Line有區別外,其余信息都是一樣的.Command Line信息不同,主要是為了測試時能分辨出哪個是 notepad.exe偽裝的 svchost.exe,特意將其改為svchost.exe進程的路徑.在實際的應用中,只需將其Command Line改為與svchost.exe的Command Line相同,就能保證偽裝效果.
使用XueTr分別對經過DKOM隱藏和偽裝的notepad.exe進行檢測,檢測結果如圖4所示.圖4(a)是DKOM進程隱藏方法的檢測結果,可以看到,檢測工具的狀態欄提示有一個隱藏進程,并會標出圖中進程ID為1264的notepad.exe,指示該進程被隱藏.而圖4(b)是進程偽裝方法的檢測結果,進程號為1240的 svchost.exe就是 notepad.exe經過偽裝的進程,可以看到該進程的信息與其他svchost.exe進程的信息一樣.
由測試結果可見,本文提出的基于直接內核對象操作的偽裝方法能夠實現進程保護.
圖3 偽裝后的notepad與正常svchost的信息對比
本文提出了基于DKOM的進程偽裝保護方法.經過該方法偽裝的進程,看起來就像正常的系統進程,不易被察覺.這種方法優于傳統的偽裝方法,被偽裝的程序可以存放于任何路徑,名字也可以任意選取.如果該方法結合保護進程不被關閉的技術,保護效果將會更好.當然,出現新的保護方法,就會有相應的檢測方法.隨著更多高新技術的提出,進程保護和檢測技術都會不斷向前發展.如何更全面地修改進程的相關信息,以達到更好的偽裝效果,是下一步要繼續考慮和研究的內容.
[1]張家旺.Windows系統進程安全保護技術分析和實現[C]//第十七屆全國信息保密學術會議論文集.襄樊,2007:229-235.
[2]馬金鑫,袁丁.基于Windows環境下的進程保護技術的研究與實現[J].計算機應用與軟件,2010,27(3):18-21.
Ma Jinxin,Yuan Ding.On process-protecting based on windows and its implementation[J].Computer Application and Software,2010,27(3):18-21.(in Chinese)
[3]何濤.基于Windows NT的隱藏進程檢測系統的研究與實現[D].北京:北京工業大學計算機學院,2009.
[4]Tsaur Woei Jiunn,Chen Yuh Chen.Exploring rootkit detectors'vulnerabilities using a new Windows hidden driver based rootkit[C]//2010IEEE Second International Conference on Social Computing.Minneapolis,MN,USA,2010:842-848.
[5]Fu Desheng,Zhou Shu,Cao Chenglong.A Windows rootkit detection method based on cross-view[C]//2010International Conference on E-Product E-Service and EEntertainment.Zhengzhou,China,2010:1-3.
[6]潘茂如,曹天杰.基于直接操作內核對象的進程隱藏技術研究[J].計算機工程,2010,36(18):138-140.Pan Maoru,Cao Tianjie.Research on process hiding technology based on direct kernel object manipulation[J].Computer Engineering,2010,36(18):138-140.(in Chinese)
[7]梁曉,李毅超.基于線程調度的進程隱藏檢測技術研究[J].計算機科學,2006,33(10):114-115,118.
Liang Xiao,Li Yichao.Research on thread dispatch based hidden process detection technique[J].Computer Science,2006,33(10):114-115,118.(in Chinese)
[8]周利榮,馬文龍.Windows 7遍歷PspCidTable表檢測隱藏進程[J].計算機系統應用,2011,20(9):222-225.
Zhou Lirong,Ma Wenlong.Windows 7 ergodice PspCid-Table to detect hidden processes[J].Computer Systems&Applications,2011,20(9):222-225.(in Chinese)[9]Rutkowski J K.Execution path analysis:finding kernel based rootkits[EB/OL].(2002-07-28)[2012-08-08].http://www.phrack.org/issues.html?issue=59&id=10#article.
[10]Wen Yan,Zhao Jinjing,Wang Huaimin.Implicit detection of hidden processes with a local-booted virtual machine[C]//International Conference on Information Security and Assurance.Busan,Korea,2008:150-155.
[11]Alsagoff S N.Malware self protection mechanism[C]//International Symposium on Information Technology.Kuala Lumpur,Malaysia,2008:1-8.
[12]Linxer.XueTr[EB/OL].(2011-12-03)[2012-08-08].http://www.xuetr.com/?p=25.
Novel process-protecting method using camouflage techniques based on direct kernel object manipulation
Lan Zhiling Song Yubo Tang Lei
(Information Security Research Center,Southeast University,Nanjing 210096,China)
Current process-protecting method based on process-hiding is easy to be detected by Rootkit detection tools and hence fails to protect processes.To solve this problem,a novel process-protecting method using camouflage techniques based on direct kernel object manipulation(DKOM)is proposed.This method combines DKOM techniques with traditional process-disguising techniques.To protect the process,it is made to display as a system process in the task manager by altering structures storing process information in the kernel space of the operating system.To manipulate the kernel object,the modification should be implemented by a Windows driver,which is compatible with Windows 2 000 and Subsequent versions.The experimental results show that the process information retrieved from process explorer tools is identical to the system process.The process being disguised cannot be perceived by users or detected by Rootkit detection tools.The effectiveness of this process-protecting method using camouflage techniques based on DKOM is verified.
DKOM(direct kernel object manipulation);process camouflage;process protection
TP309.5
A
1001-0505(2013)01-0024-06
10.3969/j.issn.1001-0505.2013.01.005
2012-06-09.
藍智靈(1988—),男,碩士生;宋宇波(聯系人),男,博士,副教授,songyubo@seu.edu.cn.
國家發改委信息安全專項資助項目.
藍智靈,宋宇波,唐磊.基于直接內核對象操作的進程偽裝保護方法[J].東南大學學報:自然科學版,2013,43(1):24-29.[doi:10.3969/j.issn.1001-0505.2013.01.005]