目标:获取本机信息
广告时间: scapy功能很强大啊。但是基本信息还用不到,使用python简单的获取即可。
发送伪造包,就要从ether层进行发送,不然发送例程调用arp来获取目标mac地址的时候,会把本机真实的mac也放在首部。
简单的看下首部:
>>> ls(Ether)
dst : DestMACField = (None)
src : SourceMACField = (None)
type : XShortEnumField = (0)
dst为目标的首部
src为源mac
type为请求类型
校验码是由驱动来完成。所以此次只需要填充这三个就好了。
1. 第一个要解决的问题就是目标mac了,我使用了一个比较简单的方法,就是直接从route表里面查找默认网关,请求网关的地址------
传入参数为本机ip、本机mac地址和是否使用默认写入的网关地址flag。flag为false的话,直接返回一个事先查找好的mac地址。
def GetGateWay(ip,t_hw,flag):
"""
get local gateway
"""
if flag == True:
afile = os.popen("route")
data = afile.read()
afile.close()
#the ip of the gateway
p = re.compile(r'default +(([0-9]+\.?){4})')
gateway = p.findall(data)[0][0]
#send a arp to get the hwaddress
arp = ARP(hwtype = 0x0001,ptype = 0x0800,op = 0x0001,hwsrc = t_hw,psrc = ip,pdst = gateway)
recv = sr1(ARP(str(arp)))
return recv[0].hwsrc
else:
return 'XX:XX:XX:XX:XX:XX'
这个方法的缺点就是如果当时的arp请求很少,那么通过arp包就可以反向查找到真实发送端的ip。可以考虑使用sniff等待一个arp查询。
2. 第一个问题解决后,mac首部就剩下本机mac和类型了
类型直接填入0x0800就好了,
mac获取可以用流传很广的方法:
#=====================================
#return a string like xx:xx:xx:xx:xx:xx
#=====================================
def GetMac():
"""
get the local mathine`s mac address
"""
hwaddress = uuid.uuid1().hex[-12:]
p = re.compile(r'([0-9a-fA-F]{2})')
return p.subn(r'\1:',hwaddress)[0][:-1]
这个方法来查本机的真实ip也很容易找到:
#=====================================
#return a string like 192.168.2.1
#=====================================
def GetIp():
"""
get local ip
"""
return socket.getaddrinfo(socket.gethostname(),None)[-1][4][0]
需求的辅助函数已经完成了,下次就可以开始进行构造了。