计算通信网络流量频率的算法

2 投票
1 回答
855 浏览
提问于 2025-04-17 20:20

我正在写一个算法,用来识别异常的网络流量,主要是通过一天内的通信频率来判断。比如,可以通过恶意软件定期向其控制服务器发送信号的特点来检测它,这和普通用户的流量是不同的。

我正在寻找的特征包括: * 定期向控制服务器发送信号 * 在比普通用户活跃时间更长的时间段内发送信号等等。

这有点挑战,因为通常多个可能感染了恶意软件的用户会被防火墙隐藏在一起(他们共享同一个IP地址)。我觉得可以用快速傅里叶变换(FFT)来查找数据集中的特定频率,但我在网上找不到类似的资料。

我手头的数据包括: * 发生出站通信的时间(以秒为单位) * 用户的IP地址 * 目标网址

下面是一个例子。在顶部,你可以看到一天中每一秒的情况,恶意软件试图定期发送信号(在这个例子中,大约每天发送2000次,可能有多个感染)在24小时内。

第二个图展示了数据的基本FFT变换。

恶意软件通信间隔和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

我不是这方面的专家,但我觉得在时间上处理这个问题可能会更简单。首先,我会根据目标网址把数据分组。接着,我会计算这些网址请求之间的时间间隔(可能会把只有几次请求的网址排除在分析之外)。你可以把这些每个网址的时间间隔看作是从一个统计分布中抽样得到的。然后,绘制一个直方图,看看这些间隔的分布情况。如果请求是来自人类的,那么这些时间间隔应该是随机的(我猜可能是呈指数分布的)。如果你发现某些时间间隔(比如一小时或一天)出现得特别频繁,这可能意味着有恶意软件在进行某种操作。当然,这也可能是某个应用在检查更新,而恶意软件可能通过随机化请求之间的时间来掩盖自己的踪迹。

撰写回答