我想在 python 中构建一个数据包嗅探器,它能够嗅探数据包、分析它们并在第二步中将数据包注入(inject)本地接口(interface)。
我找到了一个示例,我必须稍微调整一下才能工作。我的工作版本如下所示:
from pprint import pprint
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.bind(("192.168.1.100", 0))
#s.socketopt(socket.IPPOROT_IP, socket.IP_HDRINCL, 1)
#s.ioct(socket.SIO_RCVALL, socket.RCVALL_ON)
i = 5
while i > 0:
data = s.recvfrom(10000)
pprint(data)
i -= 1
我得到的输出是这样的:
(b'E\x00\x008\x05>\x00\x00@\x06\xf1c\xc0\xa8\x01j\xc0\xa8\x01d\x10\x00#*'
b'\xe25\xfc\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x8cQ\x00\x00\x02\x04\x05\xb4'
b'\x08\n\x00Q,\xd2\x00\x00\x00\x00\x00\x00',
('192.168.1.106', 0))
(b'E\x00\x008\x05?\x00\x00@\x06\xf1b\xc0\xa8\x01j\xc0\xa8\x01d\x10\x01#*'
b'\xd0\x03\x9a\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x00o\x00\x00'
b'\x02\x04\x05\xb4\x08\n\x00Q,\xe6\x00\x00\x00\x00\x00\x00',
('192.168.1.106', 0))
(b'E\x00\x008\x05@\x00\x00@\x06\xf1a\xc0\xa8\x01j\xc0\xa8\x01d\x10\x02#*'
b'\xa5\xd18\x00\x00\x00\x00\x00\x90\x02\x11\x1c\x8c\x8c\x00\x00'
b'\x02\x04\x05\xb4\x08\n\x00Q,\xfa\x00\x00\x00\x00\x00\x00',
('192.168.1.106', 0))
(b'E\x00\x008\x05A\x00\x00@\x06\xf1`\xc0\xa8\x01j\xc0\xa8\x01d\x10\x03#*'
b'\x96\x9e\xd6\x00\x00\x00\x00\x00\x90\x02\x11\x1c\xfd\xa9\x00\x00'
b'\x02\x04\x05\xb4\x08\n\x00Q-\x0e\x00\x00\x00\x00\x00\x00',
('192.168.1.106', 0))
(b'E\x00\x008\x05B\x00\x00@\x06\xf1_\xc0\xa8\x01j\xc0\xa8\x01d\x10\x04#*'
b'\xa9\xb0\xfe\x00\x00\x00\x00\x00\x90\x02\x11\x1c\xc2\x82\x00\x00'
b'\x02\x04\x05\xb4\x08\n\x00Q-"\x00\x00\x00\x00\x00\x00',
('192.168.1.106', 0))
输出让我很困惑,我不确定如何使用它。我期待一个字节数组,但在多个数组中有几个我不希望出现的字符,如 E、>、@、# 等。我试图找出它们的意思,但我无法获得任何解释如何使用它的信息。我想解析来自 TCP 部分的信息并对其进行分析,但我无法在这方面取得任何进展。
如果有人能向我解释字节数组的格式到底是什么以及每个组件的含义,那将非常有帮助!
非常感谢您提供的任何帮助!
最佳答案
Kevin 的评论帮助我解决了我的问题:
这是适合我的代码。它感觉不像是一个干净的解决方案,但它确实有效。如果有人知道如何在不转换字节的情况下打印实际字节的正确方法,我也会很高兴知道这一点。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.bind(("192.168.1.100", 0))
i = 5
while i > 0:
data = s.recvfrom(10000)
print("b'{}'".format(''.join(' {:02x}'.format(b) for b in data[0])))
i -= 1
关于Python RAW 套接字解释数据字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51826523/