Python RAW сокет интерпретирует байты данных

Я хочу построить анализатор пакетов в Python, который может анализировать пакеты, анализировать их и на втором этапе вводить пакеты на локальном интерфейсе.

Я нашел пример, который мне пришлось немного подправить, чтобы работать. Моя рабочая версия выглядит так:

from pprint import pprint
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.bind(("192.168.1.100", 0))
#s.socketopt(socket.IPPOROT_IP, socket.IP_HDRINCL, 1)
#s.ioct(socket.SIO_RCVALL, socket.RCVALL_ON)
i = 5
while i > 0:
    data = s.recvfrom(10000)
    pprint(data)
    i -= 1

Вывод, который я получаю, выглядит следующим образом:

(b'E\x00\x008\x05>\x00\x00@\x06\xf1c\xc0\xa8\x01j\xc0\xa8\x01d\x10\x00#*'
 b'\xe25\xfc\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x8cQ\x00\x00\x02\x04\x05\xb4'
 b'\x08\n\x00Q,\xd2\x00\x00\x00\x00\x00\x00',
 ('192.168.1.106', 0))
(b'E\x00\x008\x05?\x00\x00@\x06\xf1b\xc0\xa8\x01j\xc0\xa8\x01d\x10\x01#*'
 b'\xd0\x03\x9a\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x00o\x00\x00'
 b'\x02\x04\x05\xb4\x08\n\x00Q,\xe6\x00\x00\x00\x00\x00\x00',
 ('192.168.1.106', 0))
(b'E\x00\x008\x05@\x00\x00@\x06\xf1a\xc0\xa8\x01j\xc0\xa8\x01d\x10\x02#*'
 b'\xa5\xd18\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x8c\x8c\x00\x00'
 b'\x02\x04\x05\xb4\x08\n\x00Q,\xfa\x00\x00\x00\x00\x00\x00',
 ('192.168.1.106', 0))
(b'E\x00\x008\x05A\x00\x00@\x06\xf1`\xc0\xa8\x01j\xc0\xa8\x01d\x10\x03#*'
 b'\x96\x9e\xd6\x00\x00\x00\x00\x00\x90\x02\x11\x1c\xfd\xa9\x00\x00'
 b'\x02\x04\x05\xb4\x08\n\x00Q-\x0e\x00\x00\x00\x00\x00\x00',
 ('192.168.1.106', 0))
(b'E\x00\x008\x05B\x00\x00@\x06\xf1_\xc0\xa8\x01j\xc0\xa8\x01d\x10\x04#*'
 b'\xa9\xb0\xfe\x00\x00\x00\x00\x00\x90\x02\x11\x1c\xc2\x82\x00\x00'
 b'\x02\x04\x05\xb4\x08\n\x00Q-"\x00\x00\x00\x00\x00\x00',
 ('192.168.1.106', 0))

Вывод немного смутил меня, и я не уверен, как его использовать. Я ожидал байтовый массив, но в нескольких массивах есть несколько символов, которых я не ожидаю, например E, >, @, # и так далее. Я пытался выяснить, что они имеют в виду, но мне не удалось получить какую-либо информацию, объясняющую, как ее следует использовать. Я хочу проанализировать информацию из TCP-части и проанализировать ее, но не могу добиться никакого прогресса в этом.

Если бы кто-то мог объяснить мне, что именно представляет собой формат байтового массива и что означает каждый из компонентов, это было бы очень полезно!

Заранее большое спасибо за любую помощь!

2 ответа

Решение

Комментарий Кевина помог мне в решении моей проблемы:

Это код, который работает для меня. Это не похоже на чистое решение, но оно работает. Если кто-то знает, как правильно печатать настоящие байты без их преобразования, я был бы признателен, если бы знал об этом.

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.bind(("192.168.1.100", 0))

i = 5
while i > 0:
    data = s.recvfrom(10000)
    print("b'{}'".format(''.join(' {:02x}'.format(b) for b in data[0])))
    i -= 1

Ваш вывод показывает потоки байтов, они выглядят как b'x '. на стороне отправителя кодирование данных (данных) с типом кодирования (например, "ascii" или "utf-8" или...) и декодирование (данные) получателя на другой стороне. поэтому вы должны понимать правильный тип кодирования и декодировать (данные) на своей стороне. уважение

Другие вопросы по тегам