7.5 示例:检测WebShell(二)

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]