日行一记-2017-7-10
修改2017-7-26 插上代码,及遇到的部分的解决方法。
基于scapy嗅探性能测试脚本程序。
公司需要一个发包程序测试嗅探设备采集性能。
找个好久,发现了scapy构包工具,用Python写的,没用过Python,只能边学边用。
scapy能够自定义构造各种类型的包,最重要的能够构造80211 prboe request报文。
代码先不写,因为目前写得比较简单且还要 改。
预留一块地方:
代码已带上,新接触python写得不好,请原谅!
#!/usr/bin/env python
#coding:utf-8
#this script generates high volume of 802.11 Probe Requests frames.
#Each frame have uniq random source MAC.
#author:heguijin 2017年7月26日15:32:18
#You need injection supported device.
import logging,sys,getopt,time
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
from scapy.all import RandMAC
#my sendp function
def my_sendp(x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs):
__my_gen_send(conf.L2socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime)
def __my_gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs):
if type(x) is str:
x = conf.raw_layer(load=x)
if not isinstance(x, Gen):
x = SetGen(x)
if verbose is None:
verbose = conf.verb
n = 0
if count is not None:
loop = -count
elif not loop:
loop=-1
try:
while loop:
last_time = 0
for p in x:
# '''
now_time = time.clock()
while (now_time - last_time < inter):
now_time = time.clock()
last_time = now_time
# '''
s.send(p)
n += 1
if loop < 0:
loop += 1
except KeyboardInterrupt:
pass
s.close()
if verbose:
print "\nSent %i packets." % n
#main
def main():
iface = 'wlan0mon'
interval = 0.1
count = 100
# machead='80:00:00'
machead='da:a1:19'
#opts
try:
opts,args = getopt.getopt(sys.argv[1:],"i:n:t:m:")
except getopt.GetoptError as e:
print '-i <iface> -n <packs> -m <machead> -t <interval>'
sys.exit(-1)
for opt, arg in opts:
if opt == '-i':
iface = arg
elif opt == '-n':
count = int(arg)
elif opt == '-t':
interval = float(arg)
elif opt == '-m':
mac = arg
elif opt == '-h':
print '-i <iface> -n <packs> -m <machead> -t <interval>'
sys.exit(1)
print "iface=%s, packs=%d, machead=%s, interval=%f" %(iface,count,mac,interval)
s_time = time.time()
print "start time:%f" % s_time
print "Press CTRL+C to Abort"
my_sendp(RadioTap()/
Dot11(type=0,subtype=4,
addr1="ff:ff:ff:ff:ff:ff",
addr2=RandMAC(mac),
addr3="ff:ff:ff:ff:ff:ff"),
iface=iface,count=count,inter=interval,verbose=1)
e_time = time.time()
print "end time=%f, spend time=%f" %(e_time, e_time - s_time)
if __name__ == "__main__":
main()
遇到的坑:
1.因为之前要用omnipeek抓取无线帧,我搞了专门抓包的驱动。
然后网上找了很多scapy发送probe报文的代码,测试发现另一台电脑和嗅探都抓不了发送的报文。
纠结1天多,以为是代码问题,换了几套代码。
后来换了张网卡,配置为监听模式,居然就好了。蛋蛋的忧伤~~
发包程序用一般的驱动(默认安装的驱动)就行,配置为监听模式。
2.scapy每秒发包性能问题,在公安三所测时,他的程序每秒能够5000个,虽然是beacon包。
而发送1000个包要1至2秒。
可能是用虚拟机,也可能是网卡性能,或者scapy最小发包间隔为1毫秒。
原因还没有确认,待验证。
经测试性能主要卡在sendp函数,scapy sendp函数内部inter时间用了time.sleep函数。
time.sleep函数,时间最大精确单位位毫秒,而且time.sleep用越久越容易产生误差。
阻塞方式不适合频繁大量发包。
我自己修改sendp函数,time.sleep方式改为 time.clock方式。