C 嗅探时错误地分析udp有效负载数据包

C 嗅探时错误地分析udp有效负载数据包,c,udp,wireshark,packet-sniffers,C,Udp,Wireshark,Packet Sniffers,我有这个密码 此代码解析数据包: Ethernet Header |-Destination Address : xx-xx-xx-Xx-xx-xx |-Source Address : xx-xx-xx-xx-xx-xx |-Protocol : 8 IP Header |-IP Version : 4 |-IP Header Length : 5 DWORDS or 20 Bytes |-Type O

我有这个密码

此代码解析数据包:

Ethernet Header
   |-Destination Address : xx-xx-xx-Xx-xx-xx 
   |-Source Address      : xx-xx-xx-xx-xx-xx 
   |-Protocol            : 8 

IP Header
   |-IP Version        : 4
   |-IP Header Length  : 5 DWORDS or 20 Bytes
   |-Type Of Service   : 0
   |-IP Total Length   : 48  Bytes(Size of Packet)
   |-Identification    : 19348
   |-TTL      : 1
   |-Protocol : 17
   |-Checksum : 48269
   |-Source IP        : 192.168.1.4
   |-Destination IP   : 239.255.255.239

UDP Header
   |-Source Port      : 6555
   |-Destination Port : 6555
   |-UDP Length       : 28
   |-UDP Checksum     : 22582

IP Header
    XX XX XX XX XX XX xx xx xx xx xx xx 08 00 45 00         ..^.......c..E.
    00 30 4B 94                                             .0K.
UDP Header
    00 00 01 11                                             ....
Data Payload
    00 1C 58 36 01 00 00 00 00 00 00 00 01 00 00 00         ..X6............
    C0 A8 01 04 FF FF FF 00                                 ........

###########################################################
正如您所看到的,c代码解析数据有效负载是不正确的,因为有效负载(如Wireshark所说)从
01 00 00
开始,但解析器说它从
00 1C 58 36
(之前4个字节)开始,这是udp的长度和校验和,而不是有效负载

进行解析的函数是
print\u udp\u packet

有效负载偏移量为
sizeof(struct ethhdr)+iphdrlen+sizeof udph看起来不错


如何修复代码?

问题是,变量udph声明为

struct udphdr *udph;
是指针。所以这里

int header_size =  sizeof(struct ethhdr) + iphdrlen + sizeof udph;
这里呢

fprintf(logfile , "UDP Header\n");
PrintData(Buffer+iphdrlen , sizeof udph);
您采用的是指针的大小,而不是结构的大小。在这两种情况下,您都需要使用
sizeof*udph

我假定您使用的是32位系统,因此指针的大小仅为
4
,而结构的大小为
8

int header_size =  sizeof(struct ethhdr) + iphdrlen + sizeof udph;
fprintf(logfile , "UDP Header\n");
PrintData(Buffer+iphdrlen , sizeof udph);