Я сейчас создаю программу для анализа пакетов с использованием Python. Я использую модуль scapy, чтобы прослушать пакет. Когда я пытаюсь прослушать DNS-пакет, используя фильтр "порт 53", я получаю эту ошибку.
Traceback (most recent call last):
File "D:/Semester 7/Packet Sniffer TA/coba_scapy/packet_sniffing_python/sniffer.py", line 165, in <module>
sniff(iface=net_iface, filter=proto_sniff, count=int(pkt_to_sniff), timeout=int(time_to_sniff), prn=packet_log)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sendrecv.py", line 1020, in sniff
sniffer._run(*args, **kwargs)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sendrecv.py", line 973, in _run
session.on_packet_received(p)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sessions.py", line 82, in on_packet_received
result = self.prn(pkt)
File "D:/Semester 7/Packet Sniffer TA/coba_scapy/packet_sniffing_python/sniffer.py", line 138, in packet_log
print(str(ip_src)+" -> "+str(ip_dst)+ " : ( " + packet.getlayer(DNS).qd.qname+ " )")
TypeError: can only concatenate str (not "bytes") to str
Это моя переменная сниффа.
elif (proto_sniff == "arp") or (proto_sniff == "bootp") or (proto_sniff == "icmp") or (proto_sniff == "port 53"):
sniff(iface=net_iface, filter=proto_sniff, count=int(pkt_to_sniff), timeout=int(time_to_sniff), prn=packet_log)
И это где я обрабатываю фильтр, когда пользователь задает порт параметра фильтра 53
def packet_log(packet):
....
elif proto_sniff == "port 53":
if IP in packet:
ip_src = packet[IP].src
ip_dst = packet[IP].dst
if packet.haslayer(DNS) and packet.getlayer(DNS).qr == 0:
print(str(ip_src) + " -> " + str(ip_dst) + " : ( " + packet.getlayer(DNS).qd.qname + " )")
это "ip_src" и "ip_dst" в байтах? как сделать его доступным для записи в методе print ()?
Я пытался найти решение из этого Преобразовать байты в строку , но все равно выдает эту ошибку
Traceback (most recent call last):
File "D:/Semester 7/Packet Sniffer TA/coba_scapy/packet_sniffing_python/sniffer.py", line 166, in <module>
sniff(iface=net_iface, filter=proto_sniff, count=int(pkt_to_sniff), timeout=int(time_to_sniff), prn=packet_log)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sendrecv.py", line 1020, in sniff
sniffer._run(*args, **kwargs)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sendrecv.py", line 973, in _run
session.on_packet_received(p)
File "C:\Users\adika\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scapy-2.4.3.dev61-py3.7.egg\scapy\sessions.py", line 82, in on_packet_received
result = self.prn(pkt)
File "D:/Semester 7/Packet Sniffer TA/coba_scapy/packet_sniffing_python/sniffer.py", line 133, in packet_log
ip_src = ip_src_byte.decode()
AttributeError: 'str' object has no attribute 'decode'
Это то, что я сделал
if IP in packet:
ip_src_byte = packet[IP].src
ip_dst_byte = packet[IP].dst
ip_src = ip_src_byte.decode()
ip_dst = ip_dst_byte.decode()
if packet.haslayer(DNS) and packet.getlayer(DNS).qr == 0:
print(str(ip_src) + " -> " + str(ip_dst) + " : ( " + packet.getlayer(DNS).qd.qname + " )")