国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)/技術(shù)文章
文章詳情頁(yè)

微軟Windows軟件防火墻實(shí)現(xiàn)技術(shù)簡(jiǎn)述

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

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

接下來本文就對(duì)一個(gè)Windows軟件防火墻應(yīng)當(dāng)擁有的這些組件進(jìn)行一個(gè)簡(jiǎn)要的技術(shù)介紹。

封包過濾技術(shù)

封包過濾技術(shù)是最原始的防火墻所擁有的第一種功能。但是該功能簡(jiǎn)單強(qiáng)大,直到現(xiàn)在都是任何一個(gè)防火墻必不可少的功能。

想要在網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)應(yīng)用程序之前攔截之,就要在系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧上面安裝過濾鉤子。對(duì)Windows NT系列內(nèi)核來說,可能安裝過濾鉤子的地方大致是這么幾個(gè),從高層到底層排序:SPI層(早期的天網(wǎng)防火墻 ),AFD層(資料缺乏,尚無例子),TDI層(不少國(guó)內(nèi)墻),NDIS層(ZoneAlarm,Outpost等)。越位于高層,則產(chǎn)品開發(fā)難度越低,但是功能越弱,越容易被攻擊者所穿越。由于NDIS層的防火墻具有功能強(qiáng)大,不易被穿透等優(yōu)點(diǎn),近來各大防火墻廠商的趨勢(shì)是選擇NDIS層來做包過濾。

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

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

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

該函數(shù)返回的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;}}得到這個(gè)ndis protocol的鏈表后,遍歷表中的每一個(gè)ndis protocol,對(duì)于每一個(gè)ndis protocol,又各有一個(gè)鏈表,用來描述和該ndis protocol有聯(lián)系的所有ndis miniport和該ndis protocol綁定的狀態(tài)。每個(gè)這種狀態(tài)塊,叫做一個(gè)ndis open block。每個(gè)綁定的send(packets)handler和receive(packet)handler都在這個(gè)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,正確的應(yīng)該是主要處理ReceivePacketHandler和SendPacketsHandler,現(xiàn)在的主流網(wǎng)卡和系統(tǒng)驅(qū)動(dòng),都是使用后面兩者。

應(yīng)用程序訪問網(wǎng)絡(luò)控制

以往的防火墻只能古板的允許或者禁止整個(gè)系統(tǒng)去訪問網(wǎng)絡(luò)上的目標(biāo),比如允許了系統(tǒng)可以訪問外網(wǎng)的http端口,就允許了所有進(jìn)程,不能只控制IE等幾個(gè)進(jìn)程有權(quán)這樣做。該技術(shù)的出現(xiàn)解決了這個(gè)問題,對(duì)每個(gè)陌生的進(jìn)程都會(huì)詢問客戶是否允許訪問網(wǎng)絡(luò),因此還有一定的查殺未知木馬病毒的能力。

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

對(duì)于winsock的應(yīng)用程序來說,最重要的是主動(dòng)連接請(qǐng)求,TDI_CONNECT;接受連接請(qǐng)求,TDI_SET_EVENT_HANDLER中的TDI_EVENT_CONNECT。對(duì)于udp收發(fā),還要處理TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM請(qǐng)求。這個(gè)時(shí)候,直接PsGetCurrentProcessId就可以得到進(jìn)程號(hào)。

tdi鉤子有一個(gè)問題,就是對(duì)于TDI_SET_EVENT_HANDLER的hook,很可能不能及時(shí)發(fā)揮作用,必須要重起以后。由于不像ndis鉤子需要hook系統(tǒng)函數(shù)或者修改系統(tǒng)數(shù)據(jù)結(jié)構(gòu),tdi鉤子可以直接使用微軟提供的過濾器驅(qū)動(dòng)程序接口,在安裝編寫上要比ndis鉤子簡(jiǎn)單的多,IoAttachDeviceToDeviceStack就可以了。

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

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

case IRP_MJ_INTERNAL_DEVICE_CONTROL:switch(irpsp->MinorFunction){///原來想得要監(jiān)控的幾個(gè)似乎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)//直接失敗請(qǐng)求{#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)//完成請(qǐng)求但不做事情{#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://處理主動(dòng)外出連接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....//判斷進(jìn)程號(hào)

....}智能行為監(jiān)控

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

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

把自己注冊(cè)成每次開機(jī)自動(dòng)啟動(dòng);

裝載可疑的內(nèi)核驅(qū)動(dòng)程序;

注冊(cè)未知的新服務(wù);

修改或者替換系統(tǒng)重要文件;

使用raw_socket接口;

可疑的word宏或者腳本;

可疑的郵件附件例如可執(zhí)行程序;

安裝windows消息鉤子;

創(chuàng)建遠(yuǎn)程線程到其他程序;

創(chuàng)建受控制的傀儡進(jìn)程;

對(duì)系統(tǒng)API的請(qǐng)求來源代碼和數(shù)據(jù)區(qū)在同一區(qū)域;

監(jiān)控上述的這些行為,全部都可以使用系統(tǒng)鉤子,消息鉤子和API鉤子等技術(shù)來實(shí)現(xiàn),洗劫這里就不詳細(xì)談了,熟悉hook的技術(shù)人員都應(yīng)該知道怎么做了。

反流氓軟件技術(shù)

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

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

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

把自己注冊(cè)成每次開機(jī)自動(dòng)啟動(dòng);

裝載可疑的內(nèi)核驅(qū)動(dòng)程序;

注冊(cè)未知的新服務(wù);

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

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

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

HKLMSoftwareMicrosoftInternet ExplorerToolbar,很多瀏覽器插件也會(huì)注冊(cè)在這里;

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

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

標(biāo)簽: Windows系統(tǒng)
主站蜘蛛池模板: 日本亚欧乱色视频在线观看 | 免费观看一级特黄三大片视频 | 国产精品久久久久久久专区 | 国产精品国产三级国产普通 | 欧美一级毛片在线播放 | 国产三级做爰高清视频a | 老头老太做爰xxx视频 | 久久99久久精品免费思思6 | 日韩精品免费一级视频 | 国产国产人免费视频成69堂 | 国产成人mv 在线播放 | 能在线观看的一区二区三区 | 青青视频国产依人在线 | 国产播放 | 欧美日韩不卡在线 | 亚洲伊人久久综合影院2021 | 一级成人毛片 | 欧美一级毛片俄罗斯 | 久久99在线 | 欧美高清视频一区 | 成人久久久久 | 国产女人毛片 | 欧美一区二区三区久久综合 | 可以看的黄网 | 九九99re在线视频精品免费 | 欧美色成人 | 国产综合精品一区二区 | 欧美一级在线播放 | 国产精品美女一区二区三区 | 视频二区在线 | 欧美日韩国产人成在线观看 | 久久人人草 | 免费狼人久久香蕉网 | 日韩精品不卡 | 在线免费观看毛片网站 | 国产亚洲一区二区手机在线观看 | 国产色在线观看 | 国产女人伦码一区二区三区不卡 | 一级毛毛片毛片毛片毛片在线看 | 日本一级毛片片在线播放 | 成人a免费视频播放 |