欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      數(shù)據(jù)包必讀!

      時(shí)間:2019-05-14 01:40:51下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《數(shù)據(jù)包必讀!》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《數(shù)據(jù)包必讀!》。

      第一篇:數(shù)據(jù)包必讀!

      數(shù)據(jù)包須知

      1.價(jià)格問(wèn)題:數(shù)據(jù)包里的價(jià)格為銷售價(jià)。

      數(shù)據(jù)包里excel形式的表格為成本單。

      注意:鞋子重量稍重 有些可能超重需要補(bǔ)價(jià)郵費(fèi)請(qǐng)注意!

      2.缺斷貨信息問(wèn)題:請(qǐng)以軟件更新為準(zhǔn)或咨詢?cè)诰€客服(斷缺貨可能出現(xiàn)更新不及時(shí)還請(qǐng)諒解)

      3.新增產(chǎn)品問(wèn)題:新增加的產(chǎn)品會(huì)在官網(wǎng)中增加數(shù)據(jù)包,請(qǐng)留意第五代官網(wǎng)及公告。

      4數(shù)據(jù)包下載以后-利用淘寶助理上傳(修改寶貝名稱)上傳店鋪—設(shè)置運(yùn)費(fèi)模板—進(jìn)行銷售

      5;郵費(fèi)的收取標(biāo)準(zhǔn)

      數(shù)據(jù)包數(shù)量較多,若出現(xiàn)扣分降權(quán)等問(wèn)題請(qǐng)及時(shí)聯(lián)系在線客服,如果出現(xiàn)價(jià)格不對(duì)的問(wèn)題請(qǐng)及時(shí)聯(lián)系在線客服以便修正

      注意:商品退換貨問(wèn)題請(qǐng)聯(lián)系在線客服

      甘肅省,青海省,寧夏,黑龍江省,吉林省,遼寧省,北京市,上海市,天津市,重慶市,安徽省,福建省,廣

      順豐快遞 東省,廣西,貴州省,河北省,河南省,湖北省,湖南省,20 1 20

      江蘇省,江西省,山東省,山西省,陜西省,四川省,云

      南省,浙江省,海南省,新疆,內(nèi)蒙古,西藏

      甘肅省,青海省,寧夏,黑龍江省,吉林省,遼寧省,北京市,上海市,天津市,重慶市,安徽省,福建省,廣

      EMS 東省,廣西,貴州省,河北省,河南省,湖北省,湖南省,25 0.5 20

      江蘇省,江西省,山東省,山西省,陜西省,四川省,云

      南省,浙江省,海南省,新疆,內(nèi)蒙古,西藏

      甘肅省,青海省,寧夏,黑龍江省,吉林省,遼寧省,北京市,上海市,天津市,重慶市,安徽省,福建省,廣

      fedex 東省,廣西,貴州省,河北省,河南省,湖北省,湖南省,30 0.5 30

      江蘇省,江西省,山東省,山西省,陜西省,四川省,云

      南省,浙江省,海南省,新疆,內(nèi)蒙古,西藏0.5 0.5

      第二篇:計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì) 發(fā)送TCP數(shù)據(jù)包

      課設(shè)名稱:發(fā)送TCP數(shù)據(jù)包

      班級(jí):

      學(xué)號(hào):

      姓名:

      指導(dǎo)老師: 日期: 2012.6.15

      計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告

      目錄

      一.設(shè)計(jì)題目與要求........................................................................................................2

      1.設(shè)計(jì)題目................................................................................................................2

      2.設(shè)計(jì)要求................................................................................................................2

      二.需求分析...................................................................................................................2三.詳細(xì)設(shè)計(jì)...................................................................................................................2

      1.創(chuàng)建一個(gè)原始套接字,并設(shè)置IP頭選項(xiàng).................................................................3

      2.構(gòu)造IP頭和TCP頭...............................................................................................3

      3.計(jì)算校驗(yàn)和的子函數(shù)..............................................................................................4

      4.流程圖...................................................................................................................6

      四.調(diào)試分析...................................................................................................................7

      五.運(yùn)行結(jié)果...................................................................................................................7

      六.總結(jié)..........................................................................................................................8

      七.源程序......................................................................................................................9

      發(fā)送TCP數(shù)據(jù)包

      一.設(shè)計(jì)題目與要求

      1.設(shè)計(jì)題目

      發(fā)送TCP數(shù)據(jù)包 2.設(shè)計(jì)要求

      本設(shè)計(jì)的功能是填充一個(gè)TCP數(shù)據(jù)包,并發(fā)送給目的主機(jī)。

      1)以命令行形式運(yùn)行:TCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號(hào),dest_ip為目的地址,dest_port為目的端口號(hào)。

      2)其他的TCP頭部參數(shù)請(qǐng)自行設(shè)定。3)數(shù)據(jù)字段為“hello”。

      4)成功發(fā)送后在屏幕上輸出“send OK”。

      二.需求分析

      1.本程序需完成發(fā)送一個(gè)TCP數(shù)據(jù)包給目的主機(jī)

      2.程序的輸入:TCP source_ip source_port dest_ip dest_port,然后根據(jù)提示輸入要發(fā)送的數(shù)據(jù),回車即可。

      3.程序的輸出:Send OK!

      4.測(cè)試數(shù)據(jù) TCP 192.168.1.100 200 192.168.1.101 200

      三.詳細(xì)設(shè)計(jì)

      本課程設(shè)計(jì)的目標(biāo)是發(fā)送一個(gè)TCP數(shù)據(jù)包,可以利用原始套接字來(lái)完成這個(gè)工作。整個(gè)程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個(gè)部分組成。

      2發(fā)送TCP數(shù)據(jù)包

      1.創(chuàng)建一個(gè)原始套接字,并設(shè)置IP頭選項(xiàng)

      SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:

      sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);這里,設(shè)置了SOCK_RAW標(biāo)志,表示我們聲明的是一個(gè)原始套接字類型。為使用發(fā)送接收超時(shí)設(shè)置,必須將標(biāo)志位置位置為WSA_FLAG_OVERLAPPED。在本課程設(shè)計(jì)中,發(fā)送TCP包時(shí)隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項(xiàng)。其中flag設(shè)置為ture,并設(shè)定 IP_HDRINCL 選項(xiàng),表明自己來(lái)構(gòu)造IP頭。

      setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char *)&Flag, sizeof(Flag));int timeout=1000; setsockopt(sock, sizeof(timeout));在這里我們使用基本套接字SOL_SOCKET,設(shè)置SO_SNDTIMEO表示使用發(fā)送超時(shí)設(shè)置,超時(shí)時(shí)間設(shè)置為1000ms。2.構(gòu)造IP頭和TCP頭

      這里,IP頭和TCP頭以及TCP偽部的構(gòu)造請(qǐng)參考下面它們的數(shù)據(jù)結(jié)構(gòu)。

      typedef struct _iphdr //定義IP首部 { UCHAR h_lenver;//4位首部長(zhǎng)度+4位IP版本號(hào) UCHAR tos;//8位服務(wù)類型TOS

      USHORT total_len;//16位總長(zhǎng)度(字節(jié))USHORT ident;//16位標(biāo)識(shí)

      USHORT frag_and_flags;//3位標(biāo)志位 UCHAR ttl;//8位生存時(shí)間 TTL

      UCHAR proto;//8位協(xié)議(TCP, UDP 或其他)

      SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,3發(fā)送TCP數(shù)據(jù)包

      USHORT checksum;//16位IP首部校驗(yàn)和 ULONG sourceIP;//32位源IP地址

      ULONG destIP;//32位目的IP地址

      }IP_HEADER;typedef struct psd_hdr //定義TCP偽首部 { ULONG saddr;ULONG daddr;//源地址 //目的地址

      UCHAR mbz;//沒(méi)用 UCHAR ptcl;

      USHORT tcpl;//協(xié)議類型 //TCP長(zhǎng)度

      }PSD_HEADER;typedef struct _tcphdr //定義TCP首部 { USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列號(hào) ULONG th_ack;//32位確認(rèn)號(hào)

      UCHAR th_lenres;//4位首部長(zhǎng)度/6位保留字 UCHAR th_flag;//6位標(biāo)志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校驗(yàn)和 USHORT th_urp;//16位緊急數(shù)據(jù)偏移量

      }TCP_HEADER;

      3.計(jì)算校驗(yàn)和的子函數(shù)

      在填充數(shù)據(jù)包的過(guò)程中,需要調(diào)用計(jì)算校驗(yàn)和的函數(shù)checksum兩次,分別用于校驗(yàn)IP頭和TCP頭部(加上偽頭部),其實(shí)現(xiàn)代碼如下:

      USHORT checksum(USHORT *buffer, int size)

      4發(fā)送TCP數(shù)據(jù)包

      { unsigned long cksum=0;while(size >1){ cksum+=*buffer++;size-=sizeof(USHORT);} if(size){ cksum += *(UCHAR*)buffer;} cksum =(cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >>16);return(USHORT)(~cksum);}

      5發(fā)送TCP數(shù)據(jù)包

      4.流程圖

      開(kāi)始構(gòu)造原始套接字并初始化填充IP首部計(jì)算IP首部校驗(yàn)和構(gòu)造TCP偽首部填充TCP首部計(jì)算TCP首部校驗(yàn)和填充發(fā)送緩沖區(qū)填入目的地址發(fā)送數(shù)據(jù)包結(jié)束

      6發(fā)送TCP數(shù)據(jù)包

      四.調(diào)試分析

      本程序流程簡(jiǎn)單,調(diào)試過(guò)程中沒(méi)有出現(xiàn)大的問(wèn)題。

      調(diào)試過(guò)程中沒(méi)有出現(xiàn)重大的語(yǔ)法錯(cuò)誤,主要是運(yùn)行的結(jié)果不理想,和預(yù)期的結(jié)果有差距。填充數(shù)據(jù)包的程序部分是不容易出錯(cuò)的。至于數(shù)據(jù)包的發(fā)送,由于是利用函數(shù)sendto()來(lái)實(shí)現(xiàn)的,而sendto()是面向UDP的,將協(xié)議類型修改為UDP(Header.proto=IPPROTO_UDP;)后,調(diào)試運(yùn)行成功,問(wèn)題得到解決。

      調(diào)試時(shí),要添加 #include #include #pragma comment(lib,“ws2_32.lib”)不然編譯出錯(cuò)。

      五.運(yùn)行結(jié)果

      1.輸入:TCP 192.168.1.100 200 192.168.1.101 200

      7發(fā)送TCP數(shù)據(jù)包

      2.輸入要發(fā)送的字符串:“hello”按Ctrl+Z發(fā)送

      六.總結(jié)

      通過(guò)本次課程設(shè)計(jì),我對(duì)發(fā)送TCP數(shù)據(jù)包的原理有了一定的了解。理解了TCP數(shù)據(jù)報(bào)的報(bào)文格式、TCP連接時(shí)的三次握手和TCP連接結(jié)束時(shí)的四次握手的過(guò)程及它們的作用。此外,在設(shè)計(jì)過(guò)程中,通過(guò)查閱資料,也讓我對(duì)TCP的三大特點(diǎn)(流量控制、差錯(cuò)控制、擁塞控制)有了認(rèn)識(shí)。,在課程設(shè)計(jì)過(guò)程中,由于編程知識(shí)的欠缺,使我在課程設(shè)計(jì)過(guò)程中不是很順利,編程知識(shí)的欠缺是我的最大障礙,不過(guò),這也給了我動(dòng)力,我會(huì)努力去學(xué)好編程的相關(guān)知識(shí),為以后的學(xué)習(xí)和工作打下基礎(chǔ)。最后,感謝老師安排了此次課程設(shè)計(jì)。

      發(fā)送TCP數(shù)據(jù)包

      七.源程序

      #include #include #include #include #include #include #include #include #pragma comment(lib,“ws2_32.lib”)

      #define IPVER 4 //IP協(xié)議預(yù)定 #define MAX_BUFF_LEN 65500 //發(fā)送緩沖區(qū)最大值

      typedef struct ip_hdr //定義IP首部 {

      UCHAR h_verlen;//4位首部長(zhǎng)度,4位IP版本號(hào) UCHAR tos;//8位服務(wù)類型TOS USHORT total_len;//16位總長(zhǎng)度(字節(jié))USHORT ident;//16位標(biāo)識(shí) USHORT frag_and_flags;//3位標(biāo)志位 UCHAR ttl;//8位生存時(shí)間 TTL UCHAR proto;//8位協(xié)議(TCP, UDP 或其他)USHORT checksum;//16位IP首部校驗(yàn)和 ULONG sourceIP;//32位源IP地址 ULONG destIP;//32位目的IP地址

      發(fā)送TCP數(shù)據(jù)包

      }IP_HEADER;

      typedef struct tsd_hdr //定義TCP偽首部 {

      ULONG saddr;//源地址 ULONG daddr;//目的地址 UCHAR mbz;//沒(méi)用 UCHAR ptcl;//協(xié)議類型 USHORT tcpl;//TCP長(zhǎng)度

      }PSD_HEADER;

      typedef struct tcp_hdr //定義TCP首部 {

      USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列號(hào) ULONG th_ack;//32位確認(rèn)號(hào)

      UCHAR th_lenres;//4位首部長(zhǎng)度/6位保留字 UCHAR th_flag;//6位標(biāo)志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校驗(yàn)和

      USHORT th_urp;//16位緊急數(shù)據(jù)偏移量

      }TCP_HEADER;

      //CheckSum:計(jì)算校驗(yàn)和的子函數(shù)

      USHORT checksum(USHORT *buffer, int size){ unsigned long cksum=0;while(size >1)

      發(fā)送TCP數(shù)據(jù)包

      { cksum+=*buffer++;size-=sizeof(USHORT);} if(size){ cksum += *(UCHAR*)buffer;} cksum =(cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >>16);return(USHORT)(~cksum);}

      int ReadData(char *str,int maxlen){ int readlen=0;char ch=NULL;if(str==NULL||maxlen<=0){

      printf(“ReadData Error!!n”);

      return 0;//failed } printf(“Input Data(End By Ctrl+Z): n”);while(maxlen){

      ch=getchar();

      if(ch==EOF)break;

      str[readlen++]=ch;maxlen--;

      發(fā)送TCP數(shù)據(jù)包

      } } str[readlen]=NULL;return readlen;int main(int argc, char* argv[]){ WSADATA WSAData;SOCKET sock;

      IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;

      char Sendto_Buff[MAX_BUFF_LEN];//發(fā)送緩沖區(qū)

      unsigned short check_Buff[MAX_BUFF_LEN];//檢驗(yàn)和緩沖區(qū) char tcp_send_data[1000];

      BOOL flag;int rect,nTimeOver;if(argc!= 5){ printf(“Usage: SendTcp soruce_ip source_port dest_ip dest_port n”);return false;} read_data_len=ReadData(tcp_send_data,1000);int read_data_len=0;

      發(fā)送TCP數(shù)據(jù)包

      if(read_data_len<=0)return 1;

      if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0){ printf(“WSAStartup Error!n”);return false;} if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, WSA_FLAG_OVERLAPPED))==INVALID_SOCKET){ printf(“Socket Setup Error!n”);return false;} flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){ printf(“setsockopt IP_HDRINCL error!n”);return false;} nTimeOver=1000;if(setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,(char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR){ printf(“setsockopt SO_SNDTIMEO error!n”);return false;}

      發(fā)送TCP數(shù)據(jù)包

      //填充IP首部

      ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);ipHeader.ident=0;//16位標(biāo)識(shí) ipHeader.frag_and_flags=0;//3位標(biāo)志位 ipHeader.ttl=128;//8位生存時(shí)間 ipHeader.proto=IPPROTO_TCP;//協(xié)議類型 ipHeader.checksum=0;//檢驗(yàn)和暫時(shí)為0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址

      //計(jì)算IP頭部檢驗(yàn)和

      memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER));ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER));

      //構(gòu)造TCP偽首部

      psdHeader.saddr=ipHeader.sourceIP;psdHeader.daddr=ipHeader.destIP;psdHeader.mbz=0;psdHeader.ptcl=ipHeader.proto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+read_data_len);

      //填充TCP首部

      tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口號(hào) tcpHeader.th_sport=htons(atoi(argv[2]));//16位源端口號(hào)

      發(fā)送TCP數(shù)據(jù)包

      tcpHeader.th_seq=0;//SYN序列號(hào) tcpHeader.th_ack=0;//ACK序列號(hào)置為0 //TCP長(zhǎng)度和保留位

      tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0);tcpHeader.th_flag=2;//修改這里來(lái)實(shí)現(xiàn)不同的標(biāo)志位探測(cè),2是SYN,1是//FIN,16是ACK探測(cè) 等等

      tcpHeader.th_win=htons((unsigned short)16384);//窗口大小 tcpHeader.th_urp=0;//偏移大小 tcpHeader.th_sum=0;//檢驗(yàn)和暫時(shí)填為0

      //計(jì)算TCP校驗(yàn)和

      memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&psdHeader,sizeof(psdHeader));

      memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));

      //填充發(fā)送緩沖區(qū)

      memset(Sendto_Buff,0,MAX_BUFF_LEN);memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER));

      memcpy(Sendto_Buff+sizeof(IP_HEADER), &tcpHeader,sizeof(TCP_HEADER));memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+read_data_len);memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);

      發(fā)送TCP數(shù)據(jù)包

      int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//發(fā)送數(shù)據(jù)報(bào)的目的地址 SOCKADDR_IN dest;memset(&dest,0,sizeof(dest));dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(argv[3]);dest.sin_port=htons(atoi(argv[4]));

      rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest));if(rect==SOCKET_ERROR){ printf(“send error!:%dn”,WSAGetLastError());return false;} else

      closesocket(sock);WSACleanup();return 1;} printf(“nsend ok!n”);

      第三篇:數(shù)據(jù)包捕獲與協(xié)議實(shí)驗(yàn)報(bào)告

      計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)(實(shí)習(xí))報(bào)告

      Ⅰ.實(shí)驗(yàn)(實(shí)習(xí))名稱 :數(shù)據(jù)包捕獲與協(xié)議分析

      實(shí)驗(yàn)(實(shí)習(xí))日期

      專業(yè)姓名:學(xué)號(hào):(或使用青島農(nóng)業(yè)大學(xué)實(shí)驗(yàn)報(bào)告紙)

      1、實(shí)驗(yàn)?zāi)康模?)掌握網(wǎng)絡(luò)協(xié)議分析工具Ethereal的使用方法;

      (2)截獲數(shù)據(jù)包并對(duì)它們觀察和分析,了解協(xié)議的運(yùn)行機(jī)制;

      2、實(shí)驗(yàn)內(nèi)容:

      (1)設(shè)計(jì)一個(gè)捕獲HTTP實(shí)現(xiàn)的完整過(guò)程,并對(duì)捕獲的結(jié)果進(jìn)行分析和統(tǒng)計(jì)。

      要求:

      (2)設(shè)計(jì)一個(gè)捕獲TCP實(shí)現(xiàn)的完整過(guò)程,并對(duì)捕獲的結(jié)果進(jìn)行分析和統(tǒng)計(jì)。

      要求:給出捕獲某一數(shù)據(jù)包后的屏幕截圖。以16進(jìn)制形式顯示其包的內(nèi)容,并分析

      TCP報(bào)文(源端口、目的端口、序號(hào)、確認(rèn)號(hào),ACK、SYN、窗口等)。

      (3)設(shè)計(jì)一個(gè)捕獲ICMP實(shí)現(xiàn)的完整過(guò)程,并對(duì)捕獲的結(jié)果進(jìn)行分析和統(tǒng)計(jì)

      要求:給出捕獲某一數(shù)據(jù)包后的屏幕截圖。以16進(jìn)制形式顯示其包的內(nèi)容,并分析

      該ICMP報(bào)文。

      (4)設(shè)計(jì)一個(gè)捕獲IP數(shù)據(jù)包的過(guò)程,并對(duì)捕獲的結(jié)果進(jìn)行分析和統(tǒng)計(jì)

      要求:給出捕獲某一數(shù)據(jù)包后的屏幕截圖。以16進(jìn)制形式顯示其包的內(nèi)容,并分析

      在該數(shù)據(jù)包中的內(nèi)容:版本首部長(zhǎng)度、服務(wù)類型、總長(zhǎng)度、標(biāo)識(shí)、片偏移、壽命、協(xié)議、源Ip地址、目的地址

      3.實(shí)驗(yàn)總結(jié)(掌握了哪些內(nèi)容?遇到了什么問(wèn)題?如何解決的?你的體會(huì)或收獲如何?)

      第四篇:計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì) IP數(shù)據(jù)包解析

      課設(shè)名稱:IP數(shù)據(jù)包解析

      級(jí):

      學(xué)

      號(hào):

      名:

      指導(dǎo)老師:

      日期: 2012.6.15

      計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告

      目錄

      1.課程設(shè)計(jì)目的..............................................................1

      2.課程設(shè)計(jì)要求..............................................................1

      3.程序設(shè)計(jì)分析..............................................................1

      3.1 網(wǎng)卡設(shè)置................................................................1

      3.2 使用套接字..............................................................2

      3.2.2 接收數(shù)據(jù)包.............................................................2

      3.3 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)....................................................3

      3.4 IP包的解析..............................................................3

      3.5 協(xié)議的定義..............................................................4

      3.6捕獲處理.................................................................4

      4.運(yùn)行結(jié)果..................................................................5

      5.總結(jié)......................................................................5

      6.源程序代碼................................................................6

      Ip數(shù)據(jù)包解析

      1.課程設(shè)計(jì)目的

      本課程設(shè)計(jì)的目的就是設(shè)計(jì)一個(gè)捕獲并解析IP數(shù)據(jù)包的程序,并根據(jù)這個(gè)程序,說(shuō)明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問(wèn)題,從而對(duì)IP層的工作原理有更好的理解和認(rèn)識(shí)。

      2.課程設(shè)計(jì)要求

      本設(shè)計(jì)的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。程序的具體要求如下:

      1)以命令行形式運(yùn)行:ipparse logfile,其中ipparse是程序名, 而logfile則代表記錄結(jié)果的日志文件。

      2)在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長(zhǎng)度、服務(wù)類型、數(shù)據(jù)包總長(zhǎng)度、數(shù)據(jù)包標(biāo)識(shí)、分段標(biāo)志、分段偏移值、生存時(shí)間、上層協(xié)議類型、頭校驗(yàn)和、源IP地址和目的IP地址等內(nèi)容。

      3)當(dāng)程序接收到鍵盤輸入Ctrl+C時(shí)退出

      3.程序設(shè)計(jì)分析

      3.1 網(wǎng)卡設(shè)置

      為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里使用套接字(socket)進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對(duì)于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地

      Ip數(shù)據(jù)包解析

      址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取與自己無(wú)關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。

      3.2 使用套接字

      套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報(bào)套接字(Datagram Socket)和原始套接字(Raw Socket)。要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下: Socket sock: Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped): 本設(shè)計(jì)不用考慮超時(shí)情況。

      創(chuàng)建套接后,IP頭就會(huì)包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項(xiàng),調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP-HDRINCL選項(xiàng),表明用戶可以親自對(duì)IP頭進(jìn)行處理。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡(luò)數(shù)據(jù)。如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過(guò)的IP包。

      3.2.2 接收數(shù)據(jù)包

      在程序中可使用recv()函數(shù)接收經(jīng)過(guò)的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收操作所用的套接字描述符;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如

      Ip數(shù)據(jù)包解析

      果對(duì)所發(fā)送的數(shù)據(jù)沒(méi)特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長(zhǎng)度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來(lái)反復(fù)監(jiān)聽(tīng)接收IP包,用recv()函數(shù)實(shí)現(xiàn)接收功能。

      3.3 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)

      程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下: struct IP_HEADER { unsigned short ip_version, /*IP的版本號(hào) */ ip_hdr_len; /*IP包頭的長(zhǎng)度*/ ip_tos; /*IP包的服務(wù)類型*/ ip_total_len; /*IP包的總長(zhǎng)度*/ ip_id; /*IP包的分段標(biāo)識(shí)*/ ip_flags; /*IP包的分段標(biāo)志*/ ip_frag_offset; /*IP包的分段偏移*/ ip_ttl; /*IP包的生存時(shí)間*/ ip_proto; /*IP包的高層協(xié)議*/ ip_hdr_chksum;/*IP包的校驗(yàn)和*/ struct IPADDRESS ip_src_addr; /*IP包的源IP地址*/ ip_dest_addr; /*IP包的目的IP地址*/ }ipheader;3.4 IP包的解析

      Ip數(shù)據(jù)包解析

      解析IP包的字段有兩種策略。針對(duì)長(zhǎng)度為8位、16位和32位的字段(或子字段)時(shí),可以利用IP-HEADER的成員直接獲取。要解析長(zhǎng)度不是8位倍數(shù)的字段(或子字段)時(shí),可以利用C語(yǔ)言中的移位以人、及與、或操作完成。

      3.5 協(xié)議的定義

      (包含相應(yīng)的頭文件#include #include):

      DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/ dwProtocol=IPPROTO_IP;/*協(xié)議類型為IP*/

      3.6捕獲處理

      1.加載 Winsock;

      2.創(chuàng)建一個(gè)接收原始IP包的socket連接; 3.綁定到一個(gè)接口;

      4.進(jìn)行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:

      if(WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL)== SOCKET_ERROR)5.接著設(shè)定一個(gè)線程進(jìn)行捕獲:(1)創(chuàng)建一個(gè)接收IP包的鏈表頭;

      (2)設(shè)置一個(gè)標(biāo)識(shí),為真,則不斷進(jìn)行IP包的捕獲;(3)建立一個(gè)新的結(jié)點(diǎn),將捕獲的數(shù)據(jù)包加入到該結(jié)點(diǎn);

      (4)如果鏈表的長(zhǎng)度達(dá)到指定的長(zhǎng)度,創(chuàng)建一個(gè)線程對(duì)該鏈表的IP包進(jìn)行解析;再設(shè)置一個(gè)在IP數(shù)據(jù)包鏈表不足給定的長(zhǎng)度,而又中止IP捕獲時(shí),對(duì)鏈表的處理;

      Ip數(shù)據(jù)包解析

      (5)為下一個(gè)IP包鏈表創(chuàng)建一個(gè)鏈表頭。

      6.建立一個(gè)進(jìn)行IP包解析并顯示的線程,進(jìn)行解析IP數(shù)據(jù)包,然后顯示IP數(shù)據(jù)包。

      4.運(yùn)行結(jié)果

      截獲IP數(shù)據(jù)包程序運(yùn)行結(jié)果如下:

      5.總結(jié)

      在本次課程設(shè)計(jì)中,通過(guò)多次上機(jī)的實(shí)踐,充分利用所學(xué)的計(jì)算機(jī)網(wǎng)絡(luò)以及socket編程與C語(yǔ)言編程的知識(shí),并上網(wǎng)搜索一部分相當(dāng)資料,粗略設(shè)計(jì)出該程序。

      通過(guò)本次課程設(shè)計(jì),充分運(yùn)用了所學(xué)的計(jì)算機(jī)網(wǎng)絡(luò)知識(shí),設(shè)計(jì)出了如何解析IP數(shù)據(jù)包,從而更加深刻的了解到了IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問(wèn)題,從而對(duì)IP層的工作原理有更好的理解和認(rèn)識(shí)。

      Ip數(shù)據(jù)包解析

      在課程設(shè)計(jì)的過(guò)程也碰到的不少問(wèn)題。例如:對(duì)IP數(shù)據(jù)包的結(jié)構(gòu)不了解、IP層工作原理也不熟悉、C語(yǔ)言編程基礎(chǔ)差等一系列問(wèn)題。讓我認(rèn)識(shí)到了自己的很大不足,在以后的學(xué)習(xí)過(guò)程中還將努力提高。

      6.源程序代碼

      #include “winsock2.h” #include “ws2tcpip.h” #include “iostream.h” #include “stdio.h”

      #pragma comment(lib, “ws2_32.lib”)

      #define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535

      /* 定義IP頭部數(shù)據(jù)結(jié)構(gòu) */ typedef struct _IP_HEADER{

      union{

      };BYTE ServiceType;//服務(wù)類型 WORD TotalLen;//總長(zhǎng)度 WORD ID;//標(biāo)識(shí) union{

      };BYTE TimeToLive;WORD Flags;WORD FragOff;BYTE Version;//版本(前4位)

      BYTE HdrLen;//報(bào)頭標(biāo)長(zhǎng)(后四位),IP頭長(zhǎng)度

      Ip數(shù)據(jù)包解析

      BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;}IP_HEADER;

      //逐位解析IP頭中的信息,獲取版本號(hào) void getVersion(BYTE b,BYTE &version){ }

      void getIHL(BYTE b,BYTE &result){ }

      //解析服務(wù)類型

      char * parseServiceType_getProcedence(BYTE b){

      version = b>>4;result =(b & 0x0f)*4;switch(b>>5){

      case 7: return “Network Control”;case 6: return “Internet work Control”;case 5: return “CRITIC/ECP”;case 4: return “Flash Override”;

      Ip數(shù)據(jù)包解析

      }

      } case 3: return “Falsh”;case 2: return “Immediate”;case 1: return “Priority”;case 0: return “Routine”;default: return “Unknown”;char * parseServiceType_getTOS(BYTE b){

      b=(b>>1)&0x0f;switch(b){ case 0: return “Normal service”;

      case 1:

      return “Minimize monetary cost”;case 2: return “Maximize reliability”;case 4: return “Maximize throughput”;case 8: return “Minimize delay”;case 15: return “Maximize security”;default: return “Unknown”;

      Ip數(shù)據(jù)包解析

      } } /* 獲取禁止分片標(biāo)志和分片標(biāo)志 */ void getFlags(WORD w,BYTE &DF, BYTE &MF){

      }

      /* 獲取分片偏移量 */ void getFragoff(WORD w,WORD &fragoff){ }

      //獲取協(xié)議

      char * getProtocol(BYTE Protocol){

      DF=(w>>14)&0x01;MF=(w>>13)&0x01;fragoff=w&0x1ffff;switch(Protocol){

      case 1: return “ICMP”;case 2: return “IGMP”;case 3: return “GGP”;case 4: return “IP in IP ”;case 6: return “TCP”;case 8: return “EGP”;case 17:

      Ip數(shù)據(jù)包解析

      }

      } return “UDP”;case 41: return “IPv6”;case 46: return “OSPF”;default: return “UNKNOWN”;/* 解析IP數(shù)據(jù)包 */ void ipparse(FILE * file,char *buffer){

      IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf(file,“版本=IPV%drn”,version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,“頭長(zhǎng)度=%d(BYTE)rn”,headerLen);fprintf(file,“服務(wù)類型=%s,%srn”, parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType));fprintf(file,“數(shù)據(jù)報(bào)長(zhǎng)度=%d(BYTE)rn”,ip.TotalLen);fprintf(file,“數(shù)據(jù)報(bào)ID=%drn”,ip.ID);/* DF表示禁止分片標(biāo)志,MF表示分片標(biāo)記 */ BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,“分段標(biāo)志 DF=%d,MF=%drn”,DF,MF);WORD fragOff;

      Ip數(shù)據(jù)包解析

      } getFragoff(ip.FragOff,fragOff);fprintf(file,“分段偏移值=%drn”,fragOff);fprintf(file,“生存期=%d(hops)rn”,ip.TimeToLive);fprintf(file,“協(xié)議=%srn”,getProtocol(ip.Protocol));fprintf(file,“頭校驗(yàn)和=0x%0xrn”,ip.HdrChksum);fprintf(file,“源IP地址=%srn”,inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,“目的IP地址=%srn”,inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,“__________________________________rn”);

      /* 程序入口 */ int main(int argc,char *argv[]){

      /* cmd參數(shù) */ if(argc!=2){

      } printf(“usage error!n”);return-1;FILE *file;/* 以讀寫的方式建立一個(gè)文本文件logfile.txt */ if((file=fopen(argv[1],“w+”))==NULL){

      }

      WSAData wsData;/* 啟動(dòng)2.2版本的Socket,并將Socket版本信息保存到wsData中 */ if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){ printf(“WSA startup failed!n”);return-1;printf(“fail to open file %s”,“l(fā)ogfile.txt”);return-1;

      Ip數(shù)據(jù)包解析

      } fprintf(file,“Socket初始化...rn”);fprintf(file,“==================================rn”);fprintf(file,“描述:%srn”,wsData.szDescription);fprintf(file,“狀態(tài):%srn”,wsData.szSystemStatus);fprintf(file,“==================================rn”);SOCKET sock;/* 創(chuàng)建原始套接字 */ if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){

      }

      BOOL flag=true;/* 設(shè)置IP頭操作選項(xiàng) */ if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag))==SOCKET_Eprintf(“Can not create socket!n”);return-1;RROR){

      } printf(“setsockopt failed!n”);return-1;char hostName[128];/* 獲取本地主機(jī)名 */ if(gethostname(hostName,100)==SOCKET_ERROR){

      }

      hostent *pHostIP;printf(“gethostname failed!n”);return-1;

      Ip數(shù)據(jù)包解析

      R){

      /* 根據(jù)主機(jī)名獲取主機(jī)信息 */ if((pHostIP=gethostbyname(hostName))==NULL){

      } printf(“Hostname: %srn”,pHostIP->h_name);printf(“IPAddress: %srn”,inet_ntoa(*((struct in_addr *)pHostIP->h_addr)));printf(“gethostbyname failed!n”);return-1;/* 封裝IP地址信息 */ sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);//監(jiān)聽(tīng)的端口號(hào) /* 把Socket綁定到本地網(wǎng)卡 */ if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR){

      }

      DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;/* 設(shè)置網(wǎng)卡為混雜模式 */ if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen), printf(“bind failed”);return-1;&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERRO

      } printf(“icotlsocket failedn”);return-1;

      Ip數(shù)據(jù)包解析

      }

      char buffer[BUFFER_SIZE];printf(“=============開(kāi)始解析=============rn”);while(true){

      } /* 解除Socket綁定 */ if(WSACleanup()==SOCKET_ERROR){

      } /* 關(guān)閉文件 */ fclose(file);return 0;printf(“WSACleanup failed!n”);return-1;/* 從套接字接收IP數(shù)據(jù)報(bào) */ int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){

      } ipparse(stdout,buffer);ipparse(file,buffer);

      第五篇:防火墻的數(shù)據(jù)包攔截方式小結(jié)

      防火墻的數(shù)據(jù)包攔截方式小結(jié)

      網(wǎng)絡(luò)防火墻都是基于數(shù)據(jù)包的攔截技術(shù)之上的。在 Windows 下,數(shù)據(jù)包的攔截方式有很多種,其原理和實(shí)現(xiàn)方式也千差萬(wàn)別??偟膩?lái)說(shuō),可分為“用戶級(jí)”和“內(nèi)核級(jí)”數(shù)據(jù)包攔截兩大類。

      用戶級(jí)下的數(shù)據(jù)包攔截方式有:

      * Winsock Layered Service Provider(LSP)。

      * Win2K 包過(guò)濾接口(Win2K Packet Filtering Interface)。* 替換 Winsock 動(dòng)態(tài)鏈接庫(kù)(Winsock Replacement DLL)。

      內(nèi)核級(jí)下的數(shù)據(jù)包攔截方式有:

      * TDI過(guò)濾驅(qū)動(dòng)程序(TDI-Filter Driver)。

      * NDIS中間層驅(qū)動(dòng)程序(NDIS Intermediate Driver)。* Win2K Filter-Hook Driver。* Win2K Firewall-Hook Driver。* NDIS-Hook Driver。

      在這么多種方式面前,我們?cè)撊绾螞Q定采用哪一種作為自己項(xiàng)目的實(shí)現(xiàn)技術(shù)?這需要對(duì)每一種 方式都有一個(gè)大致的了解,并清楚它們各自的優(yōu)缺點(diǎn)。技術(shù)方案的盲目選用往往會(huì)帶來(lái)一些技術(shù) 風(fēng)險(xiǎn)。以自己為例,我需要在截包的同時(shí)得到當(dāng)前進(jìn)程文件名,也就是說(shuō),需向用戶報(bào)告當(dāng)前是 哪個(gè)應(yīng)用程序要訪問(wèn)網(wǎng)絡(luò)。在選用 Win2K Filter-Hook Driver 這一方案之后(很多小型開(kāi)源項(xiàng)

      目都采用這一方案),便開(kāi)始編碼。但之后發(fā)現(xiàn) Win2K Filter-Hook Driver 的截包上下文處于內(nèi)

      核進(jìn)程中,即 IRQL >= DISPATCH_LEVEL,根本無(wú)法知道當(dāng)前應(yīng)用程序的名字。相比之下,TDI-Filter Driver 和 NDIS-Hook Driver 則可以得知這些信息。其中 TDI-Filter Driver 比 NDIS-Hook Driver 更能準(zhǔn)確地獲知當(dāng)前應(yīng)用程序文件名,后者的接收數(shù)據(jù)包和少數(shù)發(fā)送數(shù)據(jù)

      包的場(chǎng)景仍然處于內(nèi)核進(jìn)程中。

      下面列出了各種截包方式的特點(diǎn):

      * Winsock Layered Service Provider(LSP)該方式也稱為 SPI(Service Provider Interface)截包技術(shù)。SPI是由 Winsock2 提供的一個(gè)

      接口,它需要用戶機(jī)上安裝有 Winsock 2.0。Winsock2 SPI 工作在 API 之下的 Driver 之上,可以截獲所有基于 Socket 的網(wǎng)絡(luò)數(shù)據(jù)包。

      優(yōu)點(diǎn):

      * 以DLL形式存在,編程方便,調(diào)試簡(jiǎn)單。* 數(shù)據(jù)封包比較完整,未做切片,便于做內(nèi)容過(guò)濾。

      缺點(diǎn): * 攔截不夠嚴(yán)密,對(duì)于不用 Socket 的網(wǎng)絡(luò)通訊則無(wú)法攔截(如 ICMP),木馬病毒很容易繞過(guò)。

      * Win2K Packet Filtering Interface

      這是 Win2K 中一組 API 提供的功能(PfCreateInterface, PfAddFiltersToInterface,...)。

      優(yōu)點(diǎn):

      * 接口簡(jiǎn)單,實(shí)現(xiàn)起來(lái)沒(méi)什么難度。

      缺點(diǎn):

      * 功能過(guò)于簡(jiǎn)單,只能提供IP和端口的過(guò)濾,可能無(wú)法滿足防火墻的復(fù)雜需求。* 處于 API 層,木馬病毒容易繞過(guò)。* 只能在 Win2K 以上(含)系統(tǒng)中使用。

      * Winsock Replacement DLL 這種方法通過(guò)替換系統(tǒng) Winsock 庫(kù)的部分導(dǎo)出函數(shù),實(shí)現(xiàn)數(shù)據(jù)報(bào)的監(jiān)聽(tīng)和攔截。

      缺點(diǎn):

      * 由于工作在 Winsock 層,所以木馬病毒容易繞過(guò)。

      * TDI-Filter Driver

      TDI 的全稱是 Transport Driver Interface。傳輸層過(guò)濾驅(qū)動(dòng)程序通過(guò)創(chuàng)建一個(gè)或多個(gè)設(shè)備對(duì)象

      直接掛接到一個(gè)現(xiàn)有的驅(qū)動(dòng)程序之上。當(dāng)有應(yīng)用程序或其它驅(qū)動(dòng)程序調(diào)用這個(gè)設(shè)備對(duì)象時(shí),會(huì)首

      先映射到過(guò)濾驅(qū)動(dòng)程序上,然后由過(guò)濾驅(qū)動(dòng)程序再傳遞給原來(lái)的設(shè)備對(duì)象。

      優(yōu)點(diǎn):

      * 能獲取到當(dāng)前進(jìn)程的詳細(xì)信息,這對(duì)開(kāi)發(fā)防火墻尤其有用。

      缺點(diǎn):

      * 該驅(qū)動(dòng)位于 tcpip.sys 之上,所以沒(méi)有機(jī)會(huì)得到那些由 tcpip.sys 直接處理的包,比如ICMP。

      * TDI驅(qū)動(dòng)需要重啟系統(tǒng)方能生效。

      * NDIS Intermediate Driver

      也稱之為 IM Driver。它位于協(xié)議層驅(qū)動(dòng)和小端口驅(qū)動(dòng)之間,它主要是在網(wǎng)絡(luò)層和鏈路層之間對(duì)

      所有的數(shù)據(jù)包進(jìn)行檢查,因而具有強(qiáng)大的過(guò)濾功能。它能截獲所有的數(shù)據(jù)包。

      可參考DDK中附帶的例子 Passthru。

      優(yōu)點(diǎn):

      * 功能非常強(qiáng)大,應(yīng)用面廣泛,不僅僅是防火墻,還可以用來(lái)實(shí)現(xiàn)VPN,NAT 和 VLan 等。

      缺點(diǎn):

      * 編程復(fù)雜,難度較大。

      * 中間層驅(qū)動(dòng)的概念是在 WinNT SP4 之后才有的,因此 Win9X 無(wú)法使用。* 不容易安裝,自動(dòng)化安裝太困難。

      * Win2K Filter-Hook Driver 這是從 Win2K 開(kāi)始提供的一種機(jī)制,該機(jī)制主要利用 ipfiltdrv.sys 所提供的功能來(lái)攔截網(wǎng)絡(luò)

      數(shù)據(jù)包。Filter-Hook Driver 的結(jié)構(gòu)非常簡(jiǎn)單,易于實(shí)現(xiàn)。但是正因?yàn)槠浣Y(jié)構(gòu)過(guò)于簡(jiǎn)單,并且

      依賴于 ipfiltdrv.sys,微軟并不推薦使用。

      可參考 CodeProject 上的例子:http://004km.cn/KB/IP/drvfltip.aspx

      優(yōu)點(diǎn):

      * 結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn)。

      * 能截獲所有的IP包(包括ICMP包)。

      缺點(diǎn):

      * 工作于內(nèi)核進(jìn)程中,無(wú)法取得當(dāng)前應(yīng)用程序進(jìn)程的信息。

      * 雖能截獲所有IP包,但無(wú)法取得數(shù)據(jù)包的以太幀(Ethernet Frame)。* 只能在 Win2K 以上(含)系統(tǒng)中使用。

      * Win2K Firewall-Hook Driver 這是一種和 Win2k Filter-Hook Driver 差不多的機(jī)制,所不同的是,F(xiàn)irewall-Hook Driver 能在 IP Driver 上掛接多個(gè)回調(diào)函數(shù),所以和前者相比,它引起沖突的可能性更小一些。

      可參考 CodeProject 上的例子:http://004km.cn/KB/IP/FwHookDrv.aspx

      這種方式的優(yōu)缺點(diǎn)和 Win2K Filter-Hook Driver 基本相同。

      * NDIS-Hook Driver

      這是一種要重點(diǎn)講述的截包方式。它是目前大多數(shù)網(wǎng)絡(luò)防火墻所使用的方法。這種方式的做法

      是安裝鉤子到 ndis.sys 中,替換其中的某些關(guān)鍵函數(shù),從而達(dá)到截包的目的。在下一節(jié)中我

      們將詳細(xì)地介紹它的實(shí)現(xiàn)方法。

      優(yōu)點(diǎn):

      * 安裝簡(jiǎn)單,可即時(shí)安裝和卸載驅(qū)動(dòng),無(wú)需重啟系統(tǒng)。

      * 能截獲所有的IP包,同時(shí)能取得數(shù)據(jù)包的以太幀(Ethernet Frame)。* 安全性高,木馬病毒不容易穿透。

      * 在大多數(shù)情況下,能獲取到當(dāng)前應(yīng)用程序的進(jìn)程信息。* 能在 Win98 以上(含)系統(tǒng)中使用。

      缺點(diǎn):

      * 接收數(shù)據(jù)包、或偶爾發(fā)送數(shù)據(jù)包時(shí),驅(qū)動(dòng)工作在內(nèi)核進(jìn)程中,無(wú)法獲得應(yīng)用程序進(jìn)程信息。

      ◎ NDIS-Hook 技術(shù)

      微軟和 3COM 公司在1989年制定了一套開(kāi)發(fā) Windows 下網(wǎng)絡(luò)驅(qū)動(dòng)程序的標(biāo)準(zhǔn),稱為 NDIS。

      NDIS 的全稱是 Network Driver Interface Specification。NDIS為網(wǎng)絡(luò)驅(qū)動(dòng)的開(kāi)發(fā)提供了一套

      標(biāo)準(zhǔn)的接口,使得網(wǎng)絡(luò)驅(qū)動(dòng)程序的跨平臺(tái)性更好。

      NDIS提供以下幾個(gè)層次的接口:

      1.NDIS 小端口驅(qū)動(dòng)(NDIS Miniport Driver)。這也就是我們常說(shuō)的網(wǎng)卡驅(qū)動(dòng)。

      2.NDIS 協(xié)議驅(qū)動(dòng)(NDIS Protocol Driver)。用來(lái)實(shí)現(xiàn)某個(gè)具體的協(xié)議棧,如 TCP/IP 協(xié)議棧,并向上層導(dǎo)出 TDI 接口。3.NDIS 中間層驅(qū)動(dòng)(NDIS Intermediate Driver)。

      這是位于小端口驅(qū)動(dòng)和協(xié)議驅(qū)動(dòng)之間的驅(qū)動(dòng)。

      NDIS為了給出上述三種接口,提供了一個(gè)系統(tǒng)的、完整的 Wrapper。這個(gè) Wrapper 即 ndis.sys。

      上面提到的 Miniport Driver、Protocol Driver、Intermediate Driver 均屬于插入到這個(gè) Wrapper 中的“模塊”,它們調(diào)用 Wrapper 提供的函數(shù),同時(shí)也向 Wrapper 注冊(cè)回調(diào)函數(shù)。

      在簡(jiǎn)單了解了NDIS的機(jī)制之后,不難得知,網(wǎng)絡(luò)防火墻只需要將自己的函數(shù)掛鉤(Hook)到 ndis.sys

      中即可截獲網(wǎng)絡(luò)數(shù)據(jù)包。NDIS-Hook 技術(shù)有兩種實(shí)現(xiàn)方案:

      1.修改 ndis.sys 的 Export Table。

      在 Win32 下,可執(zhí)行文件(EXE/DLL/SYS)都遵從PE格式。所有提供接口的驅(qū)動(dòng)都有 Export Table,因此只要修改 ndis.sys 的 Export Table,就可實(shí)現(xiàn)對(duì)關(guān)鍵函數(shù)的掛接。在實(shí)現(xiàn)步驟中,首先

      需要得到 ndis.sys 的內(nèi)存基址,再根據(jù)PE格式得到DOS頭部結(jié)構(gòu)(IMAGE_DOS_HEADER),進(jìn)一步得

      到NT頭部結(jié)構(gòu)(IMAGE_NT_HEADER),最后從頭部結(jié)構(gòu)中查得 Export Table 的地址。

      由于協(xié)議驅(qū)動(dòng)程序(NDIS Protocol Driver)在系統(tǒng)啟動(dòng)時(shí)會(huì)調(diào)用 NdisRegisterProtocol()來(lái)向

      系統(tǒng)注冊(cè)協(xié)議,因此這種方法關(guān)鍵在于修改 ndis.sys 所提供的 NdisRegisterProtocol、NdisDeRegisterProtocol、NdisOpenAdapter、NdisCloseAdapter、NdisSend 這幾個(gè)函數(shù)的地址。

      對(duì)于處于系統(tǒng)核心的 ndis.sys 而言,要修改它的內(nèi)存區(qū)域,只有驅(qū)動(dòng)程序才能做到,所以我們

      必須編寫驅(qū)動(dòng)程序來(lái)達(dá)到這個(gè)目的。

      該方案的缺點(diǎn)是加載或卸載驅(qū)動(dòng)后無(wú)法立即生效,必須重啟系統(tǒng)。且掛鉤方法較為復(fù)雜。早期凡

      使用 NDIS-Hook 的防火墻都采用這一方法,包括著名的費(fèi)爾防火墻的早期版本(v2.1)。

      直到 2004 年,004km.cn 上一名黑客公布了一種全新的 NDIS-Hook 技術(shù)(即下文即將提

      到的第2種方法),諸多防火墻產(chǎn)品才都悄悄對(duì)自己的核心技術(shù)進(jìn)行了升級(jí)。由于新的掛鉤技術(shù)更

      好,故本文不打算詳述修改 Export Table 這一方法的具體細(xì)節(jié)。

      2.向系統(tǒng)注冊(cè)假協(xié)議(Bogus Protocol)。NDIS提供了一個(gè)API: NdisRegisterProtocol(),這個(gè)API的職責(zé)是向系統(tǒng)注冊(cè)一個(gè)協(xié)議(如TCPIP),并將該協(xié)議作為一個(gè)鏈表節(jié)點(diǎn)插入到“協(xié)議鏈表”的頭部,最后返回該鏈表頭節(jié)點(diǎn)(即新節(jié)點(diǎn))的

      地址。正常情況下,只有NDIS協(xié)議驅(qū)動(dòng)程序(NDIS Protocol Driver)才會(huì)調(diào)用這個(gè)API。

      既然如此,如果我們也調(diào)用 NdisRegisterProtocol()向系統(tǒng)注冊(cè)一個(gè)新的協(xié)議,我們也就能輕

      易地得到“協(xié)議鏈表”的首地址,通過(guò)走訪這個(gè)鏈表,就能修改其中的某些關(guān)鍵信息,比如關(guān)鍵

      函數(shù)的地址。修改完畢后,再調(diào)用 NdisDeRegisterProtocol()注銷掉新協(xié)議。這看似一切都沒(méi)

      發(fā)生,但事實(shí)上目的已經(jīng)達(dá)到了。這個(gè)新協(xié)議我們稱之為假協(xié)議(Bogus Protocol)。

      通過(guò)這種方法,我們可以不用重啟系統(tǒng)就能輕松掛接截包函數(shù)。當(dāng)今大多數(shù)網(wǎng)絡(luò)防火墻都采用了

      這一方法。近來(lái)網(wǎng)上又有人提出了獲取協(xié)議鏈表首地址的新的怪異途徑,比如獲取 tcpip.sys 中全局變量 _ARPHandle 值的方法。不管怎樣,相比之下,注冊(cè)假協(xié)議仍不失為一種經(jīng)典且簡(jiǎn)單的方法。

      本文將詳細(xì)敘述第2種方案的內(nèi)部原理和實(shí)現(xiàn)細(xì)節(jié),即通過(guò)注冊(cè)假協(xié)議獲取協(xié)議鏈表首地址,遍歷

      鏈表并修改其中的函數(shù)地址,掛鉤自己的函數(shù),從而實(shí)現(xiàn)網(wǎng)絡(luò)截包。在這么做之前,需要先對(duì)NDIS

      內(nèi)部維護(hù)的幾個(gè)結(jié)構(gòu)有清楚的認(rèn)識(shí)。另外,由于歷史原因,NDIS存在諸多并不完全向下兼容的版本,不同的版本中關(guān)鍵數(shù)據(jù)域的偏移地址也不盡相同。微軟并沒(méi)有以文檔形式提供這些變化的列表。本

      文稍后給出這些變化。

      * NDIS_PROTOCOL_BLOCK 和 NDIS_OPEN_BLOCK

      在NDIS中,所有已注冊(cè)的協(xié)議是通過(guò)一個(gè)單向的協(xié)議鏈表來(lái)維護(hù)的。這個(gè)單向鏈表保存了所有已注冊(cè) 的協(xié)議,每個(gè)協(xié)議對(duì)應(yīng)一個(gè)節(jié)點(diǎn)。鏈表節(jié)點(diǎn)由 NDIS_PROTOCOL_BLOCK 結(jié)構(gòu)來(lái)描述,在這個(gè)結(jié)構(gòu)中保存

      了注冊(cè)協(xié)議驅(qū)動(dòng)時(shí)所指定的各種信息,如支持協(xié)議即插即用的回調(diào)函數(shù)地址等。同時(shí),每個(gè)協(xié)議驅(qū)動(dòng)

      還對(duì)應(yīng)一個(gè) NDIS_OPEN_BLOCK 節(jié)點(diǎn)結(jié)構(gòu)的單向鏈表來(lái)維護(hù)其所綁定的網(wǎng)卡信息,協(xié)議驅(qū)動(dòng)發(fā)送和接收

      數(shù)據(jù)包的回調(diào)函數(shù)地址就保存在這個(gè)結(jié)構(gòu)中,是我們要重點(diǎn)修改的對(duì)象。

      協(xié)議與網(wǎng)卡綁定的示意圖如下: ┌───┐

      │ Head │

      └─┬─┘

      ┌──────────────┐ ┌───────────┐

      │ TCPIP Protocol Block ├──→│ RTL8168 Open Block │

      └──────┬───────┘ └─────┬─────┘

      ↓ ↓

      ┌──────────────┐ ┌───────────┐

      │ TCPIP_WANARP Protocol Block│ │ Wireless Open Block │

      └──────┬───────┘ └─────┬─────┘

      ↓ ↓ ┌───┐ ┌───┐

      │ NULL │ │ NULL │

      └───┘ └───┘ * 得到 NDIS_PROTOCOL_BLOCK 鏈表的首地址

      上文已提到,通過(guò)向系統(tǒng)注冊(cè)假協(xié)議,我們即可得到協(xié)議鏈表的首地址。從DDK中可查到 NdisRegisterProtocol()的原型:

      EXPORT VOID NdisRegisterProtocol(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE NdisProtocolHandle, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength);

      可以看出,我們?cè)谡{(diào)用它時(shí)需要傳入一個(gè)結(jié)構(gòu) NDIS_PROTOCOL_CHARACTERISTICS,這個(gè)結(jié)構(gòu)是我們

      在注冊(cè)協(xié)議時(shí)必須填寫的一張表格,這個(gè)表格描述了協(xié)議的相關(guān)信息。不過(guò)既然我們注冊(cè)的是一個(gè)

      假協(xié)議,所以可以盡量簡(jiǎn)單地填寫它。

      NDIS_STATUS

      DummyNdisProtocolReceive(IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize){ return NDIS_STATUS_NOT_ACCEPTED;}

      NDIS_HANDLE

      RegisterBogusNdisProtocol(void){ NTSTATUS Status = STATUS_SUCCESS;NDIS_HANDLE hBogusProtocol = NULL;NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol;NDIS_STRING ProtocolName;NdisZeroMemory(&BogusProtocol, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));BogusProtocol.MajorNdisVersion = 0x04;BogusProtocol.MinorNdisVersion = 0x0;

      NdisInitUnicodeString(&ProtocolName, L“BogusProtocol”);BogusProtocol.Name = ProtocolName;BogusProtocol.ReceiveHandler = DummyNdisProtocolReceive;NdisRegisterProtocol(&Status, &hBogusProtocol, &BogusProtocol, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

      if(Status == STATUS_SUCCESS)return hBogusProtocol;else return NULL;}

      函數(shù) RegisterBogusNDISProtocol()的返回值即是我們想要的協(xié)議鏈表首地址。不過(guò)須注意的是,在函數(shù)掛鉤完成后,應(yīng)調(diào)用 NdisDeregisterProtocol()將假協(xié)議注銷。另外,在遍歷協(xié)議鏈表

      進(jìn)行函數(shù)掛鉤時(shí),應(yīng)從首節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開(kāi)始,因?yàn)槭坠?jié)點(diǎn)是我們的假協(xié)議節(jié)點(diǎn)。

      * 修改原有函數(shù)地址值實(shí)現(xiàn)函數(shù)掛鉤

      上文已提到了和NDIS相關(guān)的三個(gè)結(jié)構(gòu): NDIS_PROTOCOL_BLOCK, NDIS_OPEN_BLOCK, NDIS_PROTOCOL_CHARACTERISTICS。

      那么我們要替換的函數(shù)在哪兒呢?答案是在 NDIS_OPEN_BLOCK 和 NDIS_PROTOCOL_CHARACTERISTICS

      這兩個(gè)結(jié)構(gòu)中,而且重點(diǎn)是前者,因?yàn)榍罢呤菂f(xié)議驅(qū)動(dòng)和網(wǎng)卡綁定的紐帶?,F(xiàn)在的主流網(wǎng)卡都只 調(diào)用 NDIS_OPEN_BLOCK 中的收發(fā)函數(shù)進(jìn)行發(fā)送和接收數(shù)據(jù)包。但據(jù)試驗(yàn),虛擬機(jī) VMware 有時(shí)會(huì)

      調(diào)用 NDIS_PROTOCOL_CHARACTERISTICS 中的函數(shù)進(jìn)行數(shù)據(jù)包收發(fā)。所以為了嚴(yán)謹(jǐn),我們應(yīng)該對(duì)兩

      個(gè)結(jié)構(gòu)中的函數(shù)進(jìn)行替換。關(guān)于這兩個(gè)結(jié)構(gòu)的定義,讀者可以自行查閱DDK文檔和頭文件。

      下面給出示意性代碼。簡(jiǎn)單起見(jiàn),下列代碼均假設(shè)當(dāng)前NDIS的版本為5.0。

      BOOLEAN InstallHook(void){ NDIS_STATUS nStatus;NDIS_HANDLE hBogusProtocol = NULL;BYTE *pProtocolChain;

      // Get the address of the first NDIS_PROTOCOL_BLOCK node.hBogusProtocol = RegisterBogusNDISProtocol();if(hBogusProtocol == NULL)return FALSE;pProtocolChain =(BYTE*)hBogusProtocol;while(TRUE){ // Get the address of the next node.DWORD dwOffset = 0x10;// for NDIS 5.0 pProtocolChain =((BYTE **)(pProtocolChain + dwOffset))[0];if(!pProtocolChain)break;

      HookNdisProtocolBlock(pProtocolChain);}

      NdisDeregisterProtocol(&nStatus, hBogusProtocol);return TRUE;} void

      HookNdisProtocolBlock(IN BYTE *pProtocolBlock){ PNDIS_PROTOCOL_CHARACTERISTICS pProtoChar;PNDIS_OPEN_BLOCK pOpenBlock;

      pProtoChar =(PNDIS_PROTOCOL_CHARACTERISTICS)(pProtocolBlock + 0x14);HookNdisProc(MyReceive,(PVOID *)&pProtoChar->ReceiveHandler);HookNdisProc(MyReceivePacket,(PVOID *)&pProtoChar->ReceivePacketHandler);HookNdisProc(MyBindAdapter,(PVOID *)&pProtoChar->BindAdapterHandler);

      pOpenBlock =((PNDIS_OPEN_BLOCK *)pProtocolBlock)[0];while(pOpenBlock){ HookNdisProc(MySend,(PVOID *)&pOpenBlock->SendHandler);HookNdisProc(MyReceive,(PVOID *)&pOpenBlock->ReceiveHandler);HookNdisProc(MyReceivePacket,(PVOID *)&pOpenBlock->ReceivePacketHandler);HookNdisProc(MySendPackets,(PVOID *)&pOpenBlock->SendPacketsHandler);

      pOpenBlock = pOpenBlock->ProtocolNextOpen;} } void HookNdisProc(IN PVOID pMyProc, IN PVOID *ppOrgProc){ // TODO: Save the address of the original proc.*ppOrgProc = pMyProc;}

      InstallHook()首先得到協(xié)議鏈表的首地址,接著遍歷鏈表,針對(duì)系統(tǒng)中的每個(gè)(第一個(gè)除外)NDIS_PROTOCOL_BLOCK 調(diào)用 HookNdisProtocolBlock()函數(shù)。HookNdisProtocolBlock()對(duì) NDIS_PROTOCOL_BLOCK 中 NDIS_PROTOCOL_CHARACTERISTICS 和

      NDIS_OPEN_BLOCK 鏈表的每個(gè)節(jié)點(diǎn)進(jìn)行函數(shù)掛接。

      HookNdisProc()用于替換函數(shù)地址。給出的代碼中它只是簡(jiǎn)單地替換函數(shù)地址,在實(shí)際應(yīng)用中,它還應(yīng)當(dāng)保存原始函數(shù)的地址值,以供新的函數(shù)調(diào)用。

      * 關(guān)鍵數(shù)據(jù)域在不同NDIS版本中的差異

      由于 NDIS-Hook 并非受微軟官方支持的技術(shù),所以相關(guān)文檔非常缺乏。不僅如此,操作系統(tǒng)的 每次升級(jí),都會(huì)同時(shí)升級(jí)NDIS,而NDIS中的某些數(shù)據(jù)結(jié)構(gòu)并沒(méi)有保持向下兼容。最需要注意的

      是 NDIS_PROTOCOL_BLOCK。

      在 Win9x/Me/NT 的DDK中,NDIS_PROTOCOL_BLOCK 都有明確的定義,但在 Win2K/XP 的DDK中,并沒(méi)有該結(jié)構(gòu)的詳細(xì)定義,也就是說(shuō)該結(jié)構(gòu)在 Win2K 以后(含)的系統(tǒng)中是非公開(kāi)的。因此開(kāi)發(fā)

      人員只能利用各種調(diào)試工具來(lái)發(fā)掘該結(jié)構(gòu)的詳細(xì)定義。也正是因?yàn)槿绱?,NDIS-Hook 方法對(duì)平臺(tái) 的依賴性比較大,需要在程序中判斷不同的操作系統(tǒng)版本而使用不同的結(jié)構(gòu)定義。

      NDIS_PROTOCOL_BLOCK 的定義可大致認(rèn)為是這個(gè)樣子:

      typedef struct _NDIS_PROTOCOL_BLOCK { PNDIS_OPEN_BLOCK OpenQueue;REFERENCE Ref;UINT Length;NDIS_PROTOCOL_CHARACTERISTICS ProtocolChars;struct _NDIS_PROTOCOL_BLOCK* NextProtocol;ULONG MaxPatternSize;//...} NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;

      其中 OpenQueue 為 PNDIS_OPEN_BLOCK 鏈表的首節(jié)點(diǎn)地址,NextProtocol 指向下一個(gè)

      NDIS_PROTOCOL_BLOCK 節(jié)點(diǎn)。

      在不同的NDIS版本中,該結(jié)構(gòu)中的某些域的偏移地址是不同的,現(xiàn)列于下:

      ┌───────┬───────────┬───────────┐

      │ NDIS Version │ ProtocolChars offset │ NextProtocol offset │

      ├───────┼───────────┼───────────┤

      │ 3.XX │ 0x14 │ 0x04 │

      │ 4.XX │ 0x14 │ 0x60 │

      │ 4.01 │ 0x14 │ 0x8C │

      │ 5.XX │ 0x14 │ 0x10 │

      └───────┴───────────┴───────────┘ * 如何在驅(qū)動(dòng)中得到當(dāng)前NDIS版本? 有兩種方法可得到當(dāng)前NDIS版本。一種是先取得當(dāng)前操作系統(tǒng)的版本信息,在根據(jù)操作系統(tǒng) 的版本得到NDIS的版本。操作系統(tǒng)版本和NDIS版本有一個(gè)映射關(guān)系,讀者可在DDK幫助中查到。

      ┌───────┬───────┐

      │ OS Version │ NDIS Version │

      ├───────┼───────┤

      │ Win95 │ 3.1 │

      │ Win95 OSR2 │ 4.0 │

      │ Win98 │ 4.1 │

      │ Win98 SE │ 5.0 │

      │ WinMe │ 5.0 │

      │ WinNT 3.5 │ 3.0 │

      │ WinNT 4.0 │ 4.0 │

      │ WinNT 4.0 SP3│ 4.1 │

      │ Win2K │ 5.0 │

      │ WinXP │ 5.1 │

      │ WinVista │ 6.0 │

      └───────┴───────┘

      還有一種方法,通過(guò)調(diào)用 NdisReadConfiguration()直接獲取NDIS版本。代碼如下:

      BOOLEAN GetNdisVersion(OUT DWORD *pMajorVersion, OUT DWORD *pMinorVersion){ NDIS_STATUS nStatus;NDIS_STRING VersionStr = NDIS_STRING_CONST(“NdisVersion”);PNDIS_CONFIGURATION_PARAMETER ReturnedValue;BOOLEAN bResult;NdisReadConfiguration(&nStatus, &ReturnedValue, NULL, &VersionStr, NdisParameterInteger);

      bResult =((nStatus == NDIS_STATUS_SUCCESS)? TRUE : FALSE);if(bResult){ //

      // The returned value has the NDIS version of the form // 0xMMMMmmmm, where MMMM is major version and mmmm is minor // version so 0x00050000 is 5.0 //

      DWORD dwVersion = ReturnedValue->ParameterData.IntegerData;if(pMajorVersion)*pMajorVersion = dwVersion >> 16;if(pMinorVersion)*pMinorVersion = dwVersion & 0xFFFF;}

      return bResult;}

      須注意的是,GetNdisVersion()必須在 PASSIVE_LEVEL 下運(yùn)行。所以此函數(shù)適合于在 驅(qū)動(dòng)的 DriverEntry()中調(diào)用,因?yàn)?DriverEntry()一定是處于 PASSIVE_LEVEL 的。

      下載數(shù)據(jù)包必讀!word格式文檔
      下載數(shù)據(jù)包必讀!.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        基于數(shù)據(jù)包捕獲與分析的個(gè)人防火墻論文

        基于數(shù)據(jù)包捕獲與分析的個(gè)人防火墻論文 本套設(shè)計(jì)論文描述及運(yùn)行界面展示 摘 要 數(shù)據(jù)包過(guò)濾是一個(gè)用軟件或硬件設(shè)備對(duì)向網(wǎng)絡(luò)上傳或從網(wǎng)絡(luò)下載的數(shù)據(jù)流進(jìn)行有選擇的控制過(guò)程。......

        計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)_IP數(shù)據(jù)包的捕獲與分析[范文]

        CENTRAL SOUTH UNIVERSITY 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告 目錄 第一章 課程設(shè)計(jì)的目的與要求 .......................... 錯(cuò)誤!未定義書簽。 1.1 課程設(shè)計(jì)的目的 ....................

        必讀書單

        1 《一百分媽媽》 馬以工找不到 2 《一路走來(lái)一路讀 》 林達(dá) 3 《二胡》 陳若曦 4 《人在歐洲》 龍應(yīng)臺(tái) 6 《三十五年的新聞追蹤: 一個(gè)日本記者眼中的中國(guó)》 吉田實(shí)著; 王武......

        管理者必讀

        [轉(zhuǎn)] 成功管理者的50個(gè)成功經(jīng)驗(yàn)感悟,管理者必讀1.經(jīng)常自我反省,檢視一下,在管轄范圍內(nèi)的人、時(shí)、地、物、有沒(méi)有浪費(fèi)資源,或無(wú)效運(yùn)用的狀況。2.不要在下屬面前抱怨工作,數(shù)落上司及......

        農(nóng)村干部必讀

        農(nóng)村干部必讀——發(fā)展篇 序言:農(nóng)村工作千頭萬(wàn)緒,任務(wù)重,要求高,責(zé)任大。農(nóng)村干部的一言一行,直接關(guān)系到黨的政策的貫徹落實(shí),關(guān)系到農(nóng)民群眾的切身利益,關(guān)系到黨和政府的形象。長(zhǎng)期......

        筆桿必讀

        坐了二十多年的機(jī)關(guān)〃聽(tīng)了二十多年的新聞〃寫了二十多年的材料〃吃了二十多年的皇糧〃走了二十多年的紅道〃拿了二十多年的俸祿〃想了二十多年的問(wèn)題〃終于概括了一些共性的......

        必讀名著

        中學(xué)生必讀名著訓(xùn)練題 一、《格列佛游記》 1.作者為十八世紀(jì)國(guó)杰出的諷刺家 的代表作。 2.列舉格列佛游過(guò)的(島)國(guó)的名稱: 、 、 、 。 3.這部小說(shuō)描寫生動(dòng)、是寓言式的,說(shuō)說(shuō)此書......

        新手必讀

        新手必讀:優(yōu)秀駕駛員開(kāi)車技巧_學(xué)車考駕照 1、如何拐彎進(jìn)窄門?首先目測(cè)是否能夠進(jìn)得去,不要緊貼著門邊的障礙物拐彎,盡量減小轉(zhuǎn)彎的夾角。 2、上坡、上橋怎樣防止旁車“插入”?......