用C 開發網路防火牆技術分析

2021-03-31 08:57:00 字數 2773 閱讀 5093

n-byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.***開發的個人版防火牆。在n-byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n-byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。

由於軟體的主程式是用c#寫的,c#中沒有提供具有類似deviceiocontrol函式功能的驅動裝置控制函式,而ndis hook driver技術下的驅動程式是用ddk下的c語言寫的,為了能夠實現主程式對驅動程式的控制和相互通訊,採用了以下設計方案:

在以上方案中,需要乙個負責主程式與ndis hook driver驅動程式通訊與控制的模組driverdll.dll,並用c#編寫的乙個封裝驅動程式中封包資訊的模組,可以傳送這個驅動程式資訊到主程式,主程式可識別並操作模組中的資料型別。

在.***應用程式使用驅動程式的問題上,面臨著兩個問題:

1.怎樣實現.***應用程式控制驅動程式的功能?

2.怎樣從驅動程式向.***應用程式傳遞非託管的資料型別?

以下是我們就這些問題的詳細解決方法:

怎樣實現.***應用程式控制驅動程式的功能?

使用託管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()就可以實現對驅動程式過濾功能的開啟,用同樣的方法也可以實現對驅動程式進行其它操作,比如新增、修改封包過濾規則等。

怎樣從驅動程式向.***應用程式傳遞非託管的資料型別?

為了能夠輸出安全日誌,必須讓主程式獲得驅動程式中的封包資訊。使用訊號量機制可以很方便的實現驅動程式和非託管**間的資訊傳遞,那麼對託管**呢?這需要向.***應用程式傳遞非託管的資料型別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的轉換,便實現了.***主程式對驅動程式中非託管資料型別的獲取和處理。

用C 開發網路防火牆技術分析

n byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.net開發的個人版防火牆。在n byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。由於軟體的主程式是用c 寫...

用C 開發網路防火牆技術分析

用c 開發網路防火牆技術分析 n byte網路守望者是一款單機版網路安全工具,簡言之,就是乙個用.開發的個人版防火牆。在n byte網路守望者1.0版的開發中,使用了ndis hook driver技術來實現網路封包過濾功能,這使n byte網路守望者能夠在網路層過濾網路封包,從而實現強大的功能。由...

防火牆技術與網路攻擊

防火牆技術與網路攻擊 考法分析 本知識點的考查形式主要有 對於防火牆技術的描述判斷正誤 給定一些描述判斷所屬的網路攻擊分類或具體的網路攻擊方式 主要有拒絕服務 流量分析 重放等 要點分析 1 網路攻擊分類如下圖所示 2 常見的攻擊行為 1 拒絕服務 攻擊者利用眾多傀儡主機向伺服器傳送服務請求,導致伺...