轉: 網上有不少討論關於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