我是python的新手,并尝试创建一个数据包解析器。然后我从以下命令中删除了套接字中的以太网数据包:
>>raw=socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x800)) # Raw Packed Created
>>raw=raw.recvfrom(2048) #Received data from socket
>>raw
('\x01\x00^\x00\x00\x01T\xe6\xfc\xd0\x93\x10\x08\x00F\xc0\x00 \x00\x00@\x00\x01\x02Bm\xc0\xa8\x01\x01\xe0\x00\x00\x01\x94\x04\x00\x00\x11d\xee\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ('eth0', 2048, 2, 1, 'T\xe6\xfc\xd0\x93\x10'))
>> ether=raw[0][0:14] #Ethernet header
>>ether_unpack=struct.unpack("!6s6s2s",ether) #Unpack ethernet header into string form
>>ether_unpack #print unpacked data
('\x01\x00^\x00\x00\x01', 'T\xe6\xfc\xd0\x93\x10', '\x08\x00')
>>ether_hex=binascii.hexlify(ether_unpack[0]) #converted data into hexadecimal format
.
.
.
tcpHeader=raw[0][34:54] #strippin TCP packet
tcp_hdr=struct.unpack("!HH16s", tcpHeader) // TCP header unpack
第一个问题:'\ x01 \ x00 ^ \ x00 \ x00 \ x01'的格式是什么?我的第一个输出中的数字格式是什么
第二个问题:ether = raw [0] [0:14]; [0:14]从第一个元组开始占用14个字节?需要确认
第三个问题:tcp_hdr=struct.unpack("!HH16s", tcpHeader)
第一个论点是做什么的?我从某个地方接过这个命令,并且无法弄清楚为什么第一个参数中有“双H”。
提前致谢!
答案 0 :(得分:0)
1)raw
的第一个元素是十六进制格式字符串,您可以使用以下方法将其转换为int列表:
>> payload = [int(x.encode('hex'), 16) for x in raw[0]]
>> [1, 0, 94, 0, 0, 1, 84, 230, 252, 208, 147, 16, 8, 0, 70, 192, 0, 32, 0, 0, 64, 0, 1, 2, 66, 109, 192, 168, 1, 1, 224, 0, 0, 1, 148, 4, 0, 0, 17, 100, 238, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2)是的,raw[0][0:14]
占用raw
元组的第一个元素的前14个字节。
3)解包函数的第一个参数是解压缩给定字符串的格式(https://docs.python.org/2/library/struct.html)。格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式;在这种情况下,!
字符适用于big-endian或little-endian。 'double H'表示应解压缩两个无符号短整数(每个2个字节),后跟由16s
定义的16个字符的字符串(16个字节),因此tcpHeader
是一个20字节的字符串, tcp_hdr
存储一个(int,int,string)元组。