WebShell本质上就是一个远程管理工具,只不过被黑客利用了。一系列管理功能本质上是一系列函数调用,于是我们尝试针对函数调用建立特征。完整演示代码请见本书GitHub上的7-3.py。
1.数据搜集和数据清洗
针对黑样本集合,以1-gram算法生成全局的词汇表,其中1-gram基于函数和字符串常量进行切割,所以设置token的切割方法为:r'\b\w+\b\(|\'\w+\''。
webshell_bigram_vectorizer = CountVectorizer(ngram_range=(1, 1), decode_error="ignore", token_pattern = r_token_pattern,min_df=1) webshell_files_list=load_files("../data/PHP-webSHELL/xiaoma/") x1=webshell_bigram_vectorizer.fit_transform(webshell_files_list).toarray()
生成的词汇表如下:
{u"'qid'": 81, u"'shellcode'": 92, u'str_rot13(': 328, u'getuid(': 210, u'while(': 348, u"'host'": 50, u"'hkwwj'": 49, u'fatal(': 174, u'ss(': 324, u'connect(': 149, u'fprintf(': 195, u'flush(': 190, u'fread(': 197, u'sigsegv(': 318, u"'km'": 59, u'phpversion(': 288, u'longjmp(': 243, u'cdoount(': 140, u'akmi4(': 123, u'edoval(': 162, u'65534(': 114, u'exit(': 170, u'uid(': 342,
2.特征化
使用黑样本生成的词汇表vocabulary,将白样本特征化:
wp_bigram_vectorizer = CountVectorizer(ngram_range=(2, 2), decode_error="ignore",token_pattern = r_token_pattern,min_df=1,vocabulary=vocabulary) wp_files_list=load_files("../data/wordpress/") x2=wp_bigram_vectorizer.fit_transform(wp_files_list).toarray()
3.训练样本
创建NB实例:
clf = GaussianNB()
4.效果验证
我们继续使用三折交叉验证:
print cross_validation.cross_val_score(clf, x, y, n_jobs=-1,cv=3)
测试结果如下,准确率96%左右,相当不错。
[ 0.96226415 0.96153846 0.96153846]