Как отправить пакет pyshark на определенный сетевой интерфейс? - PullRequest
0 голосов
/ 23 февраля 2019

Я могу прочитать пакет из файла .pcap, используя pyshark.Вот мой код:

import pyshark
cap = pyshark.FileCapture(pcap_dir) # pcap_dir is the directory of my pcap file

print(cap[0]) # Print a packet
print(cap[0]['IP'].src) # Print some header value

Теперь мне нужно отправить этот пакет на некоторый интерфейс (например, eth0).Я попробовал следующее:

from socket import socket, AF_PACKET, SOCK_RAW
sock = socket(AF_PACKET, SOCK_RAW)
sock.bind(('eth0', 0))
sock.send(cap[0])

Но я получаю ошибку:

    sock.send(cap[0])
TypeError: a bytes-like object is required, not 'Packet'

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 27 февраля 2019

Мне удалось решить мою проблему.Вот объяснение:

  • Используйте и use_json=True, и include_raw=True, чтобы иметь возможность получить необработанные данные пакета.
  • Если вы используете print(cap[0]) для печати первого пакета, вы должны увидеть слой с именем FRAME_RAW.Это слой, содержащий весь пакет необработанных данных.

Код:

import pyshark
from socket import socket, AF_PACKET, SOCK_RAW

cap = pyshark.FileCapture(
                input_file=pcap_dir, # pcap_dir the pcap file directory
                use_json=True,
                include_raw=True
              )._packets_from_tshark_sync()

sock = socket(AF_PACKET, SOCK_RAW)
sock.bind(('YOUR_NETWORK_INTERFACE_NAME', 0))
sock.send(bytearray.fromhex(cap.__next__().frame_raw.value)) # 1st packet in the pcap file
sock.send(bytearray.fromhex(cap.__next__().frame_raw.value)) # 2nd packet in the pcap file
# And so on until the end of the file ...
...