首先从最简单的以太网层开始。我们知道,目前常用的以太网帧结构有两种,一个是IEEE802.3,一个是Ethernet II,两者的区别也很清楚,就是在目的Mac地址和源Mac地址好后面的两个字节是代表长度还是类型。
EtherType是以太帧里的一个字段,用来指明应用于帧数据字段的协议。根据
IEEE802.3,Length/EtherType字段是两个八字节的字段,含义两者取一,这取决于其数值。在量化评估中,字段中的第一个八位字节是最重要的。而当字段值大于等于十进制值1536(即十六进制为0600)时,EtherType字段表示为MAC客户机协议(EtherType解释)的种类。该字段的长度和EtherType详解是互斥的。
在python中我是用一个字典来实现的:
EtherType={'0x0600':'XEROX NS IDP',
'0x0660':'DLOG',
'0x0661':'DLOG',
'0x0800':'IP',
'0x0801':'X.75',
'0x0802':'NBS',
'0x0803':'ECMA',
'0x0804':'Chaosnet',
'0x0805':'X.25',
'0x0806':'ARP',
'0x0808':'Frame Relay ARP',
'0x6559':'Raw Frame Relay',
'0x8035':'RARP',
'0x8037':'Novell Netware IPX',
'0x809B':'Ether Talk',
'0x80d5':'IBM SNA Service over Ethernet', '0x80f3':'AARP',
'0x8100':'EAPS',
'0x8137':'IPX',
'0x814c':'SNMP',
'0x86dd':'IPv6',
'0x880b':'PPP',
'0x880c':'GSMP',
'0x8847':'MPLS(unicase)',
'0x8848':'MPLS(multicast)',
'0x8863':'PPPoE(Discovery stage)',
'0x8864':'PPPoE(ppp session stage)',
'0x88bb':'LWAPP',
'0x88cc':'LLDP',
'0x8e88':'EAP over LAN',
'0x9000':'Loopback',
'0x9100':'VLAN Tag PI',
'0x9200':'VLAN Tag PI',
'0xffff':'Reservations'
}
然后根据二进制字符来分解:
#framedata.py
#!/usr/bin/python
class Protocol(object):
def__init__(self):
pass
python怎么读取桌面上的文件#transform like'\x01\x0e\0xb0'to'0x010eb0' def str_to_hex(self,strs):
hex_data=''
for i in range(len(strs)):
tem=ord(strs[i])
tem=hex(tem)
if len(tem)==3:
place('0x','0x0')
place('0x','')
hex_data=hex_data+tem
return'0x'+hex_data
class Ethernet(Protocol):
def__init__(self,datastr=None):
self.dst=None
self.src=None
self.len=None
self.datastr=datastr
def decode(self):
tem=self.str_to_hex(self.datastr[0:6])
self.dst=tem[2:4]+':'+tem[4:6]+':'+tem[6:8]+':'+tem[8:10]+':'+tem[10:12]+':'+tem[12:14]
tem=self.str_to_hex(self.datastr[6:12])
self.src=tem[2:4]+':'+tem[4:6]+':'+tem[6:8]+':'+tem[8:10]+':'+tem[10:12]+':'+tem[12:14]
self.unknow=self.str_to_hex(self.datastr[12:14])
tem=int(self.unknow,16)
dststr='Destination:'+self.dst
srcstr='Source:'+self.src
if tem<=1500:
self.len=tem
lenstr='Length:'+str(self.len)
hertype,dststr,srcstr,lenstr]
elif tem>=1536:
typestr='Type:'+pe+'('+self.unknow+')'
hertype,dststr,srcstr,typestr]
其中父类Protocol还在初级探索阶段,没有成型,以后会根据需要完善。测试:
#!/usr/bin/python
from readpcapfile import*
from framedata import*
data=rdpcap("C:\\Python25\\code\\pcap\\PcapReader\\pcap\\test_ether.pcap")
for i in range(len(data)):
strs=data[i][1]
test=Ethernet(strs)
Ether_data=test.decode()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论