Больше данных в пакете - PullRequest
       21

Больше данных в пакете

0 голосов
/ 21 февраля 2010

У меня есть следующий код

int ParseData (неподписанный пакет char *, int len) { struct ethhdr * ethernet_header; struct iphdr * ip_header; struct 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) { Е (MESG); * +1010 *

    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 голосов
/ 21 февраля 2010

Правильно, добавление sizeof (struct tcphdr) только поможет вам пройти заголовок, а не опции. Чтобы получить реальные данные, вы должны использовать поле 'offset' из заголовка TCP. Смещение рассчитывается от начала заголовка TCP и составляет 4 байта, например, если смещение равно 8, то длина заголовка + параметров равна 32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...