趙曉華 趙樹升
摘 要:規(guī)范企業(yè)PC用戶的行為使之符合安全性、有用性的要求,借助技術(shù)手段收集用戶的行為是一種行之有效的方式。分析基于Windows內(nèi)核技術(shù),實(shí)現(xiàn)對(duì)用戶上網(wǎng)行為、進(jìn)程操作、文件的讀寫、刪除和重命名進(jìn)行收集。采用C/S架構(gòu),在服務(wù)器端文件記錄客戶端訪問的網(wǎng)站信息和進(jìn)程操作信息,方便對(duì)歷史記錄進(jìn)行查詢,完全基于內(nèi)核,無進(jìn)程也無DLL支持,可靠性和安全性高。
關(guān)鍵詞:Windows內(nèi)核;進(jìn)程操作;上網(wǎng)行為;文件行為
中圖分類號(hào):TP309 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):2096-1472(2018)-07-28-03
1 引言(Introduction)
隨著計(jì)算機(jī)在各行各業(yè)的重要性日益凸顯,如何規(guī)范工作人員的行為,提高工作效率已成為各公司機(jī)構(gòu)需要解決的問題。采用強(qiáng)有力的技術(shù)手段,實(shí)時(shí)查看用戶上網(wǎng)行為,以及用戶進(jìn)程操作,確保員工高效、安全的使用計(jì)算機(jī)。
本文基于Windows內(nèi)核技術(shù),通過采用一系列的技術(shù)手段,收集用戶上網(wǎng)、進(jìn)程,以及文件操作行為,可用于分析用戶是否有違規(guī)行為。
2 系統(tǒng)結(jié)構(gòu)(System structure)
系統(tǒng)結(jié)構(gòu)圖如圖1所示,由監(jiān)控客戶端、Windows服務(wù)器組成,一個(gè)服務(wù)器可以接收多臺(tái)PC客戶端收集的信息??蛻舳诉\(yùn)行監(jiān)控程序能夠?qū)γ總€(gè)客戶端用戶的上網(wǎng)行為進(jìn)行即時(shí)的收集。Windows服務(wù)器部署在與監(jiān)控客戶端同一局域網(wǎng),在Windows服務(wù)器上運(yùn)行管理程序。監(jiān)控客戶端程序和Windows服務(wù)器的管理服務(wù)模塊通信采用了C/S架構(gòu)。下面對(duì)這兩個(gè)功能模塊進(jìn)行簡(jiǎn)要的介紹。
(1)監(jiān)控客戶端
監(jiān)控客戶端部署在局域網(wǎng)內(nèi)需要被監(jiān)控的各計(jì)算機(jī)上,它的主要功能是收集用戶的網(wǎng)絡(luò)和進(jìn)程操作行為。
采用進(jìn)程回調(diào)方式捕獲進(jìn)程調(diào)用,記錄進(jìn)程創(chuàng)建、進(jìn)程退出等。采用基于Minifilter(Mini-Filter Installable File System文件系統(tǒng)微過濾驅(qū)動(dòng))的文件過濾技術(shù),記錄文件的打開、讀、寫、重命名操作。WFP(Windows Filtering Platform Windows過濾平臺(tái))對(duì)TCP/IP協(xié)議棧進(jìn)行全方位的過濾攔截,接收發(fā)送的TCP數(shù)據(jù)包,分析用戶的網(wǎng)絡(luò)行為。
為了防止客戶端監(jiān)控程序被非法關(guān)閉或異常退出,系統(tǒng)采用一系列自我保護(hù)措施。包括注冊(cè)表回調(diào)防止刪除注冊(cè)表啟動(dòng)項(xiàng)、基于IRP((I/O Request Package)的獨(dú)占方式打開程序、防止加載專業(yè)工具刪除監(jiān)控程序。
(2)服務(wù)器端
維護(hù)所有客戶端監(jiān)控程序的工作狀態(tài),采用內(nèi)核TDI(Transport Driver Interface傳輸層接口)將客戶端收集到的網(wǎng)絡(luò)和進(jìn)程操作行為記錄到文件,方便對(duì)歷史記錄查詢。
3 相關(guān)技術(shù)概述(Overview of related technologies)
3.1 進(jìn)程回調(diào)
采用進(jìn)程回調(diào)記錄進(jìn)程創(chuàng)建、退出等操作。當(dāng)一個(gè)進(jìn)程被創(chuàng)建或者刪除時(shí),一系列的例程將會(huì)被調(diào)用。PsSetCreateProcessNotifyRoutine進(jìn)程回調(diào)函數(shù)的原型如下:NTSTATUS PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
IN BOOLEAN Remove
);
其中,NotifyRoutine表示例程函數(shù)的入口地址,Remove為FALSE時(shí),添加例程到鏈表,為TRUE時(shí),從鏈表中刪除該例程。
PCREATE_PROCESS_NOTIFY_ROUTINE為回調(diào)指針,聲明如下:
VOID(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
ParentId和ProcessId用于確定進(jìn)程,Create參數(shù)表明進(jìn)程是創(chuàng)建還是刪除。當(dāng)Create為True時(shí),例程在新創(chuàng)建的進(jìn)程的初始化線程被創(chuàng)建后被調(diào)用。當(dāng)Create為False時(shí),例程在進(jìn)程的最后一個(gè)線程被關(guān)閉,進(jìn)程的地址空間將被釋放時(shí)調(diào)用。當(dāng)進(jìn)程被刪除時(shí),例程運(yùn)行在進(jìn)程的最后一個(gè)線程中。
3.2 基于Minifilter的文件過濾
MiniFilter相對(duì)于傳統(tǒng)的sfilter方式,Minifilter編寫微小而簡(jiǎn)單。速度增加的同時(shí),不同軟件之間兼容性也得到了提升[1]。
(1)文件過濾中對(duì)文件的讀寫操作進(jìn)行過濾
注冊(cè)微過濾器時(shí),填寫微過濾器注冊(cè)結(jié)構(gòu)FLT_REGISTRATION,在FLT_OPERATION_REGISTRATION域中,定義文件打開、文件讀IRP_MJ_READ、文件寫IRP_MJ_WRITE、文件刪除IRP_MJ_SET_INFORMATION、文件重命名等文件操作的回調(diào)函數(shù)NPPreCreate、NPPostRead、NPPreWrite、NPPreDelete、NPPRERENAME。
(2)獲取文件操作信息
在回調(diào)函數(shù)中NPPreXXX在請(qǐng)求完成之前進(jìn)行處理,攔截請(qǐng)求本身。在回調(diào)數(shù)據(jù)包FLT_CALLBACK_DATA中包含了請(qǐng)求相關(guān)的全部信息,獲取到打開的文件名、操作的進(jìn)程號(hào)、文件路徑等等。NPPostXXX在請(qǐng)求完成之后,對(duì)返回結(jié)果進(jìn)行攔截。
3.3 基于WFP的網(wǎng)絡(luò)傳輸信息
WFP由Filter Engine(過濾引擎)、Callout Driver、Filter組成[2]。Filter Engine的內(nèi)核模式可以對(duì)TCP/IP協(xié)議棧進(jìn)行全方位的過濾攔截。Callout Driver是WFP擴(kuò)展功能的一種機(jī)制。Callout Driver由一組Callout函數(shù)組成,其中,ClassifyFn函數(shù)處理收到的網(wǎng)絡(luò)數(shù)據(jù),例如端口號(hào)、ip地址等。Filter包含過濾條件,指定過濾器的action類型、處理action的Callout。
WFP的過濾過程[3]:首先,在過濾引擎(Filter Engine)中注冊(cè)Callout,在Callout處理函數(shù)classifyFn函數(shù)中處理數(shù)據(jù)。然后,初始化Filter,為Filter添加過濾條件,指示哪些數(shù)據(jù)符合filter的要求,把數(shù)據(jù)交給Callout處理。處理網(wǎng)絡(luò)數(shù)據(jù)包的classifyFn函數(shù),函數(shù)原型如下:
VOID NTAPI classifyFn(
IN const FWPS_INCOMING_VALUES0*inFixedValues,
IN const FWPS_INCOMING_METADATA_VALUES0*inMetaValues,
IN OUT VOID*layerData,
IN const FWPS_FILTER0*filter,
IN UINT64 flowContext,
OUT FWPS_CLASSIFY_OUT0*classifyOut
);
其中,intFixedValues是指向FWPS_INCOMING_VALUES0_的結(jié)構(gòu)體
typedef struct FWPS_INCOMING_VALUES0_ {
UINT16 layerId;
UINT32 valueCount;
FWPS_INCOMING_VALUE0*incomingValue;
} FWPS_INCOMING_VALUES0;
(1)獲取網(wǎng)絡(luò)連接的端口號(hào)
TCP傳輸在FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4層建立連接,獲取建立連接的信息。
通過inFixedValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTAB-
LISHED_V4_IP_LOCAL_PORT].value.uint16獲取發(fā)送方端口。
通過inFixedValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTAB-
LISHED_V4_IP_LOCAL_ADDRESS].value.uint32獲取發(fā)送方IP。
通過inMetaValues->processId獲取進(jìn)程id。
(2)傳輸數(shù)據(jù)信息的獲取
在classifyFn處理函數(shù)中l(wèi)ayerData參數(shù)包含了要傳輸?shù)臄?shù)據(jù)。TCP數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)類型為FWPS_STREAM_CALLOUT_IO_PACKET。
streamPacket=(FWPS_STREAM_CALLOUT_IO_PACKET*)packet;
streamBuffer=streamPacket->streamData;
獲取緩沖區(qū)的內(nèi)容:
RtlCopyMemory(tmpStream,streamBuffer,streamBuffer->dataLength);
此時(shí)已經(jīng)獲取了streamBuffer中的內(nèi)容,對(duì)tmpStream進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換即可進(jìn)行數(shù)據(jù)分析。
3.4 自我保護(hù)
在服務(wù)器端、客戶端安裝exe程序執(zhí)行收集,要防止程序被修改或刪除,需要采取一系列的自我保護(hù)措施。本文采用三種方式,采用注冊(cè)表回調(diào)方式防止刪除注冊(cè)表啟動(dòng)項(xiàng),基于IRP實(shí)現(xiàn)獨(dú)占方式打開文件,防止加載專業(yè)工具刪除程序。
3.4.1 注冊(cè)表回調(diào)防止刪除注冊(cè)表啟動(dòng)項(xiàng)
內(nèi)核模式驅(qū)動(dòng)程序調(diào)用CmRegisterCallback函數(shù)注冊(cè)一個(gè)回調(diào),在配置管理每一次注冊(cè)表操作的信息都會(huì)被填充到REG_XXX_KEY_INFORMANTION結(jié)構(gòu)體里?;卣{(diào)例程能夠阻止注冊(cè)表操作[4]。
CmRegisterCallback函數(shù)原型如下:
NTKERNELAPI NTSTATUS CmRegisterCallback(
PEX_CALLBACK_FUNCTION Function,
PVOID Context,
PLARGE_INTEGER Cookie
);
其中,F(xiàn)unction是回調(diào)函數(shù)指針,Context作為回調(diào)函數(shù)的參數(shù),Cookie是回調(diào)的句柄。EX_CALLBACK_FUNCTION的原型如下:
EX_CALLBACK_FUNCTION ExCallbackFunction;
NTSTATUS ExCallbackFunction(
PVOID CallbackContext,
PVOID Argument1,
PVOID Argument2)
Argument1記錄操作類型,Argument2記錄有關(guān)操作信息的結(jié)構(gòu)指針。若已經(jīng)注冊(cè)了注冊(cè)表回調(diào),當(dāng)有刪除注冊(cè)表項(xiàng)的操作發(fā)生時(shí),Argument1為RegNtPreDeleteKey,Argument2指向一個(gè)REG_DELETE_KEY_INFORMATION結(jié)構(gòu)體的指針。此函數(shù)如果返回STATUS_SUCCESS,注冊(cè)表操作就會(huì)繼續(xù)執(zhí)行,如果返回STATUS_ACCESS_DENIED,注冊(cè)表操作就不會(huì)執(zhí)行了。
3.4.2 基于IRP的獨(dú)占方式打開程序
當(dāng)上層應(yīng)用程序操作某個(gè)設(shè)備時(shí),I/O管理器會(huì)將I/O請(qǐng)求轉(zhuǎn)化成IRP(I/O Request Package)數(shù)據(jù)結(jié)構(gòu)對(duì)象和一個(gè)IRP_STACK_LOCATION數(shù)據(jù)結(jié)構(gòu)對(duì)象數(shù)組,IRP中的CurrentStackLocation字符指向IRP_STACK_LOCATION中的某一個(gè)元素。IRP_STACK_LOCATION數(shù)組中的每一個(gè)元素由上一層驅(qū)動(dòng)負(fù)責(zé)填充。
打開文件函數(shù)原型如下:
NTSTATUS IrpCreateFile(
OUT PFILE_OBJECT*FileObject,
IN ACCESS_MASK DesiredAccess,
IN PUNICODE_STRING FilePath,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
);
其中,F(xiàn)ileObject是指向文件的指針,F(xiàn)ilePath指明文件路徑,IoStatusBlock是指向結(jié)構(gòu)體IO_STATUS_BLOCK的指針,當(dāng)打開文件時(shí),結(jié)構(gòu)體中Information值為FILE_OPENED。DesiredAccess指定訪問權(quán)限,F(xiàn)ileAttributes表明文件對(duì)象屬性,將文件屬性設(shè)置為FILE_SHARE_READ共享讀。設(shè)備和中間層驅(qū)動(dòng)一般設(shè)置ShareAccess為0,表示調(diào)用者以獨(dú)占方式打開文件。CreateDisposition指定如果文件存在或不存在時(shí)所做的操作。CreateOptions指定驅(qū)動(dòng)創(chuàng)建或者打開文件時(shí)需要應(yīng)用的選項(xiàng)。
3.4.3 防止加載專業(yè)工具刪除
專業(yè)工具強(qiáng)制刪除文件,通?;贗RP來完成的:構(gòu)造IRP,先設(shè)置文件的屬性,將SECTION_OBJECT_POINTERS結(jié)構(gòu)的DataSectionObject和ImageSectionObject兩個(gè)域清空,然后刪除文件。文件以獨(dú)占方式打開并且只共享讀,即使專業(yè)工具使用IRP也不能刪除。
3.5 基于TDI的信息上傳
基于TDI將用戶的進(jìn)程操作、網(wǎng)絡(luò)行為、文件讀寫等信息從客戶端內(nèi)核上傳服務(wù)器。TDI是一套接口的集合,這套接口連著socket和協(xié)議驅(qū)動(dòng),由協(xié)議層驅(qū)動(dòng)實(shí)現(xiàn)。傳輸?shù)牟襟E如下:
(1)建立并連接TDI
NTSTATUS OpenTDIConnection(char*szIpAddress, unsigned short Port);
szIpAddress表示服務(wù)器端ip,Port表示服務(wù)器端端口。
(2)客戶端傳輸數(shù)據(jù)、服務(wù)器端接收數(shù)據(jù)
將客戶端機(jī)器的mac地址,以及客戶端機(jī)器的網(wǎng)絡(luò)行為、文件讀寫、進(jìn)程操作等信息發(fā)送給服務(wù)器端。
unsigned long SendData(char*pData,unsigned long bufferLength);
unsigned long RecvData(char*pData,unsigned long Length);
其中,pData表示傳輸?shù)臄?shù)據(jù)指針。
4 結(jié)論(Conclusion)
網(wǎng)絡(luò)行為的結(jié)果如圖2所示。按行顯示網(wǎng)絡(luò)操作,每行內(nèi)容為網(wǎng)絡(luò)操作發(fā)生時(shí)間、進(jìn)程號(hào)、訪問的網(wǎng)絡(luò)ip、端口號(hào)、訪問的網(wǎng)址。
進(jìn)程創(chuàng)建、退出,以及文件的創(chuàng)建、讀寫操作等收集的結(jié)果如圖3所示。按行顯示操作,每行內(nèi)容為操作發(fā)生時(shí)間、標(biāo)識(shí)、操作的進(jìn)程號(hào)、文件路徑。其中,標(biāo)識(shí)有進(jìn)程PROCESS、文件寫WRITE、進(jìn)程創(chuàng)建PCREATE、文件讀READ、文件刪除DELETE等。
本文完全采用基于內(nèi)核的方式,沒有監(jiān)控程序和服務(wù)器端進(jìn)程。也無DLL支持,可靠性好、安全性高。
參考文獻(xiàn)(References)
[1] 譚文,楊瀟,邵堅(jiān)磊.寒江獨(dú)釣:Windows內(nèi)核安全編程[M].北京:電子工業(yè)出版社,2009.
[2] 黃君勝.基于WFP的終端信息泄漏監(jiān)控系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(3):315-318;326.
[3] Windows Filtering Platform[EB/OL]. https://msdn.microsoft.com/en-us/library/windows/desktop/aa366510(v=vs.85).aspx.
[4] ly(cqupt),ljh(cqupt).淺談基于CallBack的注冊(cè)表監(jiān)控和過濾技術(shù)[J].黑客防線,2009(7):82-85.
作者簡(jiǎn)介:
趙曉華(1990-),女,碩士,助教.研究領(lǐng)域:軟件開發(fā).
趙樹升(1968-),男,碩士,副教授.研究領(lǐng)域:安全操作系統(tǒng)內(nèi)核.