我正在用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
如果有人找到它,将会非常有帮助。
答案 0 :(得分:2)
哦,上帝,拜托了。
我发现了问题。我绝对使用python 3.7.1,python -V
命令返回3.7.1。但是,当我运行此代码时,将自动由python2运行。我做了别名设置,所以我认为它将由python3运行。我在控制台上手动使用python3,看起来不错。
谢谢您的评论,下次我将检查所有功能。