基於NDIS 網路驅動介面標準 包攔截技術

2022-09-27 07:06:02 字數 1875 閱讀 2607

2008-01-18 00:00

看了很多提供資料報的攔截技術,其中最多的是編寫im driver在ndis中間層對miniport(網絡卡驅動程式)和協議驅動程式之間的資料報進行攔截。但編寫該過濾程式攔截程式非常的複雜,這裡介紹一種更有效的基於ndis包攔截技術……

通常使用者都知道,ndis協議驅動程式是通過填寫一張ndis_protocol_characteristics的表,並呼叫ndis api函式ndisregisterprotocol進行註冊。現在我們來關注一下ndis_protocol_characteristics這張表,這張表中存有所有協議驅動程式與底層的派發函式的入口。如sendhandler,receivehandler,bindadapterhandler等,

當網絡卡有資料報進入時,會通過表中receivehandle 或receivepackethandler通知協議驅動程式有乙個該協議的資料報進入,,有人會奇怪程式中明明不是呼叫ndissend或ndissendpackets函式傳送的嗎?沒錯,是這樣的,但是你可以看一下ndis。h的標頭檔案裡對這兩個函式的定義就知道了,。

現在我們所要做的事情應該很清楚了,只要我們能夠將每乙個協議程式所填寫的ndis_protocol_characteristics表裡的派發函式指向自己的函式,我們就能成功的對資料報進行攔截。那麼每個協議驅動程式的這張表到底存放在那裡呢?看下面的對ndisregisterprotocol重新給出的原型就很明白了。

ndis_protocol_block(協議表) 是ndis維護所有系統中已註冊協義的單向鏈結表。欄位nextprotocol指向下乙個協議表。

慶幸的是,當我們註冊一新的協議時,ndis總是會把新註冊的協義放在鍊錶的頭並返回這張表,所以只要我們註冊乙個新的協議通過新協議註冊返回的煉表頭就可以輕而易舉的遍歷系統中所有協議表.現在我們所希望得到的每個協議的ndis_protocol_characteristics表就放在我們面前了,如何勾掛表中的派發函式,我想不必多說了吧。順便說一句ndisregisterprotocol為ndis_protocol_block所分配的記憶體是nonpagedpool型別的。

對於核心driver來說,核心區記憶體是乙個線性的記憶體區,所有核心driver是可以隨便訪問核心記憶體區的任意位址。所要注意的是不同irql級別下對分頁和非分頁記憶體。

有人會問這樣就行了嗎?真的攔截下來了嗎?如果有那位仁兄心急現在就寫程式的話,準會失望的,因為他會發現結果什麼東西都沒攔截到或偶而會攔截到一些資料報。為什麼?

因為ndis網絡卡驅動和協議驅動在傳送和接收到數居時並不是呼叫pndis_open_block->protocolcharacteristics裡的派發函式。怎麼辦?

有必要先介紹一下ndis網絡卡驅動和協議驅動之間是如何binding 的吧,ndisregisterprotocol在註冊完乙個協議後,不久ndis會通過呼叫表中bindadapterhandler派發函式,通知協議對每乙個網絡卡進行binding。或者當系統通pnp找到一塊新的網絡卡,也會呼叫bindadapterhandler對協議進行binding。協議在binding 呼叫裡,會根據自己的需要使用ndisopenadapter將自身繫結到適合的網絡卡。

並返回是什麼?ndisbindinghandl其實是指向ndis_open_block表的一根指標,那麼ndis_open_block表有什麼用呢?當協議順利的繫結後,每個繫結的網絡卡和每乙個協議之間建立了資料傳輸的通道,而ndis_open_block就是用來維護這一資料通道的表。

上面的表結構可以很清楚的看到這張表是乙個單向鏈結表,並且存放了和pndis_open_block->protocolcharacteristics一樣的資料收發派發函式,當第n塊網絡卡傳送資料報到第n個協議時,就會呼叫第n個協議與第n個網絡卡之間建立的ndis_open_block表裡的sendhandler或sendpackethandler。所以我們還需要對這張表裡的派發函式進行處理(勾掛)。

基於HTTP的API服務介面說明書

基於http的api服務介面說明書 v1.0.0.0 目錄1.scadacloud app服務介紹 3 1.1 簡介 3 1.2 請求引數 3 1.3 舉例 4 2.服務詳解 5 2.1 註冊 5 2.2 登陸 5 2.3 讀取資料點當前值 5 2.4 讀取資料點歷史資料 6 2.5 設定資料點 7...

網路印表機驅動安裝流程

以win7和xp安裝hp印表機為例,dell印表機情況類似。1.從210伺服器上 驅動程式,並解包備用 2.選擇 開始 選單中的 裝置和印表機 xp下為 印表機和傳真 3.新增印表機 4.新增網路 無線或bluetooth印表機 xp下選 連線到此計算機的網路印表機 再選擇 標準tcp ip埠 5....

基於msp430的1602液晶驅動底層源程式

include include typedef unsigned char uchar typedef unsigned int uint 巨集定義 define datadir p4dir define dataport p4out define busy 0x80 define ctrldir ...