бинарное содержание пакета (tcpdump или другой снифер)

Модератор: /dev/random

Аватара пользователя
Stauffenberg
Сообщения: 2023
Статус: ☮ PEACE ☮
ОС: открытая и свободная

бинарное содержание пакета

Сообщение Stauffenberg »

Всем привет.

Кто-нибудь знает как легче всего просмотреть содержание отправленного/принятого пакета в бинарном представлении?
TCPdump, к примеру, умеет выводить в ASCII HEX:

Код: Выделить всё

> tcpdump -vv -i wlp2s0 -S port 123 -l -A -nnvvXS
tcpdump: listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:42:55.834585 IP (tos 0x0, ttl 64, id 41491, offset 0, flags [DF], proto UDP (17), length 76)
    192.168.3.100.50083 > 64.113.32.5.123: [udp sum ok] NTPv3, length 48
        Client, Leap indicator:  (0), Stratum 0 (unspecified), poll 0 (1s), precision 0
        Root Delay: 0.000000, Root dispersion: 0.000000, Reference-ID: (unspec)
          Reference Timestamp:  0.000000000
          Originator Timestamp: 0.000000000
          Receive Timestamp:    0.000000000
          Transmit Timestamp:   0.000000000
            Originator - Receive Timestamp:  0.000000000
            Originator - Transmit Timestamp: 0.000000000
        0x0000:  ec23 3dcf 196c 0022 fafe 5d92 0800 4500  .#=..l."..]...E.
        0x0010:  004c a213 4000 4011 740b c0a8 0364 4071  .L..@.@.t....d@q
        0x0020:  2005 c3a3 007b 0038 fbdc 1b00 0000 0000  .....{.8........
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................
        0x0040:  0000 0000 0000 0000 0000 0000 0000 0000  ................
        0x0050:  0000 0000 0000 0000 0000                 ..........
00:42:56.012883 IP (tos 0x0, ttl 55, id 16126, offset 0, flags [none], proto UDP (17), length 76)
    64.113.32.5.123 > 192.168.3.100.50083: [udp sum ok] NTPv3, length 48
        Server, Leap indicator:  (0), Stratum 1 (primary reference), poll 0 (1s), precision -29
        Root Delay: 0.000000, Root dispersion: 0.000000, Reference-ID: ACTS
          Reference Timestamp:  3692821405.467281281 (2017/01/08 00:43:25)
          Originator Timestamp: 0.000000000
          Receive Timestamp:    3692821429.444157630 (2017/01/08 00:43:49)
          Transmit Timestamp:   3692821429.444197565 (2017/01/08 00:43:49)
            Originator - Receive Timestamp:  3692821429.444157630 (2017/01/08 00:43:49)
            Originator - Transmit Timestamp: 3692821429.444197565 (2017/01/08 00:43:49)
        0x0000:  0022 fafe 5d92 ec23 3dcf 196c 0800 4500  ."..]..#=..l..E.
        0x0010:  004c 3efe 0000 3711 2021 4071 2005 c0a8  .L>...7..!@q....
        0x0020:  0364 007b c3a3 0038 8415 1c01 00e3 0000  .d.{...8........
        0x0030:  0000 0000 0000 4143 5453 dc1b fb9d 779f  ......ACTS....w.
        0x0040:  bef3 0000 0000 0000 0000 dc1b fbb5 71b4  ..............q.
        0x0050:  5058 dc1b fbb5 71b6 ee98                 PX....q...
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

Мне нужно то же самое, но не в hex, а в двоичном виде.

Я дебажу RAW сокеты и хочу видеть, что именно отправляет моя программа.
Стандарт описывает заголовки по битам. По битам (00, 011) я их и заполняю, и при отладке хочу в бинарном виде их и видеть.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: бинарное содержание пакета

Сообщение NickLion »

Stauffenberg
Так каждая шестнадцатеричная цифра взаимнооднозначно представляется тетрадой битов, лично у меня уже в уме всё переводится, просто немного практики.

Если сильно надо было бы, я бы сделал что-то вроде: tcpdump -w - | perl -e '$/=\1; $n = 0; while(<>) { print unpack "B*"; $n++; print !($n % 8) ? "\n" : " "; }'.
Но оно пишет единым потоком.
Спасибо сказали:

Аватара пользователя
Stauffenberg
Сообщения: 2023
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: бинарное содержание пакета

Сообщение Stauffenberg »

NickLion
Да, распарсить вывод и перевести его "вручную" это первое что пришло в голову. Просто я подумал, что это велосипед, и наверняка есть возможность сделать это стандартными способами.
Wireshark показывает какие участки последовательности к какому уровню/протоколу относятся. Это упрощает отладку.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали: