狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當(dāng)前位置:系統(tǒng)之家 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

用C#開發(fā)網(wǎng)絡(luò)防火墻技術(shù)區(qū)分

用C#開發(fā)網(wǎng)絡(luò)防火墻技術(shù)區(qū)分

更新時(shí)間:2019-08-21 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

  N-Byte網(wǎng)絡(luò)守望者是一款單機(jī)版網(wǎng)絡(luò)安全工具,簡(jiǎn)言之,就是一個(gè)用.NET開發(fā)的個(gè)人版防火墻。在N-Byte網(wǎng)絡(luò)守望者1.0版的開發(fā)中,使用了NDIS Hook Driver技術(shù)來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)封包過(guò)濾功能,這使N-Byte網(wǎng)絡(luò)守望者能夠在網(wǎng)絡(luò)層過(guò)濾網(wǎng)絡(luò)封包,從而實(shí)現(xiàn)強(qiáng)大的功能。

  由于軟件的主程序是用C#寫的,C#中沒有提供具有類似DeviceIoControl函數(shù)功能的驅(qū)動(dòng)設(shè)備控制函數(shù),而NDIS Hook Driver技術(shù)下的驅(qū)動(dòng)程序是用DDK下的C語(yǔ)言寫的,為了能夠?qū)崿F(xiàn)主程序?qū)︱?qū)動(dòng)程序的控制和相互通信,采用了以下設(shè)計(jì)方案:

  在以上方案中,需要一個(gè)負(fù)責(zé)主程序與NDIS Hook Driver驅(qū)動(dòng)程序通信與控制的模塊DriverDll.dll,并用C#編寫的一個(gè)封裝驅(qū)動(dòng)程序中封包信息的模塊,可以發(fā)送這個(gè)驅(qū)動(dòng)程序信息到主程序,主程序可識(shí)別并操作模塊中的數(shù)據(jù)類型。

  在.NET應(yīng)用程序使用驅(qū)動(dòng)程序的問(wèn)題上,面臨著兩個(gè)問(wèn)題:

  1.怎樣實(shí)現(xiàn).NET應(yīng)用程序控制驅(qū)動(dòng)程序的功能?

  2.怎樣從驅(qū)動(dòng)程序向.NET應(yīng)用程序傳遞非托管的數(shù)據(jù)類型?

  以下是我們就這些問(wèn)題的詳細(xì)解決方法:

  怎樣實(shí)現(xiàn).NET應(yīng)用程序控制驅(qū)動(dòng)程序的功能?

  使用托管C++編寫的DriverDll.dll來(lái)實(shí)現(xiàn)對(duì)驅(qū)動(dòng)程序的直接控制,而主程序通過(guò)調(diào)用其中的方法來(lái)實(shí)現(xiàn)對(duì)驅(qū)動(dòng)程序的間接控制。比如在NByte.h文件中定義了START_IP_HOOK常數(shù)用來(lái)作為傳給驅(qū)動(dòng)程序用來(lái)開啟驅(qū)動(dòng)程序封包過(guò)濾功能的參數(shù),下面在托管C++模塊中定義了IoCtrl托管類并定義了下面的向緩沖區(qū)寫入?yún)?shù)的方法:

//向緩沖區(qū)寫入數(shù)據(jù)。

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;

}

  當(dāng)然直接使用這個(gè)方法不太方便,所以定義一個(gè)公有函數(shù),用來(lái)提供給主程序調(diào)用:

//開始進(jìn)行封包過(guò)濾

bool StartIpHook()

{
 return (WriteIo(START_IP_HOOK, NULL, 0)==SUCCESS);
}

  這樣,只要在主程序中聲明IoCtrl的對(duì)象ic,就可以通過(guò)ic.StartIpHook()就可以實(shí)現(xiàn)對(duì)驅(qū)動(dòng)程序過(guò)濾功能的開啟,用同樣的方法也可以實(shí)現(xiàn)對(duì)驅(qū)動(dòng)程序進(jìn)行其它操作,比如添加、修改封包過(guò)濾規(guī)則等。

  怎樣從驅(qū)動(dòng)程序向.NET應(yīng)用程序傳遞非托管的數(shù)據(jù)類型?

  為了能夠輸出安全日志,必須讓主程序獲得驅(qū)動(dòng)程序中的封包信息。使用信號(hào)量機(jī)制可以很方便的實(shí)現(xiàn)驅(qū)動(dòng)程序和非托管代碼間的信息傳遞,那么對(duì)托管代碼呢?這需要向.NET應(yīng)用程序傳遞非托管的數(shù)據(jù)類型ACCESS_INFO。在NByte.h中,是這樣定義這個(gè)ACCESS_INFO結(jié)構(gòu)的:

typedef struct _ACCESS_INFO

{
 USHORT protocol;
 ULONG sourceIp;
 ULONG destinationIp;
 USHORT sourcePort;
 USHORT destinationPort;
}ACCESS_INFO;

  顯然,直接傳遞非托管數(shù)據(jù)類型是不可以的,需要轉(zhuǎn)換一下。首先,在IoCtrl類中定義了幾個(gè)要傳遞的封包信息參數(shù):

public __gc class IoCtrl
{
 public:
  USHORT protocol; //網(wǎng)際協(xié)議類型
  ULONG sourceIp; //源IP地址
  ULONG destinationIp; //目的IP地址
  USHORT sourcePort; //源端口
  USHORT destinationPort; //目的端口
  ………………
}

  然后,在GetAccessInfo()函數(shù)中來(lái)給這些參數(shù)賦值:

void GetAccessInfo()
{
 ACCESS_INFO ai;
 bool result=(ReadIo(GET_INFO,&ai,sizeof(ai))==SUCCESS);
 this->protocol=ai.protocol;
 this->sourceIp=ai.sourceIp;
 this->destinationIp=ai.destinationIp;
 this->sourcePort=ai.sourcePort;
 this->destinationPort=ai.destinationPort;

  既然在IoCtrl類中獲得了這些信息,但是需要把它們封裝成主程序容易處理的數(shù)據(jù)類型,這樣,用C#實(shí)現(xiàn)了InfoEvent類用來(lái)封裝這些信息:

//本類封裝了數(shù)據(jù)包的詳細(xì)信息,可以通過(guò)事件實(shí)現(xiàn)對(duì)它的模塊間傳遞。

public class InfoEvent:EventArgs
{
 string sInfo; //用來(lái)存放輸出信息的私有成員
 public int pLength; //CommonFunction.sPort數(shù)組的長(zhǎng)度
 public ushort protocol; //網(wǎng)絡(luò)通信協(xié)議類型
 public uint sourceIp; //數(shù)據(jù)包的源IP
 public uint destinationIp; //數(shù)據(jù)包的目的IP
 public ushort sourcePort; //數(shù)據(jù)包的源端口
 public ushort destinationPort; //數(shù)據(jù)包的目的端口
 ………………………………
}

  下面在用托管C++實(shí)現(xiàn)的InfoProvider驅(qū)動(dòng)程序信息提供者類中把個(gè)InfoEvent類的對(duì)象傳遞給主程序,需要使用一個(gè)委托生成一個(gè)事件:

//聲明委托事件,用來(lái)向主程序傳遞數(shù)據(jù)。

__delegate void DriverInfo(Object* sender, InfoEvent* e);

//聲明響應(yīng)事件函數(shù)。

__event DriverInfo* OnDriverInfo;

  然后在InfoProvider驅(qū)動(dòng)程序信息提供者類中定義一個(gè)方法,在主程序中以線程的方式運(yùn)行這個(gè)方法,在這個(gè)方法中使用了事件函數(shù)OnDriverInfo:

//用來(lái)獲得驅(qū)動(dòng)程序信息的進(jìn)程,在主程序中將開啟該進(jìn)程。

void GetInfoThreadProc()
{
 this->hEvent=OpenEvent(SYNCHRONIZE,FALSE,"NBEvent");
 if(!ic->GetDriverHandle())
 {
  return;
 }

 while(true)
 {
  f(!hEvent)
  ExitThread(0);
  WaitForSingleObject(this->hEvent,INFINITE);
  nPackets++;
  ic->GetAccessInfo();
  ic->ResetEvent();
  //定義一個(gè)主程序可以識(shí)別的對(duì)象,通過(guò)OnDriverInfo傳給主程序。
  InfoEvent*ie=new InfoEvent(ic->protocol,ic->sourceIp,ic->destinationIp,ic->sourcePort,ic->destinationPort);

  OnDriverInfo(this,ie);
 }

 ic->CloseDriverHandle();
 return;
}

  在主程序中,會(huì)開啟這個(gè)進(jìn)程并定義了OnDriverInfo的處理函數(shù)DealWithInfo:

pInfo=new InfoProvider();

//開啟與驅(qū)動(dòng)交換信息的進(jìn)程

FilterThread=new Thread(new ThreadStart(pInfo.GetInfoThreadProc));
FilterThread.IsBackground=true;
FilterThread.Start();
pInfo.OnDriverInfo+=new InfoProvider.DriverInfo(DealWithInfo); 

  這樣主程序就可以在DealWithInfo函數(shù)中加入對(duì)InfoEvent對(duì)象的處理了。可見,通過(guò)中間模塊IoCtrl的轉(zhuǎn)換,便實(shí)現(xiàn)了.NET主程序?qū)︱?qū)動(dòng)程序中非托管數(shù)據(jù)類型的獲取和處理。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
一区二区三区欧美日| 国产suv精品一区二区883| 欧美高清在线视频| 久久综合999| 精品国精品国产尤物美女| 欧美另类z0zxhd电影| 欧美性大战久久久久久久蜜臀| 久久精品一区二区国产| 色999日韩国产欧美一区二区| 欧美中文字幕| 欧美系列亚洲系列| 欧美精品v国产精品v日韩精品| 欧美日韩国产片| 91精品国产手机| 亚洲精品在线观看网站| 久久综合色播五月| 国产精品免费丝袜| 有码一区二区三区| 日韩黄色一级片| 国产精品中文字幕欧美| gogogo免费视频观看亚洲一| 国产精品v欧美精品∨日韩| 亚洲成人原创| 久久中文精品| 日韩欧美一二区| 国产精品女同一区二区三区| 亚洲精品乱码久久久久久久久| 亚洲国产毛片aaaaa无费看| 男女性色大片免费观看一区二区| 国产伦精品一区二区三区视频青涩 | 中文字幕免费一区| 一卡二卡三卡日韩欧美| 亚洲精品国产系列| 国产一区二区精品久久91| 香蕉成人伊视频在线观看| 国产精品色婷婷| 亚洲综合一二三区| 欧美国产国产综合| 国产日韩欧美a| 国产精品系列在线| 欧美一区二区三区四区五区 | 精品亚洲国产成人av制服丝袜| 国产精品18久久久久久久久| 欧美三级网页| 欧美亚洲综合网| 国产欧美精品日韩区二区麻豆天美| 亚洲高清不卡在线观看| 成人小视频免费在线观看| 欧美中文字幕亚洲一区二区va在线 | 欧美精品一区二区三区一线天视频| 中文一区二区在线观看 | 亚洲韩国一区二区三区| 国产精品一区二区三区网站| 欧美三级蜜桃2在线观看| 日韩av在线免费观看不卡| 亚洲男人影院| 亚洲成人动漫精品| 久久精品一本| 日日夜夜精品视频天天综合网| 国产免费成人| 天天色天天操综合| 色妹子一区二区| 午夜av区久久| 一本色道久久综合亚洲aⅴ蜜桃| 日日夜夜一区二区| 欧美三级韩国三级日本一级| 经典三级在线一区| 欧美一区二区精品久久911| 懂色av一区二区夜夜嗨| 久久你懂得1024| 欧美天堂亚洲电影院在线观看| 国产精品久久777777| 亚洲国产综合在线看不卡| 一区二区三区在线观看网站| 六月婷婷一区| 麻豆精品视频在线观看免费 | 国产成+人+日韩+欧美+亚洲| 欧美α欧美αv大片| 色综合一区二区三区| 国产精品久久久久桃色tv| 亚洲青色在线| 爽好多水快深点欧美视频| 欧美视频中文一区二区三区在线观看| 久久福利资源站| 欧美一级精品大片| 午夜日韩在线| 亚洲.国产.中文慕字在线| 欧美日本精品一区二区三区| 成年人国产精品| 国产精品第一页第二页第三页| 性刺激综合网| 国产一区91精品张津瑜| 国产精品天干天干在观线| 麻豆av一区二区三区| 国产精品91xxx| 中文字幕在线观看不卡| 日本韩国精品在线| 99视频有精品| 亚洲高清免费一级二级三级| 91精品国产入口在线| 狠色狠色综合久久| 久久超碰97人人做人人爱| 国产性做久久久久久| 免费久久99精品国产自| 国产二区国产一区在线观看| 日韩毛片视频在线看| 欧美在线看片a免费观看| 欧美一区二区三区在线免费观看| 夜夜精品视频一区二区 | 亚洲巨乳在线| 国产在线一区观看| 亚洲桃色在线一区| 欧美日韩一区二区三区四区| 欧美高清不卡| 麻豆精品视频在线观看免费| 国产精品理论片| 欧美精品日韩一本| 一区二区国产在线观看| 亚洲激情一区二区| 久久精品国产免费| 亚洲色图欧洲色图婷婷| 91 com成人网| 亚洲一区二区三区欧美| 成人精品视频一区| 日韩专区在线视频| 国产精品毛片大码女人| 制服丝袜在线91| 免费亚洲电影| 欧美日韩国产成人精品| 久久国产综合精品| 一区二区三区欧美日韩| 久久精品人人爽人人爽| 欧美亚洲综合在线| 亚洲精品在线观看免费| 91在线观看地址| 国产成人精品影院| 午夜国产精品一区| 中文字幕中文字幕在线一区| 精品欧美乱码久久久久久1区2区| 久久久久久夜| 亚洲精品一区二区三区av| 91婷婷韩国欧美一区二区| 国产一区二区三区美女| 日韩精品亚洲一区二区三区免费| 国产精品美女久久久久高潮| 欧美videossexotv100| 欧美日韩精品一二三区| 裸体一区二区| 国产精品一区视频| 亚洲精品在线视频观看| 国户精品久久久久久久久久久不卡| 国产99久久久国产精品免费看 | 精品少妇一区二区三区在线视频| 91黄色激情网站| 国产精品美女| 亚洲电影成人| 国内一区二区三区| 欧美婷婷在线| 午夜国产一区| 欧美成人一区二区在线| 99精品热视频| 日本中文字幕不卡| 欧美三级欧美一级| 欧美另类视频| 欧美日韩一区二区三区在线| 麻豆精品网站| 久久久噜噜噜久久狠狠50岁| 亚洲欧美日韩一区在线观看| 一区二区久久| 国产精品伊人日日| 久久中文在线| 欧美综合一区二区| 欧美日韩在线观看一区二区| 欧美精品一线| 精品精品国产高清一毛片一天堂| 美洲天堂一区二卡三卡四卡视频| 中国成人亚色综合网站| 国产精品国产三级国产aⅴ入口| 91视视频在线观看入口直接观看www| 91久久精品一区二区三| 亚洲高清久久久| 日韩三级免费观看| 国产mv日韩mv欧美| 3d动漫精品啪啪一区二区竹菊| 欧美午夜片在线看| 6080国产精品一区二区| 91精品国产黑色紧身裤美女| 91精品国产综合久久久久久久| 在线电影国产精品| 精品国产亚洲一区二区三区在线观看| 精品99一区二区三区| 中文字幕欧美激情| 亚洲国产人成综合网站| 久久精品99国产精品日本| 国产成人av一区二区三区在线 | 国产精品日日摸夜夜摸av| 成人免费视频在线观看| 日韩中文字幕一区二区三区| 久久国产尿小便嘘嘘| 99精品久久只有精品|