包有效负载中的更多数据

时间:2010-02-21 16:27:49

标签: network-programming tcp capture payload

我有以下代码

int ParseData(unsigned char * packet,int len) {         struct ethhdr * ethernet_header;         struct iphdr * ip_header;         struct tcphdr * tcp_header;         unsigned char * data;         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)); 但是数据[0]不可打印。问题是什么?我错过了什么吗?我是否必须检查TCP选项部分?

由于

1 个答案:

答案 0 :(得分:0)

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