0

我有以下代码

int ParseData(unsigned char *packet, int len) { struct ethhdr *ethernet_header; 结构 iphdr *ip_header; 结构 tcphdr *tcp_header; 无符号字符*数据;int data_len;

    /* Check if any data is there */

    if(len > (sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr)))
    {

            ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));


            data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr));
            data_len = ntohs(ip_header->tot_len) - ip_header->ihl*4 - sizeof(struct tcphdr);

            if(data_len)
            {
                    printf("Data Len : %d\n", data_len);
                    PrintData("Data : ", data, data_len);
                    printf("\n\n");
                    return 1;
            }
            else
            {
                    printf("No Data in packet\n");
                    return 0;
            }
    }

}

我正在尝试以 ASCII 打印有效负载并使用这样的简单功能

PrintData(char *mesg, unsigned char *p, int len) { printf(mesg);

    while(len--)
    {
            if(isprint(*p))
                    printf("%c", *p);
            else
                    printf(".");
            p++;
    }

}

代码看起来不错,没有编译问题/警告。问题是第一个有效负载字符不是在位置 0 处打印,而是在 12 个字节后打印。

我认为所有“len”字节都是我必须打印的确切数据。

我的数据点 data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr)); 但是 data[0] 不可打印。问题是什么?我错过了什么吗?我是否必须检查 TCP 选项部分?

谢谢

4

1 回答 1

0

没错,添加 sizeof(struct tcphdr) 只会让你通过标题,而不是选项。要获取实际数据,您应该使用 TCP 标头中的“偏移”字段。偏移量从 TCP 标头开始计算,以 4 字节为单位,例如,如果偏移量为 8,则标头 + 选项长度为 32。

于 2010-02-21T17:00:42.903 回答