欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用马尔科夫链进行Android恶意软件检测

来源:本站整理 作者:佚名 时间:2018-12-11 TAG: 我要投稿

如果你和某人聊天,如果他们给你说了一堆“aslkjeklvm,e,zk3l1”你完全听不懂的词语,显然他们是在胡言乱语。但是,在计算机中,你该如何教电脑识别类似的乱码呢?然而更重要的是,我们为什么要为这个问题烦恼?我见过很多安卓恶意软件,其中有很多包含我们不认识的乱码字符串,无论是代码中的文字,还是签名中的类名,等等。我的想法是,如果你可以对乱码进行“量化”,那这些乱码将会是机器学习模型中的一个很好的特征。我已经测试了我的想法,所以在这篇文章中,我将分享我的成果。
什么是马尔可夫链?
你可以阅读维基百科上的解释,但不是每个人都有时间阅读完这种篇幅很长的解释。简单的说,你用了很多字符串来训练一个马尔科夫链模型。一旦训练好,你可以给模型输入一个字符串,模型就会告诉你它训练的字符串是什么意思。这个过程称为获取字符串的概率。
马尔可夫链非常简单。我使用的代码可以在这里找到:https://gist.github.com/CalebFenton/a129333dabc1cc346b0874407f92b568
它是基于Rob Neuhaus的Gibberish Detector编写的。
实验测试
我一直在努力改进我在安卓恶意软件检测器——Judge中使用的模型。创建一些基于马尔科夫的特征很容易,然后将这些特征放入模型中进行不断的训练。但我想要一种更加科学的方法。每个人都会认为科学的世界是五彩斑斓的,但想象往往是美好的,真正的大部分科学研究的幕后花絮,其实是非常乏味而艰辛的。为了做出有关于哪些特征最有效以及这些特征是否有用的数据驱动决策,我对实验进行了大量的记录并保留了所有的数据。希望这些数据能对其他人有所帮助。
我一般是从收集数据集中的所有字符串作为实验的开始。我所选择的数据集包含了约185,000个样本,其中约一半是恶意的样本。恶意应用程序来自各种地方,但大部分来自于VirusTotal,其中有20多个白样本应用程序。白样本应用程序可能更加多样化,并包含多种语言的字符串。
收集完字符串后,我在从白样本应用程序中提取的字符串上训练了马尔可夫模型。对于每次出现的字符串,我都会用这些字符串进行模型训练。训练完成后,模型就会识别出可能的合法字符串或者非恶意字符串。然后,我计算了每个白样本中的字符串的概率,并在曲线上绘制了分布情况。
最后,我使用在白样本中的字符串训练的马尔可夫模型来计算所有恶意字符串的概率并绘制了结果。在我花时间为提取特征而编写任何代码之前,我想知道概率分布是否存在显着差异。如果没有差异,我可能会继续编写代码,因为我就是这样度过我的周末的,但事实证明,这里有一个显著的差异,让我觉得更加自信,因为这说明我提取的特征非常有用。
我的马尔可夫链模型使用了双字母组合,字符串会根据其类别进行标记。以下是模型使用的模式:
@Nullable
private static String getTokenSplitPattern(String stringType) {
    switch (stringType) {
        case "activityNames":
        case "receiverNames":
        case "serviceNames":
            return null;
        case "appLabels":
        case "appNames":
        case "stringLiterals":
            return "(?:[\\s+\\p{Punct}]+)";
        case "classNames":
        case "fieldNames":
        case "methodNames":
            return null;
        case "packageNames":
            return "(?:\\.)";
        case "packagePaths":
            return "(?:/)";
        case "issuerCommonNames":
        case "issuerCountryNames":
        case "issuerLocalities":
        case "issuerOrganizationalUnits":
        case "issuerOrganizations":
        case "issuerStateNames":
        case "subjectCommonNames":
        case "subjectCountryNames":
        case "subjectLocalities":
        case "subjectOrganizationalUnits":
        case "subjectOrganizations":
        case "subjectStateNames":
            return "(?:\\s+)";
        default:
            return null;
    }

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载