域名生成算法(Domain Generation Algorithm,DGA)是一项古老但一直活跃的技术,是中心结构僵尸网络赖以生存的关键武器,该技术给打击和关闭该类型僵尸网络造成了不小的麻烦。研究人员需要快速掌握域名生成算法和输入,以便对生成的域名及时进行处置。我们尝试使用NB算法来区分正常域名以及DGA域名,DGA详细内容请阅读第12章。完整演示代码请见本书GitHub上的7-4.py。
1.数据搜集和数据清洗
加载alexa前1000的域名作为白样本,标记为0;分别加载cryptolocker和post-tovar-goz家族的DGA域名,分别标记为2和3:
x1_domain_list = load_alexa("../data/top-1000.csv") x2_domain_list = load_dga("../data/dga-cryptolocke-1000.txt") x3_domain_list = load_dga("../data/dga-post-tovar-goz-1000.txt") x_domain_list=np.concatenate((x1_domain_list, x2_domain_list,x3_domain_list)) y1=[0]*len(x1_domain_list) y2=[1]*len(x2_domain_list) y3=[2]*len(x3_domain_list) y=np.concatenate((y1, y2,y3))
2.特征化
以2-gram处理DGA域名,如图7-4所示。
图7-4 DGA域名2-gram处理
以2-gram分隔域名,切割单元为字符,以整个数据集合的2-gram结果作为词汇表并进行映射,得到特征化的向量:
cv = CountVectorizer(ngram_range=(2, 2), decode_error="ignore", token_pattern=r"\w", min_df=1) x= cv.fit_transform(x_domain_list).toarray()
3.训练样本
实例化NB算法:
clf = GaussianNB()
4.效果验证
我们继续使用三折交叉验证:
print cross_validation.cross_val_score(clf, x, y, n_jobs=-1,cv=3)
测试结果如下,准确率93%左右,相当不错。
[ 0.9491018 0.92992993 0.92792793]