Page 294 - 《软件学报》2025年第7期
P. 294

杨宏宇 等: 基于   API 聚类和调用图优化的安卓恶意软件检测                                               3215


                 分别考虑差异特征数量为         0  和差异特征数量至少为       1  这两种情况.

                 算法  2. 单个差异特征对应的部分        API 句子生成算法.
                 输入: Features: 某类差异特征, S 0 : 特征数量为  0  时句首部分, S 1 : 特征数量至少为    1  时句首部分;
                 输出: S part : 单个差异特征生成的部分    API 句子.

                 1. if Features is none then:
                 2.   S part  = S 0
                 3. else

                 4.   S part  = S 1
                 5.   for each feature f in Features do:
                 6.     S part  = S part  + ‘ ’ + f
                 7.   end for
                 8. end if
                 9. return S part
                    将表  1  中展示的  API 和其特征输入算法       1, 得到最终生成的    API 句子如下:
                    method get device id from class telephony manager from package android telephony use android permission read
                 phone state throw none exception use none parameter return none

                 3.3   API 句子编码
                    生成  API 句子后, 使用在    BooksCorpus 和  Wikipedia 等语料库上预训练好的    BERT  模型对不同长度的      API 句
                 子进行编码, 取编码结果中第        0 个词向量   CLS 对应的  768 维特征向量作为     API 的语义嵌入. BERT  由双向   Transformer
                 子结构堆叠而成, 是一个经典的预处理模型             [26] . CLS  是  classification  的缩写, 对应的特征向量概括整句句子的语义
                 信息, 常被用于文本情感分类等下游任务.
                    通过生成    API 句子并使用    BERT  对  API 句子进行编码, 特征数量不一致的         API 被全部映射到固定大小的嵌
                 入向量. 本文在提取      API 语义信息时既考虑      API 名称和权限中蕴含的丰富语义信息, 也考虑参数、异常、返回值
                 等不可或缺的重要特征.
                    在设计   API 句子的生成规则时, 意思相同但表达方式不同的规则会对分类器的衰减速度造成影响. 例如将规
                 则  use none permission  改成  do not use permission  或  use no permission  会削弱分类器检测进化后恶意软件的能力.
                 与     not 或  no  相比, BERT  能从包含单词  none 的  API 句子中提取更多信息.
                 3.4   聚类中心生成

                    BERT  对  API 句子进行编码后, 生成     768  维的特征向量, 该特征向量维度过大, 对聚类过程中的距离计算造成
                 较大压力. 因此, 首先使用主成分分析           [29] 进行降维, 取方差比为    95%, 得到降为后    66  维度的特征向量; 然后使用
                 Elbow  方法  [27] 确定聚类中心个数, 根据   Elbow  方法, 取  2 000  为聚类中心个数; 最后使用    k-means 算法进行聚类.
                 完成聚类后, 功能相似的       API 被分配到相同聚类中心.
                    当安卓官方对      API 文档进行更新时, 例如添加新        API 或修改已有    API, 需要同步更新    API 的聚类结果. API 聚
                 类中心的更新过程如图        2  所示.

                                  新 API    API 特征提取      API 句子编码

                                           API 句子生成      聚类中心更新

                                                   图 2 API 聚类中心更新
   289   290   291   292   293   294   295   296   297   298   299