我对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\x01’的格式是什么?我的第一个输出中的数字格式是什么?
第二个问题: ether=raw;从第一个元组获得14个字节的0:14?需要确认
第三个问题:tcp_hdr=struct.unpack("!HH16s", tcpHeader)第一个论点是做什么的?我从某个地方接受了这个命令,我不明白为什么第一个参数中有'double H‘。
提前感谢!
发布于 2015-01-06 21:33:25
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)。格式字符串的第一个字符可用于指示打包数据的字节顺序、大小和对齐方式;在本例中,!字符用于大端或小端字节。“double H”意味着两个无符号的短整数应该被解压缩(每个2字节),然后是由16s定义的16个字符字符串(16个字节),因此tcpHeader是一个20个字节字符串,tcp_hdr存储一个(int,int,string)元组。
https://stackoverflow.com/questions/27439278
复制相似问题