电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

微軟Windows軟件防火墻實現(xiàn)技術簡述

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

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

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

封包過濾技術

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

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

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

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

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

該函數(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;}}得到這個ndis protocol的鏈表后,遍歷表中的每一個ndis protocol,對于每一個ndis protocol,又各有一個鏈表,用來描述和該ndis protocol有聯(lián)系的所有ndis miniport和該ndis protocol綁定的狀態(tài)。每個這種狀態(tài)塊,叫做一個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,現(xiàn)在的主流網卡和系統(tǒng)驅動,都是使用后面兩者。

應用程序訪問網絡控制

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

由于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收發(fā),還要處理TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM請求。這個時候,直接PsGetCurrentProcessId就可以得到進程號。

tdi鉤子有一個問題,就是對于TDI_SET_EVENT_HANDLER的hook,很可能不能及時發(fā)揮作用,必須要重起以后。由于不像ndis鉤子需要hook系統(tǒng)函數(shù)或者修改系統(tǒng)數(shù)據(jù)結構,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){///原來想得要監(jiān)控的幾個似乎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....//判斷進程號

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

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

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

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

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

注冊未知的新服務;

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

使用raw_socket接口;

可疑的word宏或者腳本;

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

安裝windows消息鉤子;

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

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

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

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

反流氓軟件技術

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

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

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

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

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

注冊未知的新服務;

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

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

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

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

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

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

主站蜘蛛池模板: 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 桌上式超净工作台-水平送风超净工作台-上海康路仪器设备有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 |