n-byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.net開發的個人版防火牆。在n-byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n-byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。
由於軟體的主程式是用c#寫的,c#中沒有提供具有類似deviceiocontrol函式功能的驅動裝置控制函式,而ndis hook driver技術下的驅動程式是用ddk下的c語言寫的,為了能夠實現主程式對驅動程式的控制和相互通訊,採用了以下設計方案:
在以上方案中,需要乙個負責主程式與ndis hook driver驅動程式通訊與控制的模組driverdll.dll,並用c#編寫的乙個封裝驅動程式中封包資訊的模組,可以傳送這個驅動程式資訊到主程式,主程式可識別並操作模組中的資料型別。
在.net應用程式使用驅動程式的問題上,面臨著兩個問題:
1.怎樣實現.net應用程式控制驅動程式的功能?
2.怎樣從驅動程式向.net應用程式傳遞非託管的資料型別?
以下是我們就這些問題的詳細解決方法:
怎樣實現.net應用程式控制驅動程式的功能?
使用託管c++編寫的driverdll.dll來實現對驅動程式的直接控制,而主程式通過呼叫其中的方法來實現對驅動程式的間接控制。比如在nbyte.h檔案中定義了start_ip_hook常數用來作為傳給驅動程式用來開啟驅動程式封包過濾功能的引數,下面在託管c++模組中定義了ioctrl託管類並定義了下面的向緩衝區寫入引數的方法:
//向緩衝區寫入資料。
dword writeio(dword code,pvoid buffer,dword count)
if(hdriverhandle == null)
return error_driver_handle;
dword bytesreturned;
bool returncode = deviceiocontrol(hdriverhandle,
code,
buffer,
count,
null,
0,&bytesreturned,
null);
if(!returncode)
return error_io_ctrl;
return success;
當然直接使用這個方法不太方便,所以定義乙個公有函式,用來提供給主程式呼叫:
//開始進行封包過濾
bool startiphook()
這樣,只要在主程式中宣告ioctrl的物件ic,就可以通過ic.startiphook()就可以實現對驅動程式過濾功能的開啟,用同樣的方法也可以實現對驅動程式進行其它操作,比如新增、修改封包過濾規則等。
怎樣從驅動程式向.net應用程式傳遞非託管的資料型別?
為了能夠輸出安全日誌,必須讓主程式獲得驅動程式中的封包資訊。使用訊號量機制可以很方便的實現驅動程式和非託管**間的資訊傳遞,那麼對託管**呢?這需要向.net應用程式傳遞非託管的資料型別access_info。在nbyte.h中,是這樣定義這個access_info結構的:
typedef struct _access_info
access_info;
顯然,直接傳遞非託管資料型別是不可以的,需要轉換一下。首先,在ioctrl類中定義了幾個要傳遞的封包資訊引數:
public __gc class ioctrl
然後,在getaccessinfo()函式中來給這些引數賦值:
void getaccessinfo()
既然在ioctrl類中獲得了這些資訊,但是需要把它們封裝成主程式容易處理的資料型別,這樣,用c#實現了infoevent類用來封裝這些資訊:
//本類封裝了資料報的詳細資訊,可以通過事件實現對它的模組間傳遞。
public class infoevent:eventargs
下面在用託管c++實現的infoprovider驅動程式資訊提供者類中把個infoevent類的物件傳遞給主程式,需要使用乙個委託生成乙個事件:
//宣告委託事件,用來向主程式傳遞資料。
__delegate void driverinfo(object* sender, infoevent* e);
//宣告響應事件函式。
__event driverinfo* ondriverinfo;
然後在infoprovider驅動程式資訊提供者類中定義乙個方法,在主程式中以執行緒的方式執行這個方法,在這個方法中使用了事件函式ondriverinfo:
//用來獲得驅動程式資訊的程序,在主程式中將開啟該程序。
void getinfothreadproc()
while(true)
ic->closedriverhandle();
return;
} 在主程式中,會開啟這個程序並定義了ondriverinfo的處理函式dealwithinfo:
pinfo=new infoprovider();
//開啟與驅動交換資訊的程序
filterthread=new thread(new threadstart(pinfo.getinfothreadproc));
filterthread.isbackground=true;
filterthread.start();
pinfo.ondriverinfo+=new infoprovider.driverinfo(dealwithinfo);
這樣主程式就可以在dealwithinfo函式中加入對infoevent物件的處理了。可見,通過中間模組ioctrl的轉換,便實現了.net主程式對驅動程式中非託管資料型別的獲取和處理。
用C 開發網路防火牆技術分析
用c 開發網路防火牆技術分析 n byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.開發的個人版防火牆。在n byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。由...
用C 開發網路防火牆技術分析
n byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.開發的個人版防火牆。在n byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。由於軟體的主程式是用c 寫的,c...
防火牆技術與網路攻擊
防火牆技術與網路攻擊 考法分析 本知識點的考查形式主要有 對於防火牆技術的描述判斷正誤 給定一些描述判斷所屬的網路攻擊分類或具體的網路攻擊方式 主要有拒絕服務 流量分析 重放等 要點分析 1 網路攻擊分類如下圖所示 2 常見的攻擊行為 1 拒絕服務 攻擊者利用眾多傀儡主機向伺服器傳送服務請求,導致伺...