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 聚类中心更新

