成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文教你如何用C代碼解析一段網絡數據包?

開發 前端 網絡管理
本文的目的是通過隨機截取的一段網絡數據包,然后根據協議類型來解析出這段內存。希望對你有所幫助!

[[416402]]

本文的目的是通過隨機截取的一段網絡數據包,然后根據協議類型來解析出這段內存。

學習本文需要掌握的基礎知識:

  1. 網絡協議
  2. C語言
  3. Linux操作
  4. 抓包工具的使用

其中抓包工具的安裝和使用見下文:

一文包你學會網絡數據抓包

視頻教學鏈接如下:

教你如何抓取網絡中的數據包!黑客必備技能

一、截取一個網絡數據包

通過抓包工具,隨機抓取一個tcp數據包

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

科萊抓包工具解析出的數據包信息如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

數據包的內存信息:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

數據信息可以直接拷貝出來:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

二、用到的結構體

下面,一口君就手把手教大家如何解析出這些數據包的信息。

我們可以從Linux內核中找到協議頭的定義

以太頭:

  1. drivers\staging\rtl8188eu\include\if_ether.h  
  1. struct ethhdr { 
  2.  unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ 
  3.  unsigned char h_source[ETH_ALEN]; /* source ether addr */ 
  4.  unsigned short h_proto;  /* packet type ID field */ 
  5. }; 

IP頭

  1. include\uapi\linux\ip.h  
  1. struct iphdr { 
  2. #if defined(__LITTLE_ENDIAN_BITFIELD)  //小端模式 
  3.  __u8 ihl:4, 
  4.   version:4; 
  5. #elif defined(__BIG_ENDIAN_BITFIELD)    //大端模式 
  6.  __u8 version:4, 
  7.   ihl:4; 
  8. #endif 
  9.  __u8 tos; 
  10.  __u16 tot_len; 
  11.  __u16 id; 
  12.  __u16 frag_off; 
  13.  __u8 ttl; 
  14.  __u8 protocol; 
  15.  __u16 check
  16.  __u32 saddr; 
  17.  __u32 daddr; 
  18.  /*The options start here. */ 
  19. }; 

tcp頭

  1. include\uapi\linux\tcp.h 
  1. struct tcphdr { 
  2.  __be16 source; 
  3.  __be16 dest; 
  4.  __be32 seq; 
  5.  __be32 ack_seq; 
  6. #if defined(__LITTLE_ENDIAN_BITFIELD) 
  7.  __u16 res1:4, 
  8.   doff:4, 
  9.   fin:1, 
  10.   syn:1, 
  11.   rst:1, 
  12.   psh:1, 
  13.   ack:1, 
  14.   urg:1, 
  15.   ece:1, 
  16.   cwr:1; 
  17. #elif defined(__BIG_ENDIAN_BITFIELD) 
  18.  __u16 doff:4, 
  19.   res1:4, 
  20.   cwr:1, 
  21.   ece:1, 
  22.   urg:1, 
  23.   ack:1, 
  24.   psh:1, 
  25.   rst:1, 
  26.   syn:1, 
  27.   fin:1; 
  28. #else 
  29. #error "Adjust your <asm/byteorder.h> defines" 
  30. #endif  
  31.  __be16 window; 
  32.  __sum16 check
  33.  __be16 urg_ptr; 
  34. }; 

因為協議頭長度都是按照標準協議來定義的,

所以以太長度是14, IP頭長度是20, tcp頭長度是20,

各個協議頭對應的內存空間如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

三、解析以太頭

  1. #define MAC_ARG(p) p[0],p[1],p[2],p[3],p[4],p[5] 
  1. struct ethhdr *ethh; 
  2.  unsigned char *p = pkt; 
  3.   
  4.  ethh = (struct ethhdr *)p; 
  5.  
  6.  printf("h_dest:%02x:%02x:%02x:%02x:%02x:%02x \n", MAC_ARG(ethh->h_dest)); 
  7.  printf("h_source:%02x:%02x:%02x:%02x:%02x:%02x \n", MAC_ARG(ethh->h_source)); 
  8.  printf("h_proto:%04x\n",ntohs(ethh->h_proto)); 
  • 注意,數據包中的數據是網絡字節序,如果要提取數據一定要注意字節序問題 ethh->h_proto 是short類型,占2個字節,所以存儲到本地需要使用函數ntohs 其中:
  • n:network 網絡字節序
  • h:host 主機字節序
  • s:short 2個字節 l:
  • long 4個字節
  • ntohl() :4字節網絡字節序數據轉換成主機字節序
  • htons() :2字節主機字節序數據轉換成網絡字節序
  • ntohs() :2字節網絡字節序數據轉換成主機字節序
  • htonl() :4字節主機字節序數據轉換成網絡字節序

當執行下面這條語句時,

  1. ethh = (struct ethhdr *)p; 

結構體指針變量eth的成員對應關系如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

最終打印結果如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

四、解析ip頭

解析ip頭思路很簡單,

就是從pkt頭開始偏移過以太頭長度(14字節)就可以找到IP頭,

解析代碼如下:

  1. #define IP_ARG(p)  p[0],p[1],p[2],p[3] 
  1. /* 
  2.  解析IP頭 
  3. */ 
  4. if(ntohs(ethh->h_proto) == 0x0800) 
  5.  
  6.  iph = (struct iphdr *)(p + sizeof(struct ethhdr)); 
  7.  
  8.  q = (unsigned char *)&(iph->saddr); 
  9.  printf("src ip:%d.%d.%d.%d\n",IP_ARG(q)); 
  10.  
  11.  q = (unsigned char *)&(iph->daddr); 
  12.  printf("dest ip:%d.%d.%d.%d\n",IP_ARG(q)); 
一文教你如何用C代碼解析一段網絡數據包?「含代碼」

Iiph

最終解析結果如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

可以看到我們正確解析出了IP地址, 結果與抓包工具分析出的數據保持了一致。

其中protocol字段表示了ip協議后面的額協議類型,常見的值如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

五、解析tcp頭

查找tcp頭思路很,

就是從pkt頭開始偏移過以太頭長度(14字節)、和IP頭長度(20字節)就可以找到tcp頭,

  1. switch(iph->protocol) 
  2.  { 
  3.   case 0x1: 
  4.    //icmp 
  5.    break; 
  6.   case 0x6: 
  7.    //tcp     
  8.    tcph = (struct tcphdr *)(p + sizeof(struct ethhdr) + sizeof(struct iphdr)); 
  9.    printf("source:%d dest:%d \n",ntohs(tcph->source),ntohs(tcph->dest);  
  10.  
  11.    break; 
  12.   case 0x11: 
  13.    //udp 
  14.     
  15.    break; 
  16.  } 

結構體與內存對應關系

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

打印結果如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

六、學會用不同格式打印這塊內存

在實際項目中,可能我們解析的并不是標準的TCP/IP協議數據包,

可能是我們自己的定義的協議數據包,

只要掌握了上述方法,

所有的協議分析都能夠手到擒來!

有時候我們還需要打印對方發送過來的數據幀內容,

往往我們會以16進制形式將所有數據打印出來,

這樣是最有利于我們分析數據內容的。

1. 按字節打印

代碼如下:

  1. for(i=0;i<400;i++) 
  2.  printf("%02x ",pkt[i]); 
  3.  if(i%20 == 19) 
  4.  { 
  5.   printf("\n"); 
  6.  } 
一文教你如何用C代碼解析一段網絡數據包?「含代碼」

2. 按short類型分析一段內存

我們接收數據時,雖然使用一個unsigned char型數組,

但是有時候對方發送過來的數據可能是2個字節的數組,

那我們只需要用short類型的指針,指向內存的頭,

然后就可以通過該指針訪問到對方發送的數據,

這個時候一定要注意字節序問題,

不同場景可能不一樣,所以一定要具體問題具體分析,

本例因為是網絡字節序數據轉換成主機字節序,

所以需要轉換字節序。

  1. //轉變short型字節序 
  2. void indian_reverse(unsigned short arr[],int num) 
  3.  int i; 
  4.  unsigned short temp
  5.  
  6.  for(i=0;i<num;i++) 
  7.  { 
  8.   temp = 0; 
  9.  
  10.   temp = (arr[i]&0xff00)>>8; 
  11.   temp |= (arr[i]&0xff)<<8; 
  12.   arr[i] = temp
  13.  } 
  14. main() 
  15.  unsigned short spkt[200]; 
  16.   
  17.  ……………… 
  18.  memcpy(spkt,pkt,sizeof(pkt)); 
  19.  
  20.  indian_reverse(spkt,ARRAY_SIZE(spkt)); 
  21.   
  22.  for(i=0;i<200;i++) 
  23.  { 
  24.   printf("%04x ",spkt[i]); 
  25.   if(i%10 == 9) 
  26.   { 
  27.    printf("\n"); 
  28.   } 
  29.  } 
  30.  ……………… 

結果如下:

一文教你如何用C代碼解析一段網絡數據包?「含代碼」

轉載本文請聯系一口Linux公眾號。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-05-11 08:26:56

2021-12-07 06:02:15

Redis Docker運維

2022-09-05 07:32:46

mock數據Stream

2024-12-19 15:00:00

數據清洗Python

2024-11-20 16:42:03

Python科學計算

2023-07-31 21:56:54

哨兵系統redis

2022-02-20 09:56:28

TCPIP網絡協議

2023-12-27 07:40:43

HTTP服務器負載均衡

2024-11-18 17:16:18

Python性能優化編程

2024-11-20 16:12:31

Python圖像處理計算機視覺

2021-01-15 13:18:39

數據模型領域模型代碼

2015-03-27 11:34:59

JavaJava編寫引發內存泄露

2021-01-27 09:34:51

Visual C++Dev C++codelite

2022-08-26 07:02:57

Python工具分割

2019-07-23 07:30:16

2020-12-22 10:02:53

ZabbixMySQL數據庫

2025-05-30 01:00:00

RAG大模型流程

2025-06-20 08:00:00

硬路由軟路由網絡

2018-06-23 08:02:31

程序員代碼故事

2020-03-23 10:06:05

工具代碼開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区免费在线观看 | 欧美日韩精品一区二区三区蜜桃 | 亚洲自拍一区在线观看 | 国产成人免费网站 | 日韩成人影院 | 成人精品一区二区三区四区 | 国产一卡二卡三卡 | 视频一区在线观看 | 日日夜夜草| 日韩一区二区视频 | 黑人巨大精品欧美一区二区免费 | 中文字幕av一区二区三区 | 午夜a级理论片915影院 | 国产日韩欧美二区 | 香蕉久久久 | 二区三区在线观看 | 国产区在线观看 | 欧美视频免费 | 天天插天天狠天天透 | 日韩中文字幕在线观看 | av一区二区三区四区 | 成人免费看电影 | 亚洲欧美日韩网站 | 国产成人免费视频网站视频社区 | 国内自拍偷拍一区 | 成人免费小视频 | 看黄在线 | 亚洲三级在线 | 人成精品| 国产成人精品综合 | 欧美亚洲综合久久 | 久久久tv | 欧美电影免费观看 | 精品国产免费一区二区三区五区 | 欧美美女被c | 干一干操一操 | 超碰美女在线 | 中文字幕一区二区三区在线观看 | 一区二区三区日本 | 亚洲国产成人av | 国产原创视频 |