Python,带有Mac的数据包嗅探器。它打印出奇怪的文字

时间:2018-12-04 09:41:12

标签: python-3.x macos packet-sniffers

我正在用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

如果有人找到它,将会非常有帮助。

1 个答案:

答案 0 :(得分:2)

哦,上帝,拜托了。
我发现了问题。我绝对使用python 3.7.1,python -V命令返回3.7.1。但是,当我运行此代码时,将自动由python2运行。我做了别名设置,所以我认为它将由python3运行。我在控制台上手动使用python3,看起来不错。
谢谢您的评论,下次我将检查所有功能。