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

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


                    (1) API 特征提取: 从  API 文档中提取   API 特征, 包括类名、方法名、异常、权限等特征.
                    (2) API 句子生成: 对  API 的特征信息进行概括, 根据设计的规则生成每个              API 对应的   API 句子.
                    (3) API 句子编码: 使用  BERT [26] 对  API 句子进行编码, 获得反映   API 语义相似性的嵌入向量.
                    (4) 聚类中心生成: 使用     k-means [27] 算法对  API 嵌入向量进行聚类, 生成代表    API 功能的聚类中心.
                    在恶意软件检测时, API 聚类中心用于替换特征向量中的                 API.
                    恶意软件检测部分包括         6  个过程.
                    (1) 调用图提取: 使用静态分析工具从待检测软件中提取函数调用图.
                    (2) 调用图优化: 对函数调用图进行优化, 删除图中无法识别的未知函数节点并保留                         API 节点之间的连接性,
                 生成优化后的函数调用图.
                    (3) 调用对提取: 从优化后的调用图中提取函数调用对.
                    (4) 调用对抽象: 将调用对中的       API 抽象为   API 聚类部分获得的     API 聚类中心, 将其他函数抽象为包, 生成聚
                 类中心调用对.
                    (5) 特征嵌入: 使用独热编码对聚类中心调用对进行特征嵌入; 使用主成分分析将高维特征向量映射到低维空
                 间, 生成待检测软件的特征向量.
                    (6) 分类器检测: 使用机器学习分类器进行恶意软件检测, 检测样本属于良性软件还是恶意软件.

                 3   基于语义距离的       API 聚类

                    基于  API 聚类的检测方法能适应软件中           API 的频繁变化, 但现有聚类方法在提取           API 语义信息时忽略方法
                 名和权限等关键特征, 导致难以全面提取             API 语义信息. API 的方法名蕴含丰富语义信息, 概括            API 的作用. 例如
                 方法名为   getDeviceID  或  setWifiEnabled  的  API, 其方法名充分反应  API 的功能. API 的权限在安卓操作系统中极
                 为重要  [16] . 使用自然语言处理工具对方法名和权限等关键特征中蕴含的语义信息进行充分挖掘, 能更全面的提取
                 API 语义信息, 使聚类结果更为准确.
                    本文提出的基于语义距离的           API 聚类方法包括    4  个过程: 特征提取、API 句子生成、API 句子编码和聚中心
                 生成.

                 3.1   API 特征提取
                    特征提取是从安卓官方文档中提取             API 的特征, 包括包、类名、方法名、参数、权限、异常和返回值                   7  种特
                 征. 在本文研究中, 使用     APIGraph [7,28] 提供的安卓官方文档和特征提取方法.
                    表  1  展示  API android.telephony.TelephonyManager.getDeviceId  的特征提取结果. 为减少一些频繁出现的特征
                 对  API 语义信息嵌入造成影响, 在特征提取过程中忽略              int、boolean、String、float 等特征, 表  1  展示的  API 使用
                 int 类型变量作为参数, 返回值为       String  类型, 这两类特征在提取时被忽略.

                                                   表 1 API 特征提取示例

                                     特征                               提取结果
                                     权限                    android.permission.READ_PHONE_STATE
                                     参数                                  无
                                     异常                                  无
                                    返回值                                  无
                                      包                             android.telephony
                                     类名                            Telephony $ Manager
                                    方法名                             get $ Device $ ID

                    本文在   APIGraph  特征提取方法的基础上, 对类名和方法名两类特征进行修饰: 利用方法名和类名的驼峰命名
                 格式  (除首个单词外, 其余单词的首字母均为大写, 例如              setWifiEnabled、sendTextMessage 等) 将其拆分为单词的
   287   288   289   290   291   292   293   294   295   296   297