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