Python Socket,MAC地址格式

时间:2014-12-12 08:02:47

标签: python sockets struct

我是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”。

提前致谢!

1 个答案:

答案 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)元组。