支持向量机检测DGA

article/2025/9/20 19:28:03

先来介绍支持向量机。
其英文全称是Support Vector Machines。支持向量机是我们用于分类的一种算法。支持向量机 (SVM) 是一个非常经典且高效的分类模型。但是,支持向量机中涉及许多复杂的数学推导,并需要比较强的凸优化基础,在参考链接中读者可以参考相关文章,学习从零推导SVM,这里仅以简单地图示帮助大家了解。
在SVM中,选择超平面以最佳地将输入变量空间中的点与它们的类(0级或1级)分开。超平面是纯粹的数学概念,不是物理概念,它是平面中的直线、空间中的平面的推广,只有当维度大于3,才称为“超”平面。
SVM的核心任务就是:构建一个N-1维的分割超平面来实现对N维样本数据放入划分,认定的分隔超平面两侧的样本点分属两个不同类别。
以简单的二维平面为例进行介绍
在这里插入图片描述

A、B、C三条直线哪一条才是正确的分类边界呢?显而易见,只有A“完整”的区分了两种数据的决策边界。
在这里插入图片描述

上图中,A、B、C三条线都完整的区分了边界,那我们应该如何选择呢?既然能区分的工具这么多,那我们理所当然应该找一个最好的是不是?最佳答案应该是B,因为B与边数据的距离是最远的,之所以选择边距最远的线,是因为这样它的容错率更高,表现更稳定,也就是说当我们再次放入更多的点的时候,出错的概率更小
那么由此推导出,SVM的分类方法,首先考虑的是正确分类;其次考虑的优化数据到边界的距离。
接下来更麻烦的情景出现了,请看下图,这些点要怎么分?如果这是在一个二维平面上,这些应该用一条什么线来划分呢?
在这里插入图片描述

难道我们真的要在画一条无限曲折的线去划分吗?如果再怎样曲折还是无法区分又该怎么做呢?这就是线性不可分的情况,其实在现实生活中,大量的问题都线性不可分,而SVM正是处理这种线性不可分情况的好帮手。
处理这类问题的办法就是,将二维平面转化到一个三维空间,因为往往在低维空间下的非线性问题,转化到高维空间中,就变成了线性问题。比如说上面的图也许就变成了下方的情况
在这里插入图片描述

如上图所示,即三维样本数据被二维平面划分,在二维空间中的不可分问题也被转换成了三维线性可分问题,可以被支持向量机处理。基于这个思想,SVM采用核函数来实现低维空间到高维空间的映射,从而在一定程度上解决了低维空间线性不可分的问题。
下面我们简述一下关于核函数的定义,以利于进一步理解他的作用。
核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。
作用:有了这个核函数,以后的高维内积都可以转化为低维的函数运算了,这里也就是只需要计算低维的内积,然后再平方。明显问题得到解决且复杂度极大降低。总而言之,核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积。
常用的核函数有如下一些:例如线性核函数、多项式核函数、径向基核函数(RBF)、高斯核函数、拉普拉斯核函数、sigmoid核函数等等。
简单的理解了SVM的原理,我们再来了解一下模型的训练过程。
被所有的样本和其对应的分类标记交给算法进行训练。
如果发现线性可分,那就直接找出超平面。
如果发现现行不可分,那就映射到n+1维的空间,找出超平面。
最后得到超平面的表达式,也就是分类函数。
接下来我们来看看SVM是怎么应用于检测DGA的

首先加载数据集,数据集中包括从alexa获取的top1000的域名,这些都是正常url数据,以及从360 netlab(https://data.netlab.360.com/dga/)获取的1500条dga域名数据
统一放在了train-data.txt
可以分别使用head和tail命令来看一下
在这里插入图片描述

这里的0和1是我们打的标签,表示对应的域名为正常域名或者为dga域名
有了数据,接下来就是进行要找出能够区分这两种的域名的特征。
我们首先想到的就是信息熵(entropy)
信息熵做密码学或者做通信工程的同学应该都清楚,信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式

其中,x表示随机变量,与之相对应的是所有可能输出的集合,定义为符号集,随机变量的输出用x表示。P(x)表示输出概率函数。变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大.
简单理解就是,对于一个随机字符串,信息熵就代表着字符串中字母出现以及分布的混乱程度。举个例子,对于字符串1:aaaaabbbbb,和字符串2:bhbvsdfhuye;两个字符串长度相同,但是字符串1更有规律,不确定性小,所以信息量小,信息熵也小。
我们在判断DGA时,用的第一个特征就是通过熵来判断域名的混乱程度。代码实现如下
在这里插入图片描述

我们可以预见,dga域名的组成更加随机、混乱,所以其熵会更大,我们可以使用下面几行代码绘图,来看看是否如此
x轴是label,y轴是熵的大小
在这里插入图片描述

测试如下,运行
在这里插入图片描述

得到下图
在这里插入图片描述

从图中可以看到和我们推测的是一致的;
好的,这个特征时可以用于区分正常域名和dga域名的,我们继续看看还有什么特征

我们知道,根据常规来说一个正常的网站一定会希望他的网站域名是读起来朗朗上口并且好记的组成,这种情况下,英语中元音字母的比例会比较高,而dga域名由于是由dga根据时间等因素随机生成的,所以dga域名中元音字母的比例相对来说不会高。我们使用下面的代码获得该比例
在这里插入图片描述

然后使用下面的代码绘图,x轴为label,y轴为比例
在这里插入图片描述

运行
在这里插入图片描述

得到下图
在这里插入图片描述

和我们分析的是一样的,所以这个特征也可以用于进行区分正常域名和恶意域名
我们注意到大部分dga域名的根域名不会是常见的,比如com,cn这种,一来这种域名注册费用比较贵,而来大部分是需要审核的,所以我们可以考虑通过根域名来进行区分。
使用下面的代码
在这里插入图片描述

这里我们假设根域名不是上图所示的cn,com等就是可疑的,给其打标签1,否则打标签0
接下来来同样进行绘图来看看,使用下图的代码
在这里插入图片描述

这里x轴为rootclass的label,0和1分别表示的是常见顶级域和非常见顶级域;y轴为计数
运行后得到下图
在这里插入图片描述

左上角的标注告诉我们蓝色代表数据集自身label为0,黄色代表数据集自身label为1
我们来解释一下这幅图
先看左边的两个rootclass为0 ,我们看出蓝色的比例更高;换句话来说,在根域名为常见顶级域名的情况下,该域名更大比例为正常域名
再看左边的两个rootclass为1,我们看出黄色的比例更高;换句话说,在根域名为不常见的顶级域名的情况下,该域名更大比例为dga域名
那么从图中的结果可以看出,这也可以作为一个特征
我们看看还有没有其他特征?比如域名的长度?
我们来简单实验下
使用下面的代码获取域名长度
在这里插入图片描述

然后绘图,x轴为域名长度,y轴为计数
在这里插入图片描述

运行后得到下面的图片
在这里插入图片描述

同样,蓝色代表正常域名,黄色代表dga域名,我们注意到,dga域名的长度比较集中,集中在7到16;而正常域名虽然在7到16比较集中,但是总体而言,每种长度都是有的,总体接近正态分布。
所以这也可以作为一个特征。
接下来就是要进行归一化,把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到一定范围之内处理,更加便捷快速。比如对于域名长度和熵值就需要归一化处理,代码如下
在这里插入图片描述

接着就是进行将这四个特征提取出来,使用shuffle()将数据集打乱顺序,避免相同label的数据都堆积在一起,然后使用as_matrix()转换为矩阵表示形式
在这里插入图片描述

然后切分训练集和测试集
在这里插入图片描述

选择SVM,核函数选择rbf,然后通过fit进行训练
在这里插入图片描述

通过cross_val_score重复5次进行交叉验证
在这里插入图片描述

测试结果如下
在这里插入图片描述

进行5次得到的结果差异较大,甚至有准确率达到100%的情况,这是因为处于实验室机器性能的考虑,我们的样本数据集很小,导致效果不佳。

参考:
1.https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
2.https://www.jianshu.com/p/95a8f035c86c
3.https://data.netlab.360.com/dga/
4.https://github.com/0FuzzingQ/dga_check
5.https://www.leiphone.com/news/201902/hJT3qqH1k4nbEKvP.html
6.https://zhuanlan.zhihu.com/p/31886934
7.https://blog.csdn.net/am290333566/article/details/81187124


http://chatgpt.dhexx.cn/article/kJCBkCsR.shtml

相关文章

新瓶装旧酒,Ares 银行木马新增 Qakbot DGA 算法

Ares 银行木马在 2021 年 2 月出现,研究人员一直在跟踪该恶意软件的发展。Ares 基于 Osiris 恶意软件家族而来,后者也是由 Kronos 银行木马衍生而来。2022 年 3 月到 2022 年 8 月,Ares 一直都处于静默期。但是 2022 年 8 月 Ares 又重出江湖…

使用机器学习做DGA域名识别

DGA域名 域名生成算法(Domain Generation Algorithm, DGA) 是一项古老但一直活跃的技术, 是中心结构僵尸网络赖以生存的关键武器, 该技术给打击和关闭该类型僵尸网络造成了不小的麻烦。 研究人员需要快速掌握域名生成算法和输入, 以便对生成的域名及时进行处置。 DGA依…

机器学习DGA域名检测

恶意域名 恶意域名是指黑客在攻击过程中或者对目标网络实施控制时,使用dga算法生成的域名,这种域名通常硬编码在恶意软件中。我们在做流量分析时不仅要通过流量的指纹特征识别威胁,也可以通过检测是否解析了恶意域名来判断网络中是否存在肉鸡…

DGA 域名生成算法攻防

文章目录 一、简介二、背景三、作用四、攻击原理五、DGA域名分类按照种子进行分类按照生成算法进行分类 六、DGA域名举例Banjori DGA 域名生成算法 七、检测手段(研究现状)概述基于监督学习的检测基于无监督学习的检测基于注册状态进行检测基于威胁情报进…

基于Python深度学习的DGA域名检测

1 背景介绍 1.1 DGA 域名简介 如今,互联网上的很多恶意攻击行为开始借助由域名生成算法生成的域名来抵抗安防软件的检测。这些域名生成算法通常会借助一组随机种子,持续不断的生成大量随机域名。使用这些 DGA 域名进行攻击的流程如图 1.1 所示。 图 1.…

一个简单的DGA(Domain Generate Algorithm)

黑产的规模和技术是越来越强了,想到一句话:任何人都被骗过,所以同样的任何人都被黑过。 针对大规模简单而粗暴的DDoS网络破坏是如何实现的呢,通常除了一些大规模有组织且政府允许的,还有各种各样的个人组织&#xff0c…

DGA数据集和算法研究

针对DGA的研究现在已经很多了,cnki 里面有116篇论文,涉及到dga黑样本,域名白名单,dga算法分析等,在数据集和dga原理的基础上,提出创新检测方案。因此,抽取共性,综合各家dga之所长&am…

dga (Domain Generation Algorithm) 域名 生成算法 简介

目录 一、引言 二、背景 三、检测 四、发展 五、总结 一、引言 恶意软件如今已经发展为威胁网络安全的头号公敌,为了逃避安全设施的检测,其制作过程也越来越复杂,其中一个典型做法是在软件中集成DGA(Domain Generation Algo…

你没见过的中文编程工具,用中文开发android安卓应用,安卓开发的初体验!

如果你对中文开发有一定的了解,那么你一定会知道易语言。易语言是仿VB制作的一款中文编程工具。它可以用来开发Windows软件。那有没有用于android安卓开发的中文编程工具呢?有!那就是猎码安卓中文开发工具 小编身为一个程序员,在…

自学android编程教程,安卓编程入门教程 安卓编程如何自学

安卓编程入门教程 安卓编程如何自学 时间:2017-04-10 来源:Android开发学习网 安卓编程越来越火,发展前景无比诱人,越来越多的人加入了android开发者的行列。安卓编程入门很简单,今天小编给大家提供一份安卓编程入门教程,告诉大家安卓编程如何自学,希望能够给您带去帮…

没有编程基础如何做安卓开发,试试这款简单易学的中文开发编程工具!

对于没有java编程基础的人来说,想要开发自己的安卓app可能很难。 我们都知道,现在流行的编程工具都是外国人开发的。全英文的界面,再加上全程使英文来写代码,让很多初学者望而却步。绝大部分人选择花费一大笔学费去参加培训班,一学就是几个月,有的甚至半年多。那有没有什…

安卓编程基础——网格布局

目录 前言 一、新课讲解 (一)网格布局概述 1、布局特点 2、继承关系图 3、常用属性 (二)案例演示:计算器界面 1、创建安卓应用 2、准备背景图片 3、字符串资源文件 4、自定义边框配置文件 5、主布局资源文件…

Android应用程序开发需要哪些编程语言?

开发一款Android上的应用程序通常需要以下编程语言: Java:Java是Android开发的主要编程语言。几乎所有的Android应用程序都使用Java进行核心开发。你可以使用Java编写应用程序的业务逻辑、界面设计和数据处理等。 刚好我这里有嵌入式、plc、单片机的资料…

安卓编程基础——触摸事件

文章目录 前言 一、安卓事件触摸概述 1、触摸分类 2、触摸动作 3、触摸监听器 4、触摸方法 5、触点个数与坐标 6、安卓触摸事件处理机制 二、使用步骤讲解 1.创建安卓应用 3、字符串资源文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用,查看效果​编辑 总结…

在手机上如何用c语言编译器编程,如何用手机进行编程?

这里介绍3种可以在手机上编程的app,分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python),都不需要root,可以直接编写程序并运行,下面我简单介绍一下这3个app的安装和简单使用,主要内容如下&#xff1…

Android 网络编程

【Android 网络编程】 HTTP HTTP简介 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。 HTTP协议的主要特点 支持C/…

安卓编程基础——手势编程

目录 前言 (一)安卓手势操作原理 (二)安卓手势类与接口 二、利用手势切换图片 1.创建安卓应用 3、字符串资源文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用,查看效果 总结 前言 现代智能手机都支持…

安卓编程基础——列表

零、本讲学习目标 理解列表视图的四大组成元素 能使用基于数组适配器的列表视图 能使用基于简单适配器的列表视图 能使用基于基适配器的列表视图 一、导入新课 列表视图是基于适配器的供用户从多个选项中进行选择控件,可以通过滑动显示很多列表项。 二、新课讲解…

安卓编程基础——标签

目录 前言 (一)继承关系图 (二)标签常用属性 (三)教学案例:标签演示 1、创建安卓应用 2、字符串资源文件 3、自定义边框配置文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用&a…

安卓编程基础——菜单

前言:学习目标 知道三种菜单使用场景能够正确使用三种菜单 一、新课讲解 菜单在安卓应用程序中占有比较重要的位置。原生安卓提供了三种类型的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜…