首页 文章

包有效负载中的更多数据

提问于
浏览
0

我有以下代码

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 =(数据包sizeof(struct ethhdr)ip_header-> ihl * 4 sizeof(struct tcphdr));但数据[0]不可打印 . 问题是什么?我错过了什么吗?我是否必须检查TCP选项部分?

谢谢

1 回答

  • 0

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

相关问题