Python RAW套接字解释数据字节

时间:2018-08-13 16:09:23

标签: python python-3.x sockets tcp raw-sockets

我想在python中构建一个数据包嗅探器,该嗅探器能够嗅探数据包,对其进行分析,并在第二步中将数据包注入本地接口。

我找到了一个例子,我需要进行一些调整才能工作。我的工作版本如下:

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部分中的信息并对其进行分析,但是我对此没有任何进展。

如果有人可以向我解释一下字节数组的确切格式以及每个组件的含义将非常有帮助!

在此先感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的输出显示字节流,它们看起来像 b'x'。在发送方,具有编码类型(例如:'ascii''utf-8'或...的数据编码(数据) ),并在另一端接收方解码(数据)。因此,您应该在自己身边实现正确的编码类型和解码(数据)。尊重