Я делаю некоторый анализатор пакетов с помощью python, который печатает пакетные данные на консоль.
он работает, но показывает какой-то странный текст, подобный этому.
1 : E@�4
j#�q���
2 : E@�R4�#�q���
3 : E@��4$#�q���
4 : E@��4�#�q���
5 : E@е4�3#�q���
6 : E@�K4�#�q���
7 : E@Փ4�U#�q���
8 : E@�r4�v#�q���
...
если моя книга верна, тодолжно быть вот так
1 : b'E\x00\x00(\x18\x19@\x00\x80\x06!\x95\xc0\xa8\x00\x05}\x8d\x82\xe7'
2 : b'E\x00\x00(\x18\x19@\x00\x80\x06!\x95\xc0\xa8\x00\x05}\x8d\x82\xe7'
3 : b'E\x00\x00(\x18\x19@\x00\x80\x06!\x95\xc0\xa8\x00\x05}\x8d\x82\xe7'
4 : b'E\x00\x00(\x18\x19@\x00\x80\x06!\x95\xc0\xa8\x00\x05}\x8d\x82\xe7'
...
и весь код Python здесь.
from socket import *
import os
def recvData(sock):
data = ''
try:
data = sock.recvfrom(65565)
except timeout:
data = ''
return data[0]
def sniffing(host):
if os.name == 'nt':
sock_protocol = IPPROTO_IP
else:
sock_protocol = IPPROTO_ICMP
sniffer = socket(AF_INET, SOCK_RAW, sock_protocol)
sniffer.bind((host, 1))
sniffer.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
if os.name == 'nt':
sniffer.ioctl(SIO_RCVALL, RCVALL_ON)
count = 1
try:
while True:
data = recvData(sniffer)
print(str(count) + ' : ' + data[:20])
count += 1
except KeyboardInterrupt:
if os.name == 'nt':
sniffer.ioctl(SIO_RCVALL, RCVALL_OFF)
def main():
host = gethostbyname(gethostname())
print("sniffing : " + host)
sniffing(host)
if __name__ == "__main__":
main()
Я погуглил несколько часов, но не смог найти то же самое.
Возможно, проблема с ascii и unicode, но я не уверен.
Python: v3.7.1
OSX: Mojave v10.14.1
будет действительно полезно, если кто-нибудь найдет что-либо.