我正在编写一种算法,通过它在一天内通信的频率来识别异常的网络流量。例如,能够检测恶意软件的特点,它的信标定期回家,这是不同的正常用户的流量。
我正在寻找的特征*信标回家定期*信标回家的时间比正常用户更长的时间是活跃的,等等。
这有点困难,因为很多可能被恶意软件感染的用户都隐藏在防火墙后面(他们有相同的IP地址)。似乎我可以应用FFT来搜索数据集中的特定频率,但我还没有在网上找到任何类似的搜索。
我拥有的数据包括*划时代时间(出站通信发生的第二次)*用户IP地址*目标URL
下面是一个例子。在顶部,您可以看到一天中的每一秒,恶意软件试图在24小时内定期地恢复(在这种情况下,每天大约2k次,可能是多个感染)。
第二个图显示了数据的基本FFT变换。

下面是我用来生成FFT转换的代码(在http://glowingpython.blogspot.com/2011/08/how-to-plot-frequency-spectrum-with.html上找到了一个很好的编写),但是仍然不确定如何将FFT应用到问题集中。
def plotSpectrum2(k,day_x, day_y):
"""
Plots a single sided Amplitude spectrum of y(t)
k = session identifier. combination of user IP and dest domain(s)
day_x = array of every second in a day
day_y = array of count of communications from this session each second of the day
"""
fig = pylab.figure()
pylab.subplot(211)
pylab.plot(day_x,day_y,'k',color='red',linewidth=2)
pylab.title('Blah')
pylab.legend(('X'))
pylab.xlabel=('Time')
pylab.subplot(212)
n = len(day_y)
k = arange(n)
Fs = 1.0 #sampling rate - once a second
Ts = 1.0/Fs #sampling interval - at max, collecting once a second
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[range(n/2)] # one side frequency range
y = fft(day_y)/n
y = y[range(n/2)]
pylab.plot(frq,abs(y),'k',color='red',linewidth=2)看起来,特定的频率正在被识别(乍一看,与google.com的流量有很大的不同)。我一直想弄清楚如何从下面的图表结果到改进算法,并通过编程确定通信的基本频率是否看起来更像一台机器,而不是人类。如有任何想法或在线参考,将不胜感激。
发布于 2014-02-28 07:00:03
我不是这方面的专家,但我认为在时间域做这件事可能更容易。首先,我将按目标URL对数据进行分组。然后,我将计算对这些URL的请求之间的间隔(可能只从您的分析中删除几次URL)。您可以将每个URL的这些间隔视为统计分布中的样本。计算一个直方图,看看它们的分布情况。如果请求来自人类,则间隔应该是随机的(我的第一猜测是指数分布的)。如果您看到某些间隔(例如,一小时或一天)出现更频繁,这可能意味着恶意软件打电话回家。当然,它也可能是一些应用程序检查更新,恶意软件可能隐藏它的跟踪通过随机的时间之间的调用。
https://stackoverflow.com/questions/22079856
复制相似问题