Разложение IP-заголовка - PullRequest
5 голосов
/ 16 марта 2010

Я должен сделать анализатор в качестве задания для курса безопасности. Я использую C и библиотеку pcap. Я получил все работает хорошо (так как я получил код из Интернета и изменил его). Но у меня есть несколько вопросов по поводу кода.

u_int ip_len = (ih->ver_ihl & 0xf) * 4;   

ih имеет тип ip_header, и в данный момент он указывает на IP-заголовок в пакете.
ver_ihl дает версию IP.
Я не могу понять, что это: & 0xf) * 4;

Ответы [ 3 ]

3 голосов
/ 16 марта 2010

& является побитовым и оператором, в этом случае вы возвращаете ver_ihl с 0xf, что приводит к очистке всех битов, кроме младшего значащего 4

0xff & 0x0f = 0x0f

ver_ihl определяется как первые 4 бита = версия + второй 4 = длина заголовка Интернета. Операция и удаляет данные версии, оставляя данные длины самостоятельно. Длина записывается как количество 32-битных слов, поэтому * 4 превращает ip_len в число байтов в заголовке

В ответ на ваш комментарий:

поразрядно и ands соответствующие биты в операндах. Когда вы и все, что с 0, становится 0, а все, что с 1, остается прежним.

0xf = 0x0f = двоичный 0000 1111

Таким образом, когда вы и 0x0f с чем-либо, первые 4 бита устанавливаются в 0 (как вы и сравниваете их с 0), а последние 4 бита остаются такими же, как в другом операнде (как вы делаете их против 1). Это распространенная техника, называемая битовой маскировкой.

http://en.wikipedia.org/wiki/Bitwise_operation#AND

1 голос
/ 17 марта 2010

Чтение из RFC 791 , которое определяет IPv4:

Ниже приводится краткое содержание содержимого интернет-заголовка:

 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Первые 8 бит IP-заголовка являются комбинацией версии и поля IHL.

IHL: 4 бита

Internet Header Length - длина интернет-заголовка в 32 битовые слова, и, следовательно, указывает на начало данных. Обратите внимание, что минимальное значение для правильного заголовка - 5.

То, что делает ваш код, берет первые 8 бит и отбирает часть IHL, затем преобразует ее в число байтов. Побитовое И на 0xF будет изолировать поле МГП, и умножение на 4 произойдет, потому что в 32-битном слове 4 байта.

0 голосов
/ 16 марта 2010

Поле ver_ihl содержит два 4-битных целых числа, упакованных как нижний и верхний nybble. Длина указывается как количество 32-битных слов. Итак, если у вас есть IP-фрейм версии 4 с 20 байтами заголовка, у вас будет значение поля ver_ihl 69. Тогда вы получите это:

  01000101
& 00001111
  --------
  00000101

Итак, да, "& 0xf" маскирует младшие 4 бита.

...