程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 微軟Windows軟件防火牆實現技術簡述

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

編輯:.NET實例教程

從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 bydbg
    DbgPrint("ndishook:cannot register bogus protocol:%x/n",

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved