NDIS WIN7 64 WINXP hook網絡發包收包

轉:
   網上有不少討論關於NDIS HOOK的文章,但大多隻講了WIN7以前的HOOK NDIS_OPEN_BLOCK下的例程,至於WIN7下怎麼
HOOK以及如何作MINIPORT-HOOK,網絡上則鮮有說起.根據前陣子的相關分析,我把NDIS HOOK總結一下,網上有一些討論
NDIS HOOK的文章,請讀者先閱讀那些文章對NDIS HOOK有個基本瞭解.

[0x01] 

    首先是獲取物理網卡的設備GUID,若是隻是作普通的NDIS HOOK則能夠忽略此步.爲何要獲取物理網卡的GUID呢,
由於系統內可能有多個MINIPORT,每一個MINIPORT對應一個網卡設備,不管這個網卡是虛擬的仍是物理的.
    
    因此咱們要作MINIPORT HOOK的話就必須找到物理網卡對應的miniport.下面是兩種得到物理網卡GUID的方法。

   方法1:經過註冊表項\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards
得到網卡的設備名,好比{F0AFC092-E841-48DF-909F- 78146070F5D3},不過在有些系統下沒有這個註冊表項,因此這種
方法不通用.

   方法2:仍是經過註冊表,首先遍歷HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI下的子鍵,當遍歷到第
二級的時候,好比
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_10DE&DEV_0BE4&SUBSYS_00000000&REV_A1\4&2f49a5f6&0&0108.
   
   則獲取當前設備的ClassGUID,若是ClassGUID爲{4d36e972-e325-11ce-bfc1-08002be10318},則說明當前設備爲網絡
適配器設備,那麼咱們再繼續讀名爲Driver的鍵值,其數據通常爲相似{4d36e972-e325-11ce-bfc1-08002be10318}\0007
這樣的值.

   而後咱們把這個值拼接到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class這個路徑後面組成
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007,
這個子鍵下的鍵值NetCfgInstanceId即爲物理網卡的設備GUID.
 
[0x02]

    XP NDIS HOOK:經過註冊假協議,遍歷全部NDIS_OPEN_BLOCK,掛接TCPIP協議下全部的NDIS_OPEN_BLOCK裏的相關例程
便可(ReceiveHandler,ReceivePacketHandler,WanSendHandler,SendHandler,SendPacketsHandler等),這在其餘講述
NDIS HOOK的文章裏均有描述,這裏再也不贅述.

    XP NDIS MINIPORT HOOK:仍然先要註冊假協議,找到DeviceName是物理網卡設備GUID的NDIS_OPEN_BLOCK,掛接其
WSendHandler或者WSendPacketsHandler便可.只有這個NDIS_OPEN_BLOCK纔是綁定到物理網卡的.從而避免掛接到綁定
到其餘虛擬網卡的NDIS_OPEN_BLOCK或者中間層過濾驅動同上層協議之間的綁定關係(還記得嗎,中間層過濾驅動的
upperlayer向上對協議驅動表現爲MINIPORT).

[0x03]

    WIN7 NDIS HOOK:仍然是遍歷全部NDIS_OPEN_BLOCK:攔截Send操做須要Inline Hook ndis!NdisSendNetBufferLists,
或者HOOK TCPIP.SYS的IAT裏的ndis!NdisSendNetBufferLists,攔截Receive操做須要Hook NDIS_OPEN_BLOCK裏的
ReceiveNetBufferListsHandler.

    WIN7 MINIPORT HOOK:遍歷NDIS_OPEN_BLOCK,找到DeviceName是物理網卡設備GUID的NDIS_OPEN_BLOCK,根據NDIS_OPEN_BLOCK
定位到對應的NDIS_MINIPORT_BLOCK,而後定位到M_DRIVER_BLOCK結構體(offset:0xE04),而後M_DRIVER_BLOCK的偏移0x60
處就是MINIPORT的發送函數SendNetBufferListsHandler,直接掛接這裏便可.
 
[0x04]

其餘說明:
NDIS_PRPTOCOL_BLOCK:這個結構表示協議相關的信息,每一個協議對應一個

NDIS_OPEN_BLOCK:這個結構是表示協議(PROTOCOL)和網卡(MINIPORT)的綁定關係的

NDIS_MINIPORT_BLOCK:這個結構是表示小端口信息的,除了物理網卡和虛擬網卡存在這個結構外,IMD(中間層過濾驅動)由
因而向上表現爲MINIPORT,因此IMD也存在一個本結構

IMD:向上表現爲MINIORT,向下表現爲PROTCOL,因此IMD和PROTOCOL之間也存在NDIS_OPEN_BLOCK,而IMD和下層的MINIOPORT
也存在NDIS_OPEN_BLOCK
相關文章
相關標籤/搜索