一步一步開發sniffer(Winpcap+MFC)(四)要想從此過,留下協議頭——各層網絡協議頭的實現


這一章實際上沒什么講的,就是把協議的標准搞懂,然后用數據結構將其實現就行。直接上代碼吧,由底層到高層逐步實現。這些協議頭是怎么使用的,將在下一章做出解釋。

[cpp]  view plain copy
  1. #ifndef PROTOCOL_H  
  2. #define PROTOCOL_H  
  3.   
  4. #define PROTO_ICMP 1  
  5. #define PROTO_TCP 6                   
  6. #define PROTO_UDP 17                       
  7. #define LITTLE_ENDIAN 1234  
  8. #define BIG_ENDIAN    4321  
  9.   
  10.   
  11. //Mac幀頭 占14個字節  
  12. typedef struct ethhdr  
  13. {  
  14.     u_char dest[6];         //6個字節 目標地址  
  15.     u_char src[6];              //6個字節 源地址  
  16.     u_short type;               //2個字節 類型  
  17. };  
  18.   
  19. //ARP頭  
  20. typedef struct arphdr  
  21. {  
  22.     u_short ar_hrd;                     //硬件類型  
  23.     u_short ar_pro;                     //協議類型  
  24.     u_char ar_hln;                      //硬件地址長度  
  25.     u_char ar_pln;                      //協議地址長度  
  26.     u_short ar_op;                      //操作碼,1為請求 2為回復  
  27.     u_char ar_srcmac[6];            //發送方MAC  
  28.     u_char ar_srcip[4];             //發送方IP  
  29.     u_char ar_destmac[6];           //接收方MAC  
  30.     u_char ar_destip[4];                //接收方IP  
  31. };  
  32.   
  33. //定義IP頭   
  34. typedef struct iphdr  
  35. {  
  36. #if defined(LITTLE_ENDIAN)  
  37.     u_char ihl:4;  
  38.     u_char version:4;  
  39. #elif defined(BIG_ENDIAN)  
  40.     u_char version:4;  
  41.     u_char  ihl:4;  
  42. #endif  
  43.     u_char tos;             //TOS 服務類型  
  44.     u_short tlen;           //包總長 u_short占兩個字節  
  45.     u_short id;             //標識  
  46.     u_short frag_off;   //片位移  
  47.     u_char ttl;             //生存時間  
  48.     u_char proto;       //協議  
  49.     u_short check;      //校驗和  
  50.     u_int saddr;            //源地址  
  51.     u_int daddr;            //目的地址  
  52.     u_int   op_pad;     //選項等  
  53. };  
  54.   
  55. //定義IP頭   
  56. /*typedef struct iphdr 
  57. { 
  58.     u_char ver_ihl; 
  59.     u_char tos;             //TOS 服務類型 
  60.     u_short tlen;           //包總長 u_short占兩個字節 
  61.     u_short id;             //標識 
  62.     u_short frag_off;   //片位移 
  63.     u_char ttl;             //生存時間 
  64.     u_char proto;       //協議 
  65.     u_short check;      //校驗和 
  66.     u_int saddr;            //源地址 
  67.     u_int daddr;            //目的地址 
  68.     u_int   op_pad;     //選項等 
  69. };*/  
  70.   
  71.   
  72. //定義TCP頭  
  73. typedef struct tcphdr  
  74. {  
  75.     u_short sport;                          //源端口地址  16位  
  76.     u_short dport;                          //目的端口地址 16位  
  77.     u_int seq;                                  //序列號 32位  
  78.     u_int ack_seq;                          //確認序列號   
  79. #if defined(LITTLE_ENDIAN)  
  80.     u_short res1:4,  
  81.                 doff:4,  
  82.                 fin:1,  
  83.                 syn:1,  
  84.                 rst:1,  
  85.                 psh:1,  
  86.                 ack:1,  
  87.                 urg:1,  
  88.                 ece:1,  
  89.                 cwr:1;  
  90. #elif defined(BIG_ENDIAN)  
  91.     u_short doff:4,  
  92.                 res1:4,  
  93.                 cwr:1,  
  94.                 ece:1,  
  95.                 urg:1,  
  96.                 ack:1,  
  97.                 psh:1,  
  98.                 rst:1,  
  99.                 syn:1,  
  100.                 fin:1;  
  101. #endif  
  102.     u_short window;                 //窗口大小 16位  
  103.     u_short check;                      //校驗和 16位  
  104.     u_short urg_ptr;                    //緊急指針 16位  
  105.     u_int opt;                              //選項  
  106. };  
  107.   
  108. /*typedef struct tcphdr 
  109. { 
  110.     u_short sport;                      //源端口地址  16位 
  111.     u_short dport;                      //目的端口地址 16位 
  112.     u_int seq;                              //序列號 32位 
  113.     u_int ack_seq;                      //確認序列號  
  114.     u_short doff_flag;                  //頭大小、保留位、標志位 
  115.     u_short window;                 //窗口大小 16位 
  116.     u_short check;                      //校驗和 16位 
  117.     u_short urg_ptr;                    //緊急指針 16位 
  118.     u_int opt;                              //選項 
  119. };*/  
  120.   
  121. //定義UDP頭  
  122. typedef struct udphdr  
  123. {  
  124.     u_short sport;      //源端口  16位  
  125.     u_short dport;      //目的端口 16位  
  126.     u_short len;            //數據報長度 16位  
  127.     u_short check;      //校驗和 16位     
  128. };  
  129.   
  130. //定義ICMP  
  131. typedef struct icmphdr  
  132. {  
  133.     u_char type;            //8位 類型  
  134.     u_char code;            //8位 代碼  
  135.     u_char seq;         //序列號 8位  
  136.     u_char chksum;      //8位校驗和  
  137. };  
  138.   
  139. //定義IPv6  
  140. typedef struct iphdr6  
  141. {  
  142. //#if defined(BIG_ENDIAN)  
  143.     u_int version:4,                //版本  
  144.             flowtype:8,         //流類型  
  145.             flowid:20;              //流標簽  
  146. /*#elif defined(LITTLE_ENDIAN) 
  147. u_int  flowid:20,               //流標簽 
  148.             flowtype:8,         //流類型 
  149.             version:4;              //版本 
  150. //#endif*/  
  151.     u_short plen;                   //有效載荷長度  
  152.     u_char nh;                      //下一個頭部  
  153.     u_char hlim;                    //跳限制  
  154.     u_short saddr[8];           //源地址  
  155.     u_short daddr[8];           //目的地址  
  156. };  
  157.   
  158. //定義ICMPv6  
  159. typedef struct icmphdr6  
  160. {  
  161.     u_char type;            //8位 類型  
  162.     u_char code;            //8位 代碼  
  163.     u_char seq;         //序列號 8位  
  164.     u_char chksum;      //8位校驗和  
  165.     u_char op_type; //選項:類型  
  166.     u_char op_len;      //選項:長度  
  167.     u_char op_ethaddr[6];       //選項:鏈路層地址  
  168. };  
  169.   
  170. //對各種包進行計數  
  171. typedef struct pktcount  
  172. {  
  173.     int n_ip;  
  174.     int n_ip6;  
  175.     int n_arp;  
  176.     int n_tcp;  
  177.     int n_udp;  
  178.     int n_icmp;  
  179.     int n_icmp6;  
  180.     int n_http;  
  181.     int n_other;  
  182.     int n_sum;  
  183. };  
  184.   
  185. //////////////////////////////////////////////////////////////////////////  
  186. //要保存的數據結構  
  187. typedef struct datapkt  
  188. {     
  189.     char  pktType[8];                   //包類型  
  190.     int time[6];                                //時間  
  191.     int len;                                    //長度  
  192.   
  193.     struct ethhdr* ethh;                //鏈路層包頭  
  194.   
  195.     struct arphdr* arph;                //ARP包頭  
  196.     struct iphdr* iph;                  //IP包頭  
  197.     struct iphdr6* iph6;                //IPV6  
  198.   
  199.     struct icmphdr* icmph;      //ICMP包頭  
  200.     struct icmphdr6* icmph6;    //ICMPv6包頭  
  201.     struct udphdr* udph;            //UDP包頭  
  202.     struct tcphdr* tcph;                //TCP包頭  
  203.   
  204.     void *apph;                         //應用層包頭  
  205. };  
  206. #endif  

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com