青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

      旅途

      如果想飛得高,就該把地平線忘掉

      Windows下網(wǎng)絡(luò)數(shù)據(jù)報的監(jiān)聽和攔截技術(shù)

      Windows下網(wǎng)絡(luò)數(shù)據(jù)報的監(jiān)聽和攔截技術(shù)1

              Windows下網(wǎng)絡(luò)數(shù)據(jù)報的監(jiān)聽和攔截技術(shù)是一個比較古老的話題,應(yīng)用也很廣泛,例如

      防火墻等等。這篇小文只是對該技術(shù)的一個總結(jié),沒有新技術(shù),高手免看:)

              要監(jiān)聽和攔截Windows下的數(shù)據(jù)報,基本可以在兩個層次進行,一個是用戶態(tài)(user-mo

      de),一個是核心態(tài)(kernel-mode)。

              在用戶態(tài)下,從高到低大概有四種方法。

              1、原是套結(jié)字(Raw Socket)。Winsock2以后提供了原始套結(jié)字功能,可以在用戶態(tài)用

      Winsock函數(shù)接收所有流經(jīng)Winsock的IP包。這種方法在MSDN里面有敘述,是MS官方支持

      的方法,在網(wǎng)上也有很多資料。但是這種方法只能監(jiān)聽但是不能攔截數(shù)據(jù)報,所以可以

      作為網(wǎng)絡(luò)監(jiān)視器的選擇技術(shù),但是不能實現(xiàn)防火墻等更高要求的功能。另外最致命的缺

      點就是只能在Winsock層次上進行,而對于網(wǎng)絡(luò)協(xié)議棧中底層協(xié)議的數(shù)據(jù)包例如TDI無法

      進行處理。對于一些木馬和病毒來說很容易避開這個層次的監(jiān)聽。

              2、替換系統(tǒng)自帶的WINSOCK動態(tài)連接庫。這種方法可以在很多文章里面找到詳細的實現(xiàn)

      細節(jié)。 通過替換系統(tǒng)Winsock庫的部分導(dǎo)出函數(shù),實現(xiàn)數(shù)據(jù)報的監(jiān)聽和攔截。缺點同1。

       

              3、Winsock服務(wù)提供者(SPI)。SPI是Winsock的另一面,是Winsock2的一個新特性。

      起初的Winsock是圍繞著TCP/IP協(xié)議運行的,但是在Winsock 2中卻增加了對更多傳輸協(xié)

      議的支持。Winsock2不僅提供了一個供應(yīng)用程序訪問網(wǎng)絡(luò)服務(wù)的Windows socket應(yīng)用程

      序編程接口(API),還包含了由傳輸服務(wù)提供者和名字解析服務(wù)提供者實現(xiàn)的Winsock

      服務(wù)提供者接口(SPI)和ws2_32.dll。 Winsock 2的傳輸服務(wù)提供者是以動態(tài)鏈接庫的

      形式(DLL)存在的。以下是winsock 2在傳輸服務(wù)提供者上的WOSA(Windows開放服務(wù)結(jié)

      構(gòu)):

      ----------------------------

      |Windows socket 2 應(yīng)用程序|

      ----------------------------Windows socket 2 API

      |       WS2_32.DLL        |

      ----------------------------Windows socket 2 傳輸SPI

      |   傳輸服務(wù)提供者(DLL)  |

      ----------------------------

      Windows socket SPI提供三種協(xié)議:分層協(xié)議,基礎(chǔ)協(xié)議和協(xié)議鏈。分層協(xié)議是在基礎(chǔ)

      協(xié)議的上層,依靠底層基礎(chǔ)協(xié)議實現(xiàn)更高級的通信服務(wù)。基礎(chǔ)協(xié)議是能夠獨立,安全地

      和遠程端點實現(xiàn)數(shù)據(jù)通信的協(xié)議,它是相對與分層協(xié)議而言的。協(xié)議鏈是將一系列的基

      礎(chǔ)協(xié)議和分層協(xié)議按特點的順序連接在一起的鏈狀結(jié)構(gòu),可以通過Platform SDK附帶的

      工具Sporder.exe察看系統(tǒng)已經(jīng)安裝的SPI,請參見下圖:

      API------------------------

         |      WS2_32.DLL     |

      SPI------------------------

         | 分層協(xié)議 |

      SPI-------------

         | 分層協(xié)議 |

      SPI------------------------

         |       基礎(chǔ)協(xié)議       |

         ------------------------

              每個應(yīng)用程序通過Ws2_32.dll和相應(yīng)的服務(wù)提供者進行嚴格的數(shù)據(jù)交換。Ws2_32.dl

      l根

      據(jù)應(yīng)用程序在創(chuàng)建套接字時所提供的參數(shù)來選擇特定的服務(wù)提供者,然后把應(yīng)用程序的

      實現(xiàn)過程轉(zhuǎn)發(fā)由所選創(chuàng)建套接字的服務(wù)提供者來管理。也就是說,Ws2_32.dll只是一個

      中間過程,而應(yīng)用程序只是一個接口,數(shù)據(jù)通信的實現(xiàn)卻是由服務(wù)提供者來完成的。所

      以我們通過適當?shù)脑黾幼约旱姆謱訁f(xié)議服務(wù)提供者,使其位于SPI的頂端,那么就能將W

      s2_32.dll傳給服務(wù)提供者的數(shù)據(jù)報攔截下來。由于是MS的官方方法,具體的使用方法在

      其Platform SDK里面有詳細的例子(LSP),在MSDN里面也有詳細的解釋。這種方法的優(yōu)點

      是能夠獲得調(diào)用Winsock的進程的詳細信息,并能實現(xiàn)Qos和數(shù)據(jù)加密。所以SPI是用戶態(tài)

      數(shù)據(jù)攔截的較好地點。缺點同1。

              4、Windows2000包過濾接口。由于過濾規(guī)則限制太多不靈活而應(yīng)用不多。

              5、網(wǎng)絡(luò)監(jiān)視器SDK。MS官方的實時監(jiān)視分析網(wǎng)絡(luò)數(shù)據(jù)的方法。但是由于封裝的太復(fù)?

      櫻?

      使用起來不靈活。

       

              在核心態(tài)下,數(shù)據(jù)報的監(jiān)視和攔截方法比較復(fù)雜,由于大多個人防火墻都是在核心?

      ?

      實現(xiàn)的,所以在這里比較詳細的敘述一下。具體的請參見nt/2kDDK文檔。大概有下面幾

      個方法。

      1、     TDI過濾驅(qū)動程序(TDI Filter Driver)。

      2、     NDIS中間層驅(qū)動程序(NDIS Intermediate Driver)。編寫IM DRIVER在NDIS中間層

       

       

      對MINIPORT(網(wǎng)卡驅(qū)動程序)和協(xié)議驅(qū)動程序之間的數(shù)據(jù)包進行攔截。這是微軟提供的

      一種技術(shù)。在DDK中MS提供了Passthru例子,很多中間層過濾驅(qū)動都可以由之改編。但編

      寫該過濾程序攔截程序非常的復(fù)雜,安裝也很麻煩。

      3、     Win2k Filter-Hook Driver。

      4、     NDIS Hook Driver。這種方法又有兩種實現(xiàn)方式。

      (1)向NDIS注冊假協(xié)議(fake protocol)。這是在協(xié)議層上的處理。在Windows內(nèi)核中

      ,所有已注冊的協(xié)議是通過一個單向的協(xié)議鏈表來維護的。這個單向鏈表保存了所有已

      注冊協(xié)議的NDIS_PROTOCOL_BLOCK結(jié)構(gòu)的地址,在這個結(jié)構(gòu)中保存了協(xié)議驅(qū)動所指定的相

      應(yīng)的派發(fā)函數(shù)的地址如RECEIVE_HANDLER等。

      struct _NDIS_PROTOCOL_BLOCK

      {

      PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol

      REFERENCE Ref; // contains spinlock for OpenQueue

      UINT Length; // of this NDIS_PROTOCOL_BLOCK struct

      NDIS50_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics;// handler addresses

       

      struct _NDIS_PROTOCOL_BLOCK * NextProtocol; // Link to next

      ULONG MaxPatternSize;

      #if defined(NDIS_WRAPPER)

      //

      // Protocol filters

      //

      struct _NDIS_PROTOCOL_FILTER * ProtocolFilter[NdisMediumMax+1];

      WORK_QUEUE_ITEM WorkItem; // Used during NdisRegisterProtocol to

      // notify protocols of existing drivers.

      KMUTEX Mutex; // For serialization of Bind/Unbind requests

      PKEVENT DeregEvent; // Used by NdisDeregisterProtocol

      #endif

      };

      typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLO

      CK;并且,每個協(xié)議驅(qū)動還對應(yīng)一個NDIS_OPEN_BLOCK的單向鏈表來維護其所綁定的網(wǎng)卡

      信息。當協(xié)議驅(qū)動調(diào)用NdisRegisterProtocol之后,

      EXPORT

      VOID

      NdisRegisterProtocol(

      OUT PNDIS_STATUS Status,

      OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle, /*注意NDIS_HANDLE所指向的就是PN

      DIS_PROTOCOL_BLOCK的結(jié)構(gòu),不要有什么懷疑。*/

      IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,

      IN UINT CharacteristicsLength

      );

      NDIS總是會把新注冊的協(xié)議放在協(xié)議鏈表的表頭并返回這張表,所以只要我們注冊一個

      新的協(xié)議通過新協(xié)議注冊返回的鏈表頭就可以輕而易舉的遍歷系統(tǒng)中所有協(xié)議表。但是

      ,如果要成功地掛接派發(fā)函數(shù),還需要對協(xié)議所對應(yīng)的NDIS_OPEN_BLOCK結(jié)構(gòu)里的派發(fā)函

      數(shù)進行掛接,因為NDIS并不是直接調(diào)用協(xié)議驅(qū)動在NDIS_PROTOCOL_CHARACTERISTICS所注

      冊的派發(fā)函數(shù)地址,而是調(diào)用NDIS_OPEN_BLOCK里的派發(fā)函數(shù)。

      struct _NDIS_OPEN_BLOCK

      {

      PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC

      NDIS_HANDLE MacBindingHandle; // context when calling MacXX funcs

      PNDIS_ADAPTER_BLOCK AdapterHandle; // pointer to our adapter

      PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol

      NDIS_HANDLE ProtocolBindingContext;// context when calling ProtXX funcs

      PNDIS_OPEN_BLOCK AdapterNextOpen; // used by adapter's OpenQueue

      PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue

      PFILE_OBJECT FileObject; // created by operating system

      BOOLEAN Closing; // TRUE when removing this struct

      BOOLEAN Unloading; // TRUE when processing unload

      BOOLEAN NoProtRsvdOnRcvPkt; // Reflect the protocol_options

      NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close

      KSPIN_LOCK SpinLock; // guards Closing

      PNDIS_OPEN_BLOCK NextGlobalOpen;

      //

      // These are optimizations for getting to MAC routines. They are not

      // necessary, but are here to save a dereference through the MAC block.

      //

      SEND_HANDLER SendHandler;

      TRANSFER_DATA_HANDLER TransferDataHandler;

      //

      // These are optimizations for getting to PROTOCOL routines. They are not

      // necessary, but are here to save a dereference through the PROTOCOL block.

       

      //

      SEND_COMPLETE_HANDLER SendCompleteHandler;

      TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;

      RECEIVE_HANDLER ReceiveHandler;

      RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;

      //

      // Extentions to the OPEN_BLOCK since Product 1.

      //

      RECEIVE_HANDLER PostNt31ReceiveHandler;

      RECEIVE_COMPLETE_HANDLER PostNt31ReceiveCompleteHandler;

      //

      // NDIS 4.0 extensions

      //

      RECEIVE_PACKET_HANDLER ReceivePacketHandler;

      SEND_PACKETS_HANDLER SendPacketsHandler;

      //

      // More NDIS 3.0 Cached Handlers

      //

      RESET_HANDLER ResetHandler;

      REQUEST_HANDLER RequestHandler;

      //

      // Needed for PnP

      //

      UNICODE_STRING AdapterName; // Upcased name of the adapter we are bound to

      };

      這張表是一個單向鏈接表,并且存放了和PNDIS_OPEN_BLOCK->ProtocolCharacteristic

      s

      一樣的數(shù)據(jù)收發(fā)派發(fā)函數(shù),當?shù)贜塊網(wǎng)卡發(fā)送數(shù)據(jù)包到第N個協(xié)議時,就會調(diào)用第N個協(xié)議

      與第N個網(wǎng)卡之間建立的

      NDIS_OPEN_BLOCK表里的SendHandler或SendPacketHandler。所以我們還需要對這張表里

      的派發(fā)函數(shù)進行處理(勾掛)。

      值得注意的是,在Windows9x/Me/NT的DDK中,NDIS_PROTOCOL_BLOCK的定義是很明確的,

      而在Windows 2000/xp的DDK中,并沒有該結(jié)構(gòu)的詳細定義,也就是說該結(jié)構(gòu)在Windows2

      000/xp下是非公開的,因此開發(fā)人員需要利用各種調(diào)試工具來發(fā)掘該結(jié)構(gòu)的詳細定義。

      也正是因為如此,這種方法對平臺的依賴性比較大,需要在程序中判斷不同的操作系統(tǒng)

      版本而使用不同的結(jié)構(gòu)定義。可以用NdisOpenProtocolConfiguration打開協(xié)議配置,用

      NdisReadConfiguration查詢NDIS版本。

      下面的函數(shù)注冊fake protocol并將PNDIS_PROTOCOL_BLOCK結(jié)構(gòu)存在ProtHandle中NDIS_

      HANDLE GetProtocolBlock()

      {

              NDIS_PROTOCOL_CHARACTERISTICS   PChars;

              NDIS_STRING                                             Name;

              NDIS_HANDLE                                             ProtHandle;

              NDIS_STATUS                                             Status;

              NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

              PChars.MajorNdisVersion = 5;

              PChars.MinorNdisVersion = 0;

              NdisInitUnicodeString(&Name, L"WssFW"); // Protocol name

              PChars.Name = Name;

              PChars.OpenAdapterCompleteHandler = NULL;

              PChars.CloseAdapterCompleteHandler = NULL;

              PChars.SendCompleteHandler = NULL;

              PChars.TransferDataCompleteHandler = NULL;

       

              PChars.ResetCompleteHandler = NULL;

              PChars.RequestCompleteHandler = NULL;

              PChars.ReceiveHandler = NULL;

              PChars.ReceiveCompleteHandler = NULL;

              PChars.StatusHandler = NULL;

              PChars.StatusCompleteHandler = NULL;

              PChars.BindAdapterHandler = NULL;

              PChars.UnbindAdapterHandler = NULL;

              PChars.UnloadHandler = NULL;

              PChars.ReceivePacketHandler = NULL;

              PChars.PnPEventHandler= NULL;

              NdisRegisterProtocol(&Status,

                                                       &ProtHandle,

                                                       &PChars,

                                                       sizeof(NDIS_PROTOCOL_CHARACTERIS

      TICS));

              ASSERT(Status == NDIS_STATUS_SUCCESS);

              if(Status == NDIS_STATUS_SUCCESS)

                      return ProtHandle;

              else

                      return NULL;

      }

              下面的函數(shù)掛接PNDIS_PROTOCOL_BLOCK中PNDIS_PROTOCOL_CHARACTERISTICS結(jié)構(gòu)的R

      ec

      eiveHandler和ReceivePacketHandler

      PVOID

      HookProtoFunc(

                                PNDIS_PROTOCOL_CHARACTERISTICS pCharacteristics,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              PVOID pOldFunc = NULL;

              //Check parameters

              if( (!pCharacteristics ) || (!pfuncNew) )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //Just hook once!

                      if(pCharacteristics->ReceiveHandler != pfuncNew )

                      {

                              pOldFunc = pCharacteristics->ReceiveHandler;

                              if( pOldFunc )

                                      pCharacteristics->ReceiveHandler = pfuncNew;

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      if(pCharacteristics->ReceivePacketHandler != pfuncNew)

                      {

                              //if pOpenBlock is NULL or pOpenBlock->ReceivePacketHandl

      er is NULL,

                              //just hook Characteristics;

                              pOldFunc = pCharacteristics->ReceivePacketHandler;

                              if(pOldFunc)

                                      pCharacteristics->ReceivePacketHandler = pfuncNew

      ;

                      }

                      break;

              default:

                      break;

              }

              return pOldFunc;

      }

      下面的函數(shù)掛接PNDIS_OPEN_BLOCK結(jié)構(gòu)里的ReceiveHandler和ReceivePacketHandler

      PVOID

      HookBlockFunc(

                                PNDIS_OPEN_BLOCK pFirstOpenBlock,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              RECEIVE_HANDLER * pReceiveHandler = NULL;

              RECEIVE_PACKET_HANDLER * pReceivePacketHandler = NULL;

      //      PVOID pFuncHandler = NULL;

              PVOID pOldFunc = NULL;

              PNDIS_OPEN_BLOCK pOpenBlock = pFirstOpenBlock;

              if(!pFirstOpenBlock)

                      return NULL;

              if(!pfuncNew )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                      {

                              pReceiveHandler = GetReceiveHandler(pOpenBlock,dwNdisVers

      ion);

                              //Just hook once!

                              if( *pReceiveHandler != pfuncNew )

                              {

                                      pOldFunc = *pReceiveHandler;

                                      *pReceiveHandler = pfuncNew;

                              }

                              if(dwNdisVersion == 0x00040001)//win2k ????

                              {

                                      pReceiveHandler = GetPostNt31ReceiveHandler(pOpen

      Block,dwNdisVersion);

                                      if( *pReceiveHandler != pfuncNew )

                                      {

                                              pOldFunc = *pReceiveHandler;

                                              *pReceiveHandler = pfuncNew;

                                      }

                              }

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                              pReceivePacketHandler = GetReceivePacketHandler( pOpenBlo

      ck,dwNdisVersion

       );

                              //Just hook once !

                              if(*pReceivePacketHandler != pfuncNew)

                              {

                                      pOldFunc = *pReceivePacketHandler;

                                      *pReceivePacketHandler = pfuncNew;

                              }

                      }

                      break;

       

              default:

                      break;

              }

              return pOldFunc;

      }


      bsp;          &PChars,

                                                       sizeof(NDIS_PROTOCOL_CHARACTERIS

      TICS));

              ASSERT(Status == NDIS_STATUS_SUCCESS);

              if(Status == NDIS_STATUS_SUCCESS)

                      return ProtHandle;

              else

                      return NULL;

      }

              下面的函數(shù)掛接PNDIS_PROTOCOL_BLOCK中PNDIS_PROTOCOL_CHARACTERISTICS結(jié)構(gòu)的R

      ec

      eiveHandler和ReceivePacketHandler

      PVOID

      HookProtoFunc(

                                PNDIS_PROTOCOL_CHARACTERISTICS pCharacteristics,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              PVOID pOldFunc = NULL;

              //Check parameters

              if( (!pCharacteristics ) || (!pfuncNew) )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //Just hook once!

                      if(pCharacteristics->ReceiveHandler != pfuncNew )

                      {

                              pOldFunc = pCharacteristics->ReceiveHandler;

                              if( pOldFunc )

                                      pCharacteristics->ReceiveHandler = pfuncNew;

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      if(pCharacteristics->ReceivePacketHandler != pfuncNew)

                      {

                              //if pOpenBlock is NULL or pOpenBlock->ReceivePacketHandl

      er is NULL,

                              //just hook Characteristics;

                              pOldFunc = pCharacteristics->ReceivePacketHandler;

                              if(pOldFunc)

                                      pCharacteristics->ReceivePacketHandler = pfuncNew

      ;

                      }

                      break;

              default:

                      break;

              }

              return pOldFunc;

      }

      下面的函數(shù)掛接PNDIS_OPEN_BLOCK結(jié)構(gòu)里的ReceiveHandler和ReceivePacketHandler

      PVOID

      HookBlockFunc(

                                PNDIS_OPEN_BLOCK pFirstOpenBlock,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              RECEIVE_HANDLER * pReceiveHandler = NULL;

              RECEIVE_PACKET_HANDLER * pReceivePacketHandler = NULL;

      //      PVOID pFuncHandler = NULL;

              PVOID pOldFunc = NULL;

              PNDIS_OPEN_BLOCK pOpenBlock = pFirstOpenBlock;

              if(!pFirstOpenBlock)

                      return NULL;

              if(!pfuncNew )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                      {

                              pReceiveHandler = GetReceiveHandler(pOpenBlock,dwNdisVers

      ion);

                              //Just hook once!

                              if( *pReceiveHandler != pfuncNew )

                              {

                                      pOldFunc = *pReceiveHandler;

                                      *pReceiveHandler = pfuncNew;

                              }

                              if(dwNdisVersion == 0x00040001)//win2k ????

                              {

                                      pReceiveHandler = GetPostNt31ReceiveHandler(pOpen

      Block,dwNdisVersion);

                                      if( *pReceiveHandler != pfuncNew )

                                      {

                                              pOldFunc = *pReceiveHandler;

                                              *pReceiveHandler = pfuncNew;

                                      }

                              }

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                              pReceivePacketHandler = GetReceivePacketHandler( pOpenBlo

      ck,dwNdisVersion

       );

                              //Just hook once !

                              if(*pReceivePacketHandler != pfuncNew)

                              {

                                      pOldFunc = *pReceivePacketHandler;

                                      *pReceivePacketHandler = pfuncNew;

                              }

                      }

                      break;

       

              default:

                      break;

              }

              return pOldFunc;

      }


      bsp;          &PChars,

                                                       sizeof(NDIS_PROTOCOL_CHARACTERIS

      TICS));

              ASSERT(Status == NDIS_STATUS_SUCCESS);

              if(Status == NDIS_STATUS_SUCCESS)

                      return ProtHandle;

              else

                      return NULL;

      }

              下面的函數(shù)掛接PNDIS_PROTOCOL_BLOCK中PNDIS_PROTOCOL_CHARACTERISTICS結(jié)構(gòu)的R

      ec

      eiveHandler和ReceivePacketHandler

      PVOID

      HookProtoFunc(

                                PNDIS_PROTOCOL_CHARACTERISTICS pCharacteristics,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              PVOID pOldFunc = NULL;

              //Check parameters

              if( (!pCharacteristics ) || (!pfuncNew) )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //Just hook once!

                      if(pCharacteristics->ReceiveHandler != pfuncNew )

                      {

                              pOldFunc = pCharacteristics->ReceiveHandler;

                              if( pOldFunc )

                                      pCharacteristics->ReceiveHandler = pfuncNew;

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      if(pCharacteristics->ReceivePacketHandler != pfuncNew)

                      {

                              //if pOpenBlock is NULL or pOpenBlock->ReceivePacketHandl

      er is NULL,

                              //just hook Characteristics;

                              pOldFunc = pCharacteristics->ReceivePacketHandler;

                              if(pOldFunc)

                                      pCharacteristics->ReceivePacketHandler = pfuncNew

      ;

                      }

                      break;

              default:

                      break;

              }

              return pOldFunc;

      }

      下面的函數(shù)掛接PNDIS_OPEN_BLOCK結(jié)構(gòu)里的ReceiveHandler和ReceivePacketHandler

      PVOID

      HookBlockFunc(

                                PNDIS_OPEN_BLOCK pFirstOpenBlock,

                                DWORD dwFunctionCode,

                                PVOID pfuncNew,

                                DWORD dwNdisVersion)

      {

              RECEIVE_HANDLER * pReceiveHandler = NULL;

              RECEIVE_PACKET_HANDLER * pReceivePacketHandler = NULL;

      //      PVOID pFuncHandler = NULL;

              PVOID pOldFunc = NULL;

              PNDIS_OPEN_BLOCK pOpenBlock = pFirstOpenBlock;

              if(!pFirstOpenBlock)

                      return NULL;

              if(!pfuncNew )

                      return NULL;

              switch(dwFunctionCode)

              {

              case PROTO_RECEIVE_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                      {

                              pReceiveHandler = GetReceiveHandler(pOpenBlock,dwNdisVers

      ion);

                              //Just hook once!

                              if( *pReceiveHandler != pfuncNew )

                              {

                                      pOldFunc = *pReceiveHandler;

                                      *pReceiveHandler = pfuncNew;

                              }

                              if(dwNdisVersion == 0x00040001)//win2k ????

                              {

                                      pReceiveHandler = GetPostNt31ReceiveHandler(pOpen

      Block,dwNdisVersion);

                                      if( *pReceiveHandler != pfuncNew )

                                      {

                                              pOldFunc = *pReceiveHandler;

                                              *pReceiveHandler = pfuncNew;

                                      }

                              }

                      }

                      break;

              case PROTO_RECEIVE_PACKET_HANDLER:

                      //travel all NDIS_OPEN_BLOCK

                      for(;pOpenBlock;pOpenBlock = GetNextBlock( pOpenBlock,dwNdisVersi

      on ))

                              pReceivePacketHandler = GetReceivePacketHandler( pOpenBlo

      ck,dwNdisVersion

       );

                              //Just hook once !

                              if(*pReceivePacketHandler != pfuncNew)

                              {

                                      pOldFunc = *pReceivePacketHandler;

                                      *pReceivePacketHandler = pfuncNew;

                              }

                      }

                      break;

       

              default:

                      break;

              }

              return pOldFunc;

      }


      posted on 2007-07-29 15:02 旅途 閱讀(1850) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)技術(shù)

      青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
    1. <ins id="pjuwb"></ins>
      <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲国产精品黑人久久久| 欧美成人第一页| 久久精品国产综合精品| 亚洲一区二区伦理| 在线性视频日韩欧美| 亚洲伦伦在线| 国产精品99久久久久久有的能看| 在线一区观看| 欧美一区二区免费| 久久久久久久综合狠狠综合| 久久精品国产77777蜜臀| 欧美一区二区三区四区在线观看| 亚洲欧美国产77777| 欧美一区二区视频在线观看| 久久久久久夜精品精品免费| 欧美不卡视频| 亚洲美女中出| 午夜精品一区二区三区在线播放| 久久久噜噜噜久久中文字免| 欧美日韩一区成人| 伊大人香蕉综合8在线视| 一区二区三区**美女毛片| 欧美在线一级va免费观看| 欧美高潮视频| 午夜精品在线观看| 免费影视亚洲| 国产亚洲女人久久久久毛片| 亚洲欧洲三级| 久久国产高清| 91久久嫩草影院一区二区| 亚洲一区二区在线播放| 久久久久成人网| 国产精品美女主播在线观看纯欲| 亚洲电影在线看| 亚洲永久字幕| 欧美激情久久久| 欧美一区二区久久久| 欧美精品亚洲一区二区在线播放| 狠狠色丁香婷婷综合久久片| 亚洲欧美成人网| 亚洲精品视频一区二区三区| 久久中文欧美| 一色屋精品视频在线看| 欧美在线国产精品| 18成人免费观看视频| 午夜精品亚洲一区二区三区嫩草| 亚洲高清不卡在线观看| 午夜精品成人在线| 欧美网站在线| 中文国产成人精品| 亚洲精品久久视频| 欧美精品v日韩精品v韩国精品v| 亚洲第一在线| 欧美波霸影院| 免费高清在线一区| 一区在线播放视频| 久久午夜精品| 久久久久天天天天| 一区二区在线视频| 免费试看一区| 欧美波霸影院| 中国成人黄色视屏| 夜夜嗨一区二区| 国产精品久久久久9999| 亚洲综合色视频| 亚洲欧美卡通另类91av | 亚洲婷婷在线| 一区二区三区日韩欧美精品| 国产精品日韩一区| 先锋影音一区二区三区| 亚洲欧美另类在线| 狠狠色综合播放一区二区| 久久成人免费视频| 亚洲欧美伊人| 精品999网站| 亚洲成色777777女色窝| 久久天天狠狠| 亚洲人线精品午夜| 亚洲另类在线一区| 欧美日韩国产三区| 一区二区欧美在线观看| 亚洲色图自拍| 国产日韩欧美精品综合| 另类专区欧美制服同性| 久久久五月天| 在线亚洲精品| 亚洲影视综合| 亚洲第一网站| 亚洲小说欧美另类婷婷| 国内一区二区三区| 欧美激情视频给我| 国产精品xxx在线观看www| 欧美专区中文字幕| 久久综合国产精品台湾中文娱乐网| 亚洲国产精品成人va在线观看| 亚洲高清视频中文字幕| 欧美视频一区二区在线观看| 久久狠狠久久综合桃花| 麻豆av福利av久久av| 亚洲视频观看| 久久精品国产亚洲高清剧情介绍| 亚洲美女毛片| 性色av一区二区三区| 亚洲精品综合| 欧美专区一区二区三区| 免费亚洲电影| 午夜久久资源| 老色鬼久久亚洲一区二区| 亚洲一区观看| 美日韩丰满少妇在线观看| 亚洲欧美精品在线观看| 另类图片综合电影| 欧美在线国产| 国产精品福利久久久| 亚洲国产成人一区| 国产日韩欧美在线看| 99re6热在线精品视频播放速度| 国内精品伊人久久久久av影院 | 中文成人激情娱乐网| 久久九九精品99国产精品| 亚洲综合日韩在线| 欧美激情中文字幕一区二区| 久久免费国产精品1| 国产精品久久久久久五月尺| 亚洲精品久久久久久久久久久久| 影音先锋亚洲精品| 久久av资源网站| 欧美在线日韩精品| 国产精品美女视频网站| 亚洲理论在线观看| 99热这里只有成人精品国产| 美女视频黄免费的久久| 美女视频黄a大片欧美| 国内视频精品| 欧美一区二区三区男人的天堂| 性欧美1819性猛交| 国产精品国产一区二区| 一本色道婷婷久久欧美| 亚洲在线播放电影| 欧美午夜久久久| 一区二区免费在线视频| 在线视频日韩精品| 欧美日韩专区在线| 在线视频精品一| 亚洲影院在线| 国产精品一区视频网站| 亚洲视频一区二区免费在线观看| 亚洲性感激情| 国产精品一区二区三区观看| 亚洲制服少妇| 久久一日本道色综合久久| **性色生活片久久毛片| 蜜臀av在线播放一区二区三区| 亚洲精品1234| 午夜精品亚洲| 一区在线视频| 欧美日本久久| 午夜免费在线观看精品视频| 久久久久成人精品| 在线观看欧美日韩| 欧美激情中文不卡| 中文在线不卡| 久久午夜电影网| 亚洲免费av电影| 国产精品成人在线观看| 午夜一区二区三视频在线观看 | 国产亚洲精品久久飘花 | 久久综合色天天久久综合图片| 欧美成人精品一区二区| 日韩午夜在线| 国产日韩欧美日韩大片| 玖玖综合伊人| 一区二区三区成人精品| 久久久国产午夜精品| 亚洲欧洲精品一区二区三区不卡| 欧美视频中文一区二区三区在线观看| 午夜精品久久久久| 亚洲国产日韩美| 久久黄色网页| 亚洲手机在线| 在线观看视频日韩| 欧美色偷偷大香| 久热精品在线视频| 亚洲一区二区三区免费视频| 欧美sm极限捆绑bd| 亚洲欧美日韩在线一区| 亚洲电影免费在线观看| 国产精品综合久久久| 欧美激情一区二区三区成人| 午夜欧美视频| 日韩视频专区| 欧美岛国激情| 久久精品国产99国产精品澳门 | 国语自产精品视频在线看抢先版结局 | 国产亚洲免费的视频看| 欧美精品粉嫩高潮一区二区| 久久成人精品无人区| 亚洲天堂久久| 亚洲精品在线观看视频| 欧美成人国产|