使用生成对抗网络(GAN)生成DGA

Posted by webber on Category: 机器学习 Tags: 深度学习 DGA GAN 生成对抗

使用生成对抗网络(GAN)生成DGA


一、 前言

 有些Botnet在进行c2通信时会使用DGA算法生成大量随机的域名,通过少量域名维持与控制服务器的通信。生成的随机域名容易被检测随机性的算法所识别,通常的对抗方法是bot内置一个很大的单词列表,从单词列表中抽取单词并随机组合。本文尝试使用生成对抗网络,训练一个生成器,目标是使生成器生成的域名不具备随机性,更接近人类起域名的习惯,达到以假乱真的效果。但这是一个失败的实验,失败的原因我后文会进行分析。

二、 生成对抗网络(GAN)

 GAN一般由两部组成,生成器(G)和鉴别器(D)。生成器将一个随机的变量作为输入,然后尝试生成一个样本,生成的这个样本目的是让鉴别器无法判断出是来自真实数据还是来自生成器。鉴别器输入的是真实样本和生成器生成的样本,输出的是对样本的分类标签。在训练生成器时,可以将鉴别器的输出作为优化的目标,从而提高生成器的质量。

三、 鉴别器(D)

 在鉴别器中输入的是onehot编码的域名,网络采用双层LSTM网络后接全连接层,输出的是分类标签,包括正常域名、DGA域名、生成器生成的域名,输出标签之前使用了softmax激活函数,因此标签的范围0-1。对于分类问题,损失函数取交叉熵损失函数即可。

D

四、 生成器(G)

 生成器有两个输入,一个随机生成的变量,一个onehot编码的根域名,这里输入根域名代表我们想让G知道生成的域名的根域名,训练时根域名会随机从根域名列表中取。两个输入相乘后送入生成器网络,网络结构与D保持一致。输出的是生成的二级域名的onehot编码,连接上根域名并padding到D输入的长度,D的输出即生成器优化的目标。前面讲到,我希望生成器能够生成足以欺骗过鉴别器D的正常域名,因此训练目标是最大化y0,最小化y1、y2,可将损失函数写成:y1+y2-y0,显然损失函数取值范围为-1到2,当损失函数优化到-1时意味着生成器能够百分百欺骗过鉴别器。

GD

五、 训练过程

  • 在开始训练生成器前,先初始化鉴别器D,训练鉴别器能够准确分类正常域名和DGA域名。训练数据使用Alex top-1m和360-dga的数据,训练1轮准确率和召回率就达到了92%以上,还不错。
  • 开始训练生成器,训练时需要固定鉴别器D的参数。
  • 此时鉴别器还不能识别输入是否是生成器生成的,因此在训练过程中还需要不断训练D,使D能够和G产生对抗,不断的提升G的质量。在训练D时为了保持对真实样本的分类能力,需要加入真实的样本进行训练。因此训练D时,将生成器G输出的一半加上相应量的真实数据,组成一个新的batch对D进行训练。
  • 采用的训练策略:每轮训练7次生成器,训练5次鉴别器。

六、 结果及分析

  训练约300轮后,生成器完全击败了鉴别器,G的损失函数接近于-1,输出也接近于onehot编码的稀疏矩阵。但此时生成的域名也陷入了极端情况,生成的域名类似于ffffffff.com、cccgggqq.kia、gggggqqq.na、iiiiiiii.net等简单重复的域名。 可能的原因:

  • 在鉴别器的训练数据中DGA域名为随机域名,因此不会存在这种简单重复的域名,这样的域名也不符合人类起域名的方式。

  • 在鉴别器中认为此类域名更加接近与人类的起名方法。

  • 生成器可能陷入了局部最优,生成重复的域名要比模仿人类更加容易。

本项目github:https://github.com/bts-webber/GAN_for_DGA

参考文献

[1] [教程 | 详解如何使用Keras实现Wassertein GAN](https://mp.weixin.qq.com/s/F2gBP23LCEF72QDlugbBZQ)


The article is not allowed to repost unless author authorized




You can donate to me if the article makes sense to you

|

Welcome to follow my wechat



Comments