Q7
#include <stdio.h>
typedef unsigned short u16;
#define BSWAP_16(x) \
(u16) ( ((((u16)(x) & 0x00ff)) << 8) \
| (((u16)(x) & 0xff00) >> 8) )
u16 bswap_16(u16 x)
{
return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
}
unsigned short check_sum(unsigned short *a, int len)
{
unsigned int sum = 0;
while (len > 1) {
sum += *a++;
len -= 2;
}
if (len) {
sum += *(unsigned char *)a;
}
while (sum >> 16) {
sum = (sum >> 16) + (sum & 0xffff);
}
return (unsigned short)(~sum);
}
int main()
{
unsigned short sum;
unsigned char
buffer[] = {0xc0,0xa8,0x2b,0xea,0xc0,0xa8,0x2b,0x01,0x00,0x11,0x00,0x2d,\ // message pseudo header
0xc2,0x00,0x00,0x35,0x00,0x2d,0x00,0x00,\ // UDP header
// data segment
0xd3,0x04,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x61,\
0x70,0x70,0x68,0x75,0x62,0x05,0x71,0x7a,0x6f,0x6e,0x65,0x02,0x71,0x71,0x03,0x63,0x6f,0x6d,0x00,0x00,0x01,0x00,0x01};
sum = check_sum((unsigned short*)buffer, sizeof(buffer));
u16 num_16 = sum;
printf("IP CheckSum:%x\n", bswap_16(num_16));
printf("IP CheckSum:%x\n", BSWAP_16(num_16));
return 0;
}
输出的就是检验后理论上的checksum,和你抓取的checksum不符就说明数据有误。
蓝色部分是UDP header,最后的d87a是待验证的checksum,代码中统一为0x00,0x00。蓝色部分后的全是data segment。蓝色部分前8对,是source IP和destination IP。
- PS:借鉴的童鞋改改变量名以防查重。