查找通信网络流量频率的算法

时间:2014-02-27 20:40:52

标签: python algorithm network-programming statistics fft

我正在编写一种算法,通过它在一天内通信的频率来识别异常网络流量。例如,能够通过定期发送回家的特征来检测恶意软件,这与普通用户的流量不同。

我正在寻找的特征 *定期回家 *在比正常用户活跃的更长时间内回家,等等。

这有点挑战性,因为可能感染恶意软件的多个用户通常隐藏在防火墙后面(他们具有相同的IP地址)。似乎我可以应用FFT来搜索数据集中的特定频率,但我无法在网上找到任何类似的搜索。

我提供的数据包括 *纪元时间(发生出站通信的第二个) *用户IP地址 *目标网址

以下是一个例子。在顶部,您会看到一天中的每一秒,并且恶意软件会在24小时内定期(相当于每天约2k次,可能是多次感染)尝试回来。

第二张图显示了数据的基本FFT变换

Malware communication intervals and 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的流量相比有点不同)。我试图弄清楚如何从下面的图形结果中精炼算法,并以编程方式确定是否有潜在的通信频率看起来更像机器说话而不是人类。任何想法或在线参考将非常感激。

1 个答案:

答案 0 :(得分:0)

我不是这方面的专家,但我认为在时域中这样做可能更容易。首先,我将按目标网址对数据进行分组。然后我会计算这些URL请求之间的间隔(可能会丢弃您的分析只有几个点击的URL)。您可以将每个URL的这些间隔视为统计分布中的样本。计算直方图并查看它们的分布情况。如果请求来自人,则间隔应该是随机的(我的第一个猜测将是指数分布)。如果您发现某些间隔(例如一小时或一天)更频繁出现,则可能表示恶意软件呼叫回家。当然,它也可能是一些应用程序检查更新,恶意软件可能通过随机化其调用之间的时间来隐藏其轨道。