Как я могу написать диссектор Wirechark, где формат пакета зависит от поля в пакете? - PullRequest
0 голосов
/ 10 апреля 2020

Я пишу диссектор Wireshark для собственного протокола. Протокол выглядит следующим образом: первые 3 бита пакета определяют, как создается остальная часть пакета. Например, если эти 3 бита равны 00, остаток пакета представляет собой 6-битное поле, за которым следуют 2-байтовые поля. Если начальный 3-бит равен 01, остаток пакета представляет собой 14-битное поле, за которым следует поле байтов. Я успешно проанализировал ведущее 2-битное поле (которое я назвал hf_format). В функции диссектора Мой код делает это в данный момент:

proto_tree_add_item( ..hf_format...);
if(hf_format==0)
{
   proto_tree_add_item( ..6-bit field...);
   proto_tree_add_item( ..first byte field...);
   proto_tree_add_item( ..second byte field...); 
}
else if (hf_format==1)
{
   proto_tree_add_item( ..14-bit field...);
   proto_tree_add_item( ..byte field...);
}
else  etc.

Wireshark правильно показывает hf_format в рассеченном пакете, но другие поля не рассекаются. Можете ли вы сказать мне, в чем моя ошибка? Я много обыскивал в Интернете и читал каждый документ, который смог найти, включая официальную документацию, но не нашел ничего поучительного в этом вопросе.

1 Ответ

0 голосов
/ 10 апреля 2020

Первые 3 бита пакета определяют способ построения остальной части пакета.
Я предполагаю, что это опечатка, и вы имели в виду Первые 2 бита .. . ?

Где-то до / после proto_tree_add_item( ..hf_format...); вы должны фактически прочитать хотя бы 1-й байт из tvb, чтобы вы могли проверить 2 соответствующих старших бита этого байта. Возможно, вы делаете это, но это не показано в предоставленном псевдокоде. Например:

guint8 format = (tvb_get_guint8(tvb, 1) & 0xc0) >> 6;
proto_tree_add_item( ..hf_format...);
if(format==0)
{
   proto_tree_add_item( ..6-bit field...);
   proto_tree_add_item( ..first byte field...);
   proto_tree_add_item( ..second byte field...); 
}
else if (format==1)
{
   proto_tree_add_item( ..14-bit field...);
   proto_tree_add_item( ..byte field...);
}
else  etc.

Руководство разработчика Wireshark предоставляет здесь дополнительную помощь, но содержит ссылку на файл doc / README.dissector для получения дополнительной информации. и это будет моей рекомендацией. Есть и другие полезные README, такие как doc / README.developer , et c.

...