Чтобы Wireshark понял, что нужно показывать и из чего пакет состоит, надо указать ему размер и тип всех полей данных. Размер - чтобы всё бралось с нужных мест и в нужном порядке, а тип - чтобы программа знала, как данные показать и что там записано. Для особо сложных случаев можно сделать свои правила отображения и пересчёта в человекопонятные величины.
Посмотрим на типы данных:
intX — число со знаком, X бит;
uintX — число без знака, X бит;
boolX — логическое значение (0 - ложь, остальное — истина), X бит;
enumX — перечисление, X бит;
bitfieldX — битовое поле, Х бит;
struct — структура со вложенными полями.
читать дальшеВ пакетах и структурах размеры данных, а также размеры битовых полей и перечислений должны быть кратны 8 битам: int8, bool16, uint32, enum8...
В битовых масках размеры могут быть какими угодно: bool3, uint2, enum5 ...
Битовые поля служат для деления байта/слова и т.д. на более мелкие части, если такое требуется.
Рассмотрим по очереди перечисления, структуры и битовые поля:
1. Перечисления.
По сути это то же самое, что и перечисления в Си — последовательность символов ассоциируется с некоторым числом. Размер поля, которое занимает перечисление, указывается сразу: enum1, enum2, enum8, enum32...
Обращаться к элементам перечисления надо с использованием названия типа: T_nya_command::KISKIS и т.д, иначе вас не поймут.
2. Структуры.
Все размеры полей структур должны быть кратны 8 битам. Порядок байт в полях, чей размер больше байта, определяется параметром, указываемым в начале структуры:
или
Дальше идут сами поля в определённом протоколе порядке:
Выглядит эта структура примерно так в wireshark:
Полям можно указывать способ форматирования чисел, задавать строку форматирования вывода или заменять целиком (правда, при этом не будет подсветки положения поля в hex-просмотрщике.
Например, чтоб показать hex:
Или, более гибко:
В принципе, любое поле можно скрыть и вывести текстом с описанием, выделением цветом и как угодно. Из минусов — нельзя по нему будет фильтровать и нет подсветки поля в просмотрщике байт
Вместо print можно использовать chat (светло-фиолетовый фон), note (голубой фон), warning (жёлтый фон), error (красный фон). Главное, не забывать пробел перед скобочкой. Ну и помнить, что это употребляется в связи со всякими ошибками и лажей.
Там же можно использовать условные выражения для вывода:
Для простых условий может хватить и внутристрочного условия:
Для сложных расчётов и хитрого форматирования можно использовать даже функции.
Все структуры сворачиваются в одну строчку. И к ней тоже можно прицепить краткое описание. Например, IP:
Или МАС:
И эта отформатированная строчка напишется рядом с названием поля, которое представлено структурой:
3. Битовые поля.
Битовое поле — это такая структура, работающая в пределах нескольких байт, где размеры элементов могут быть какими угодно:
Размер всех полей в сумме должен быть равен размеру всего битового поля.
К слову, если числа бывают какие угодно, то bool ограничены в размерах: 1, 8, 16, 32 бит. bool2 не бывает.
Процесс разбора происходит в несколько этапов, часть из которых от нас не зависят:
1. После приёма пакета проверяются фильтры на пакет, которые указаны в файле wsgd (например, номер порта).
2. Если всё ок, то данные пакета накладываются на структуру, указанную в параметре MSG_HEADER_TYPE и у ряда переменных появляются вполне определённые значения. В нашем случае интересует только поле command;
3. Содержимое поля подставляется в конструкцию выбора switch, указанную в параметре MSG_MAIN_TYPE;
4. Тип пакета, который соответстует данному значению команды, и указан в выбираторе, и будет использован для отображения:
Вместо кавычек "" можно написать любой идентификатор, тогда все поля структуры будут во вкладке с этим же названием:
структуры можно вкладывать друг в друга, причём даже не объявляя отдельно:
Размер массива указывается около типа. Их лучше оборачивать в структурки, потому что каждому элементу соответствует отдельная строка вывода. И если их много, то получится простыня. Лучше такое прятать.1.
Введение;
2.
Пример;
3. Типы данных и выбиратор.
...