亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

微軟Windows軟件防火墻實現技術簡述

瀏覽:32日期:2024-02-14 14:35:14

從Windows軟件防火墻的誕生開始,這種安全防護產品就在跟隨著不斷深入的黑客病毒與反黑反毒之爭,不斷的進化與升級。從最早期的只能分析來源地址,端口號以及未經處理的報文原文的封包過濾防火墻,后來出現了能對不同的應用程序設置不同的訪問網絡權限的技術;近年來由ZoneAlarm等國外知名品牌牽頭,還開始流行了具有未知攻擊攔截能力的智能行為監控防火墻;最后,由于近來垃圾插件和流氓軟件的盛行,很多防火墻都在考慮給自己加上攔截流氓軟件的功能。綜上,Windows軟件防火墻從開始的時候單純的一個截包丟包,堵截IP和端口的工具,發展到了今天功能強大的整體性的安全套件。

接下來本文就對一個Windows軟件防火墻應當擁有的這些組件進行一個簡要的技術介紹。

封包過濾技術

封包過濾技術是最原始的防火墻所擁有的第一種功能。但是該功能簡單強大,直到現在都是任何一個防火墻必不可少的功能。

想要在網絡數據包到達應用程序之前攔截之,就要在系統的網絡協議棧上面安裝過濾鉤子。對Windows NT系列內核來說,可能安裝過濾鉤子的地方大致是這么幾個,從高層到底層排序:SPI層(早期的天網防火墻 ),AFD層(資料缺乏,尚無例子),TDI層(不少國內墻),NDIS層(ZoneAlarm,Outpost等)。越位于高層,則產品開發難度越低,但是功能越弱,越容易被攻擊者所穿越。由于NDIS層的防火墻具有功能強大,不易被穿透等優點,近來各大防火墻廠商的趨勢是選擇NDIS層來做包過濾。

目前比較流行的NDIS鉤子技術有兩種。一種是掛接ndis.sys模塊的導出函數,從而能夠在每個ndis protocol注冊的時候截獲其注冊過程,從而替換其send(packets)handler和receive(packet)handler。這個方法的缺點是在第一次安全之后無法立刻生效,必須要重起一次,而且要禁用的話,也必須重起。

2004年12月的時候,www.rootkit.com上面的一名黑客發表了一篇著名的文章:“Hooking into NDIS and TDI, part 1。這篇文章本意是為rootkit作者們提供一種掛接底層驅動實現端口重用的方法,但是這篇文章揭示了一個全新的技術:通過動態的注冊ndis假協議,可以獲得ndis protocol的鏈表地址。得到這個地址之后就能不通過重起,就能替換并監控每個ndis protocol的send(packets)handler和receive(packet)handler,并且可以動態的卸載監控模塊不需要重起。在這篇文章出現之后,很多防火墻廠商都悄悄地對自己的產品進行了升級。目前的ZoneAlarm等產品就是使用這種技術,可以在安裝后即時發揮作用。這個例子更充分的體現了,黑客和反黑技術本來就是相輔相成的,本源同一的。

這里給出一個尋找該鏈表頭的代碼例子:

該函數返回的NDIS_HANDLE就是鏈表頭地址。

NDIS_HANDLE RegisterBogusNDISProtocol(void){NTSTATUS Status = STATUS_SUCCESS;NDIS_HANDLE hBogusProtocol = NULL;NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol;NDIS_STRING ProtocolName;

NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));BogusProtocol.MajorNdisVersion = 0x04;BogusProtocol.MinorNdisVersion = 0x0;

NdisInitUnicodeString(&ProtocolName,L'BogusProtocol');BogusProtocol.Name = ProtocolName;BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive;BogusProtocol.BindAdapterHandler = dummyptbindadapt;BogusProtocol.UnbindAdapterHandler = dummyptunbindadapt;

NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

if(Status == STATUS_SUCCESS){ return hBogusProtocol;}else {#ifdef bydbgDbgPrint('ndishook:cannot register bogus protocol:%xn',Status);DbgBreakPoint();#endifreturn NULL;}}得到這個ndis protocol的鏈表后,遍歷表中的每一個ndis protocol,對于每一個ndis protocol,又各有一個鏈表,用來描述和該ndis protocol有聯系的所有ndis miniport和該ndis protocol綁定的狀態。每個這種狀態塊,叫做一個ndis open block。每個綁定的send(packets)handler和receive(packet)handler都在這個ndis open block里面。

struct _NDIS_OPEN_BLOCK{#ifdef __cplusplusNDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;#elseNDIS_COMMON_OPEN_BLOCK;#endif

#if defined(NDIS_WRAPPER)//// The stuff below is for CO drivers/protocols. This part is not allocated for CL drivers.//struct _NDIS_OPEN_CO{....};#endif};

typedef struct _NDIS_COMMON_OPEN_BLOCK{PVOID  MacHandle; // needed for backward compatibilityNDIS_HANDLE BindingHandle; // Miniport's open contextPNDIS_MINIPORT_BLOCKMiniportHandle; // pointer to the miniportPNDIS_PROTOCOL_BLOCKProtocolHandle; // pointer to our protocolNDIS_HANDLE ProtocolBindingContext;// context when calling ProtXX funcsPNDIS_OPEN_BLOCKMiniportNextOpen;  // used by adapter's OpenQueuePNDIS_OPEN_BLOCKProtocolNextOpen;  // used by protocol's OpenQueueNDIS_HANDLE MiniportAdapterContext; // context for miniportBOOLEAN Reserved1;BOOLEAN Reserved2;BOOLEAN Reserved3;BOOLEAN Reserved4;PNDIS_STRINGBindDeviceName;KSPIN_LOCK Reserved5;PNDIS_STRINGRootDeviceName;

//// These are referenced by the macros used by protocols to call.// All of the ones referenced by the macros are internal NDIS handlers for the miniports//union{SEND_HANDLERSendHandler;WAN_SEND_HANDLERWanSendHandler;};TRANSFER_DATA_HANDLER  TransferDataHandler;

//// These are referenced internally by NDIS//SEND_COMPLETE_HANDLER  SendCompleteHandler;TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;RECEIVE_HANDLER ReceiveHandler;RECEIVE_COMPLETE_HANDLERReceiveCompleteHandler;WAN_RECEIVE_HANDLER WanReceiveHandler;REQUEST_COMPLETE_HANDLERRequestCompleteHandler;

//// NDIS 4.0 extensions//RECEIVE_PACKET_HANDLER ReceivePacketHandler;SEND_PACKETS_HANDLERSendPacketsHandler;

//// More Cached Handlers//RESET_HANDLER  ResetHandler;REQUEST_HANDLER RequestHandler;RESET_COMPLETE_HANDLER ResetCompleteHandler;STATUS_HANDLER StatusHandler;STATUS_COMPLETE_HANDLER StatusCompleteHandler;#if defined(NDIS_WRAPPER)....#endif

} NDIS_COMMON_OPEN_BLOCK;

需要處理的,是ndis open block里面的SendHandler,ReceiveHandler,WanReceiveHandler,ReceivePacketHandler和SendPacketsHandler。

一定要注意的是,不同于很多文章中的描述,主要處理SendHandler和ReceiveHandler,正確的應該是主要處理ReceivePacketHandler和SendPacketsHandler,現在的主流網卡和系統驅動,都是使用后面兩者。

應用程序訪問網絡控制

以往的防火墻只能古板的允許或者禁止整個系統去訪問網絡上的目標,比如允許了系統可以訪問外網的http端口,就允許了所有進程,不能只控制IE等幾個進程有權這樣做。該技術的出現解決了這個問題,對每個陌生的進程都會詢問客戶是否允許訪問網絡,因此還有一定的查殺未知木馬病毒的能力。

由于NDIS里面的那些send/receive handler全都是由tdi緩沖之后再調用的,運行的上下文全都是kernel,并且不保存原先進行tdi操作的進程號,因此在封包過濾的NDIS鉤子層次無法取得進行操作的進程ID。想要解決應用程序訪問網絡控制的問題,就需要在tdi或者更高的層次上使用鉤子。一般來說,主流是使用tdi鉤子,在進程的網絡調用棧進行到tdi的TDI_CONNECT,TDI_LISTEN,TDI_RECEIVE,TDI_SET_EVENT_HANDLER等調用時,進行進程判斷和提示。

對于winsock的應用程序來說,最重要的是主動連接請求,TDI_CONNECT;接受連接請求,TDI_SET_EVENT_HANDLER中的TDI_EVENT_CONNECT。對于udp收發,還要處理TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM請求。這個時候,直接PsGetCurrentProcessId就可以得到進程號。

tdi鉤子有一個問題,就是對于TDI_SET_EVENT_HANDLER的hook,很可能不能及時發揮作用,必須要重起以后。由于不像ndis鉤子需要hook系統函數或者修改系統數據結構,tdi鉤子可以直接使用微軟提供的過濾器驅動程序接口,在安裝編寫上要比ndis鉤子簡單的多,IoAttachDeviceToDeviceStack就可以了。

給出一段detour的tdi的dispatch routine的代碼:

NTSTATUS hook_disp(IN PDEVICE_OBJECT parampdrvob, IN PIRP irp){....

case IRP_MJ_INTERNAL_DEVICE_CONTROL:switch(irpsp->MinorFunction){///原來想得要監控的幾個似乎afd并不使用,而是用set event handlercase TDI_LISTEN:#ifdef bydbgDbgPrint('bytdiflt:TDI_LISTEN traped.should caused by kmd other than AFD.n');

#endifstat=gettcpportbyfile(irpsp->FileObject);#ifdef bydbgDbgPrint('bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********n',stat);#endifif(stat==0 || stat==-1){break;}//non-tcp or internal errorif(denyport[(unsigned short)stat]==1)//直接失敗請求{#ifdef bydbgDbgPrint('bytdiflt:*********port %d blocked!!*********n',stat);//DbgBreakPoint();#endifstat=STATUS_ACCESS_VIOLATION;irp->IoStatus.Status=stat; irp->IoStatus.Information=0;IoCompleteRequest(irp, IO_NO_INCREMENT);

return stat;}break;

case TDI_RECEIVE:#ifdef bydbgDbgPrint('bytdiflt:TDI_RECEIVE traped.should caused by kmd other than AFD.n');//DbgBreakPoint();#endifbreak;case TDI_SET_EVENT_HANDLER:#ifdef bydbgDbgPrint('bytdiflt:TDI_SET_EVENT_HANDLER traped.req local_node:%xn',irpsp->FileObject);DbgPrint('TDI_SET_EVENT_HANDLER EventType:%d EventHandler:%x EventContext:%xn',((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType,((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventHandler,((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventContext);#endifswitch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType){case TDI_EVENT_CONNECT:tmpstrptr='TDI_EVENT_CONNECT';stat=gettcpportbyfile(irpsp->FileObject);#ifdef bydbgDbgPrint('bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********n',stat);#endifif(stat==0 || stat==-1){break;}//non-tcp or internal errorif(denyport[(unsigned short)stat]==1)//完成請求但不做事情{#ifdef bydbgDbgPrint('bytdiflt:*********port %d blocked!!*********n',stat);//DbgBreakPoint();#endifstat=STATUS_SUCCESS;irp->IoStatus.Status=stat; irp->IoStatus.Information=0;IoCompleteRequest(irp, IO_NO_INCREMENT);return stat;}break;

case TDI_EVENT_RECEIVE:tmpstrptr='TDI_EVENT_RECEIVE';break;case TDI_EVENT_CHAINED_RECEIVE:tmpstrptr='TDI_EVENT_CHAINED_RECEIVE';break;case TDI_EVENT_RECEIVE_EXPEDITED:tmpstrptr='TDI_EVENT_RECEIVE_EXPEDITED';break;case TDI_EVENT_CHAINED_RECEIVE_EXPEDITED:tmpstrptr='TDI_EVENT_CHAINED_RECEIVE_EXPEDITED';break;case TDI_EVENT_RECEIVE_DATAGRAM:tmpstrptr='TDI_EVENT_RECEIVE_DATAGRAM';break;

default:tmpstrptr='Other TDI_EVENT';break;}#ifdef bydbgDbgPrint('EventType is:%sn',tmpstrptr);#endifbreak;case TDI_CONNECT://處理主動外出連接stat=gettcpportbyfile(irpsp->FileObject);#ifdef bydbgif(stat==0 || stat==-1)//non-tcp or internal error{DbgPrint('bytdiflt:**********TDI_CONNECT local port UNKNOWN.***********n');}else{DbgPrint('bytdiflt:**********TDI_CONNECT local port:%d.************n',stat);}//DbgBreakPoint();#endifbreak;

....

PsGetCurrentProcessId....//判斷進程號

....}智能行為監控

隨著防火墻的發展,現在的ZoneAlarm,Kaspersky等都發展成了所謂的“安全套件”,能夠多方位的保護用戶的系統。查殺未知的病毒和木馬是所有防火墻廠商都非常注視的一環。在目前來說,查殺未知病毒木馬,最行之有效的方法,就是類似于ZoneAlarm,Karpasky Internet Security,Mcafee,System Safety Monitor等安全工具的智能行為監控手段。實踐證明,這種智能行為監控針對未知的惡意軟件有著強大的殺傷力。例如,灰鴿子無論如何加殼變形,能夠躲過殺毒軟件的查殺,也不能逃避ZoneAlarm的智能行為監控;很多地下流傳的沒有公開的木馬,放上去安裝,在安裝過程中也一樣會報警;甚至很多0day overflow exploit在執行過程中就會報警。可以說,這個可能是目前最有前景的防火墻新技術。

例如,一個智能行為監控模塊,可以監控以下進程行為,并且判定為惡意軟件或者提示用戶,讓用戶選擇是否允許:

把自己注冊成每次開機自動啟動;

裝載可疑的內核驅動程序;

注冊未知的新服務;

修改或者替換系統重要文件;

使用raw_socket接口;

可疑的word宏或者腳本;

可疑的郵件附件例如可執行程序;

安裝windows消息鉤子;

創建遠程線程到其他程序;

創建受控制的傀儡進程;

對系統API的請求來源代碼和數據區在同一區域;

監控上述的這些行為,全部都可以使用系統鉤子,消息鉤子和API鉤子等技術來實現,洗劫這里就不詳細談了,熟悉hook的技術人員都應該知道怎么做了。

反流氓軟件技術

目前的信息安全領域,由于病毒的不可控性和黑客的技術門檻提高,黑客攻擊和病毒攻擊均有大幅度減少的趨勢。但是一種新型的安全威脅卻在日益的發展壯大,這種很不同于傳統病毒的安全威脅,就是從開始就徹底的有明確商業目的的流氓軟件。這種軟件為了自己的商業利益,不惜犧牲客戶的權益,強行在客戶的瀏覽器上安裝,駐留系統,強制制止用戶卸載或者刪除自己。這類軟件也帶來了非常大的麻煩,經常性地彈出廣告頁面,篡改用戶瀏覽器主頁,篡改用戶瀏覽器搜索引擎,降低用戶系統性能,更嚴重的是很多設計低劣的流氓軟件會讓用戶的系統變得很不穩定,經常性的死機和重起。大量的防火墻客戶對流氓軟件深惡痛絕,希望防火墻能夠在流氓軟件安裝的時候能夠提示客戶,給客戶一個選擇的機會。因此這也成了新一代防火墻應該擁有的功能模塊。

由于流氓軟件不同于一般病毒木馬,有著強大的商業支持,升級換代非常快,并且礙于各方面的影響,防火墻和殺毒軟件不好將其作為病毒木馬來查殺,否則可能會引起法律和商業等背景關系上面的很多問題,所以比較好的一個選擇,就是防火墻廠商使用行為監控方法來提示用戶流氓軟件的安裝。

流氓軟件除了擁有普通木馬或病毒的以下幾個特征,

把自己注冊成每次開機自動啟動;

裝載可疑的內核驅動程序;

注冊未知的新服務;

之外,還有一個很重要的特征就是劫持瀏覽器。以下的為了避免麻煩,均不舉軟件實例。

HKLMSoftwareMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects,這個被叫做BHO插件的東西,是最多流氓軟件和ie插件的棲身之所,監控這個健值是最重要的;

HKCUSoftwareMicrosoftInternet ExplorerUrlSearchHooks,這個健值可用來劫持搜索引擎;

HKLMSoftwareMicrosoftInternet ExplorerToolbar,很多瀏覽器插件也會注冊在這里;

HKCUSoftwareMicrosoftInternet ExplorerExplorer BarsHKLMSoftwareMicrosoftInternet ExplorerExplorer BarsHKCUSoftwareMicrosoftInternet ExplorerExtensionsHKLMSoftwareMicrosoftInternet ExplorerExtensions這四個鍵值也有流氓插件鉆入的可能。

HKLMSOFTWAREMicrosoftInternet ExplorerMain和HKCUSOFTWAREMicrosoftInternet ExplorerMain這兩個子目錄下面有大量的IE首頁,搜索頁面等敏感信息需要保護或者提示用戶,這里就不仔細說了。

標簽: Windows系統
主站蜘蛛池模板: 正在播放国产乱子伦视频 | 亚洲欧美偷拍自拍 | 精品国产一区二区三区在线 | 又爽又黄又无遮挡的视频美女软件 | 久久久噜噜噜www成人网 | 99www综合久久爱com | 搞黄视频在线观看 | 亚洲特一级毛片 | 日本综合欧美一区二区三区 | 亚洲性色图 | 久久99国产精品久久99果冻传媒 | 国产精品黄页在线播放免费 | 黄色大全片| 亚洲成人精品视频 | 色综合天天综合网国产成人网 | 国产精品高清在线观看 | 国自产拍在线天天更新2019 | 亚洲精品午夜一区二区 | 亚洲第一区视频 | 亚洲天天在线日亚洲洲精 | 久久精品色 | 成人黄色一级视频 | 尤物国产在线精品福利一区 | 91最新视频在线观看 | 黄色一级视频在线播放 | a级毛片免费全部播放 | 51国产视频 | 色的视频在线观看免费播放 | 国产九色在线播放 | 国产爱v| 麻豆精品国产剧情在线观看 | 美女美女高清毛片视频 | 成人毛片在线播放 | 国产成人午夜极速观看 | 99国产精品一区二区 | 午夜久久 | 宅男噜噜噜一区二区三区 | 高h猛烈做哭bl壮汉受欧美 | 达达兔午夜国产精品 | 91精品国产91久久久久 | 国产91在线 | 日本 |