15

我为网络主机工作,我的工作是查找和清理被黑的帐户。我找到 90% 的 shell\malware\injections 的方法是查找“不合适”的文件。例如eval(base64_decode(.......)),其中“ .....”是一大堆通常永远不会好的 base64 化文本。当我在文件中查找关键字符串时,奇怪的文件突然出现在我面前。

如果这些文件作为人类突然出现在我身上,我确信我可以在 python 中构建某种分析器来查找统计上“不合适”的东西并将它们标记为手动审查。首先,我认为我可以比较包含关键字符串(、、、、、、、、等)的 php 文件中的行长度,并eval查找base64_decode偏离平均值2exec个标准差的行。gunzipgzinflatefwritepreg_replace

行长变化很大,我不确定这是否是一个很好的统计数据。另一种方法是将加权规则分配给 cretin 事物(超过或低于阈值的行长度 = X 点,包含单词上传 = Y 点)但我不确定我实际上可以用分数做什么或如何对每个分数进行评分属性。我的统计数据有点生疏。

谁能指出我正确的方向(指南、教程、库)进行统计分析?

4

1 回答 1

5

这是一个简单的机器学习方法来解决这个问题,这也是我开始解决这个问题并开发基线分类器的方法:

建立一个脚本语料库并附加一个“好”(标签= 0)或“坏”(标签= 1)的标签,越多越好。尽量确保“坏”脚本占总语料库的合理比例,50-50 好/坏是理想的。

开发指示可疑或错误脚本的二进制功能。例如,'eval' 的存在,'base64_decode' 的存在。尽可能全面,不要害怕包含可能捕获一些“好”脚本的功能。帮助做到这一点的一种方法可能是计算两类脚本中单词的频率计数,并选择在“坏”中突出显示但在“好”中不太突出的单词作为特征。

在语料库上运行特征生成器并构建带有标签的特征的二进制矩阵。

将语料库分成训练集(80% 的示例)和测试集(20%)。使用 scikit learn 库,用训练集训练一些不同的分类算法(随机森林、支持向量机、朴素贝叶斯等),并在看不见的测试集上测试它们的性能。

希望我有一个合理的分类准确度可以作为基准。然后我会考虑改进功能、一些无监督的方法(没有标签)和更专业的算法以获得更好的性能。

对于资源,Andrew Ng 的 Coursera 机器学习课程(我相信其中包括示例垃圾邮件分类)是一个好的开始。

于 2013-07-05T15:00:28.990 回答