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

标签 python algorithm network-programming statistics fft

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

我正在寻找的特征 * 定期向家发出信号 * 在比普通用户活跃的时间更长的时间内向家发送信标,等等。

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

我掌握的数据包括 * 纪元时间(出站通信发生的秒数) * 用户IP地址 * 目标网址

下面是一个例子。在顶部,您会看到一天中的每一秒,以及恶意软件在 24 小时内相当规律地尝试返回信标(在这种情况下每天大约 2000 次,可能多次感染)。

第二张图显示了数据的基本 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 的流量有很大不同)。我一直在试图弄清楚如何从下面的图表结果改进算法,并以编程方式确定是否存在潜在的通信频率看起来更像是机器而不是人类。任何想法或在线引用将不胜感激。

最佳答案

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

关于python - 查找通信网络流量频率的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079856/

相关文章:

sockets - 关于so​​cket编程中getaddrinfo()函数的问题

python - 如何使用 win32 在 Windows 中创建窗口焦点监听器

Python:在 3D numpy 数组中查找连续值而不使用 groupby?

Python - 导入模块获取全局变量

algorithm - 神经网络 - 求解具有时间数组和不同采样率的网络

c - 在代理中,在将浏览器请求发送到主机之前对其进行格式化

python - 子类化 multiprocessing.managers.BaseProxy

algorithm - 如何测试有向图中的二部

c - 什么是 C 中好的开源 B 树实现?

swing - java网络编程的最佳框架?