Page 281 - 《软件学报》2026年第4期
P. 281
1722 软件学报 2026 年第 37 卷第 4 期
为了全面捕获和充分挖掘安卓恶意软件中与恶意行为相关的语义特征信息, 本文主要通过提取待测安卓软件
z 中灰度图、API 调用序列和控制流图这 3 种模态的特征信息, 为后面的安卓恶意软件鲁棒检测提供多模态特征
信息的支持. 下面将分别介绍针对灰度图模态、API 调用序列模态和控制流图模态的特征提取方法.
2.2.1 针对灰度图模态的特征提取
对于安卓应用程序而言, Java 源代码被编译为 Java 字节码后转换为 Dalvik 字节码, 以便在安卓操作系统上运
行, 因此 Dalvik 字节码是应用程序功能最直接的表示形式. 通过将二进制 Dalvik 字节码转换成相应的图像形式,
不仅能够直观且可视化地展示二进制字节码序列, 而且能够充分体现二进制代码的整体布局和结构信息. 事实上,
当前已经有大量恶意软件检测相关研究直接将恶意软件表示成灰度图的形式并取得相当不错的恶意软件检测效
果 [57,60,61] . 恶意软件检测中灰度图特征有效的原因之一, 是由于恶意软件的开发人员通常会以某个原始恶意软件
代码作为基础来生成新的恶意软件, 这往往使得新生成的恶意软件中大部分二进制代码保持不变, 因此防御方可
以利用这种特点来识别恶意软件 [60] . 下面将逐步介绍本文所提出的 RMDroid 如何提取待测安卓软件 z 的灰度图
img
特征 x z , 具体步骤如下.
(1) 直接以二进制形式读取待测安卓软件 z, 并将连续的 8 位二进制数据转换成 0–255 之间的数字, 即形成一
个包含十进制数字的数组.
(2) 根据基于灰度图的恶意软件检测方法的相关经验 [57,61] 和待测安卓软件 z 的实际大小, 确定相应的灰度图的
宽度.
(3) 基于灰度图的宽度, 将待测安卓软件的十进制数组重新组织成二维灰度图形式, 即得到最终的灰度图模态
img
特征 x z .
2.2.2 针对 API 调用序列模态的特征提取
一般而言, 安卓恶意软件需要通过调用大量的安卓 API 接口函数来执行一些安全敏感操作或者恶意行为. 因
此可以利用待测安卓软件中的 API 调用信息来检测安卓恶意软件. 事实上, 这种基于 API 调用信息的恶意软件检
测方法已经被大量研究人员广泛地应用于安卓恶意软件检测任务之中 [18,19] , 不仅取得了不错的检测效果, 而且具
备更好的可解释性, 例如, 某些家族的安卓恶意软件中会更容易存在某几种相对固定的 API 调用模式. 进一步地,
api
RMDroid 提取待测安卓软件 z 中的 API 调用序列特征 x z , 具体步骤如下.
(1) 利用逆向分析工具 Androguard 提取待测安卓软件 z 的函数调用序列, 并获得每个函数的调用信息, 包括函
数名、参数类别、返回值等.
(2) 根据安卓系统函数列表识别函数调用序列中的每个函数是安卓系统函数还是应用开发人员自定义的本地
函数. 由于逆向分析过程中系统函数名称通常保持不变, 而本地函数名称大部分会因为编译混淆而丢失, 因此本文
只保留 API 调用序列中的安卓系统 API 接口函数.
(3) 为了向量化 API 调用序列特征, 直接将每个 API 调用函数名称的独热编码作为该 API 调用函数的初始特
api
征向量, 从而得到待测安卓软件 z 的 API 调用序列特征 x z .
2.2.3 针对控制流图模态的特征提取
作为静态代码分析中非常重要的数据结构和分析工具, 控制流图常用来表示软件代码的逻辑结构和语义信
息, 其具体定义如下所示.
定义 1. 控制流图. 任意一个软件代码的控制流图 G = (V,E) 是一个由节点集 V 和边集 E ⊆ V×V 共同构成的有
v ∈ V 代表一个基本块, 即除了最后一条指令外不包含任何跳转指令的一组指令序列; 而每条
向图. 其中, 每个节点
有向边 (v 1 ,v 2 ) ∈ E 代表两个基本块之间的控制流路径, 即从 v 1 所代表的基本块跳转到 v 2 所代表的基本块.
由于控制流图的表征方法不仅与软件的程序语言和运行硬件环境无关, 而且可以准确地表达程序的内在执行
逻辑, 因此近年来研究人员也提出大量的基于控制流图的恶意软件检测方法 [58,59] . 具体而言, 首先, 利用逆向分析
工具 Androguard 生成待测安卓软件 z 对应的控制流图, 图中每个节点是一个包含若干条指令的基本块. 由于上述
控制流图信息无法输入到后面的深度学习模型中, 进一步对控制流图中每个节点 (即每个基本块) 进行向量化, 即

