Как отправить пакет pyshark на определенный сетевой интерфейс?
Я могу прочитать пакет из .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 ответ
Решение
Я смог решить мою проблему. Вот объяснение:
- Используйте оба
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 ...