
原文标题:GNNDroid: Graph-Learning Based Malware Detection for Android Apps With Native Code
原文作者:Xi N, Zhang Y, Feng P 等
发表会议:IEEE Transactions on Dependable and Secure Computing
主题类型:恶意代码
笔记作者:金新懿@Web攻击检测与追踪
主编:黄诚@安全学术圈
1、研究概述
为了应对跨语言恶意代码检测中的代码异构性、调用关系复杂和语义信息缺失三大挑战,本文提出了一种基于图神经网络的跨语言恶意软件检测框架——GNNDroid。该系统主要分为三个阶段:

函数调用图(FCG)生成阶段
GNNDroid使用工具Apktool分别从Java代码(.dex文件、Manifest等)和native代码(.so文件)中提取函数及其调用关系,分别构建Java和Native函数调用图(FCGs)。 Java端通过基于Activity的函数调用图生成方式,这里的Activity 指的是 Android 应用中的 Activity 组件,这是 Android 应用的四大核心组件之一(Activity、Service、BroadcastReceiver、ContentProvider),以应用中定义的 Activity 为起点,提取其生命周期函数和内部函数调用,进一步分析这些函数之间的调用关系。Native端使用Radare2分析二进制调用关系,并补充跨文件间的调用链接。每个函数节点包含原型和实现,边则记录调用方向、参数和边类型(边类型一共有四种,表示被调和调用者函数之间是否跨语言,在当前步骤分析出非跨语言的两种调用关系:J2J/N2N)。图融合阶段
GNNDroid进一步融合Java与Native的调用图,构建多关系有向图(MRDG)。为识别跨语言函数调用关系,它使用基于正则表达式的方法提取JNI调用中的函数名和库名(Java调用Native)或Java包类方法信息(Native调用Java),从而建立跨语言边(J2N/N2J)并融合生成完整MRDG图。在Java层面,开发者在调用Native函数时需要先通过JNI声明,通过 JNI 调用的函数通常遵循 native_library_name + Java_class + native_function_name 的命名模式,GNNDroid通过这个命名模式来识别Native function name和native library name
在Native层面,开发者通过 JNIEnv 访问 Java 对象或调用 Java 函数。根据 JNI 标准,通过 JNI 调用的函数遵循 Java_package_class_method 的命名模式,GNNDROID 采用正则表达式匹配来识别 Java 包、Java 类和 Java 方法原型

图学习阶段

GNNDroid将MRDG向量化处理:首先提取节点的函数级特征(Java与Native共20种,Java 特征的选择基于 JVM 官方文档。Native特征的选择则基于微处理器架构和编译器优化配置,见下表),再使用Word2Vec向量化边的语义信息。随后,利用门控图神经网络(GGNN)进行图的学习与分类建模。GGNN通过多轮信息传递与更新,捕捉节点间复杂关系,实现恶意软件的判别。

综上,GNNDroid通过构建和学习Java与Native代码混合行为的多关系图结构,有效融合了语义信息与结构信息,在跨语言场景下实现了鲁棒的恶意软件检测。
2、贡献分析
在分析了现有的Android 恶意软件检测中“缺乏跨语言静态分析能力”的核心问题以后,GNNDroid研究的贡献点如下:
贡献点1:论文针对移动应用中Java与Native代码联动造成的恶意行为检测难题,提出了GNNDroid方法,通过构建跨语言的多关系有向图,实现了对Java与Native代码中恶意行为的联合检测;
贡献点2:论文针对现有方法难以有效建模跨语言恶意行为模式的问题,提出基于图学习的跨语言恶意软件检测方法,采用Gated Graph Neural Network(GGNN)对多关系函数调用图进行建模,实现了跨语言恶意行为的精准识别;
贡献点3:论文针对现有方法特征提取效率低、依赖人工维护的问题,提出一种可扩展且高效的恶意软件检测工具,自动提取提取Java function call graphs (Java FCGs) 和 native function call graphs (native FCGs)组成Multi-Relational Directed Graphs (MRDGs)并在4万移动应用中验证其有效性,F1值达98.57%,显著优于现有工具。
3、代码分析
代码链接:https://anonymous.4open.science/r/GNNDroid-data
论文的代码简要分析:
3.1 代码使用类库分析
静态解析与CFG图生成部分:Java代码的静态分析使用apktool(函数apk_decompile()中使用apktool 将 APK 反编译为 Smali 代码), Androguard(命令行调用开源工具 Androguard 提取控制流图CFG);Native代码的静态解析使用库r2pipe(在r2_gen_single.py中),通过调用 Radare2 实现 .so 的反汇编分析和 CFG 提取,使用pydot解析 .dot 文件(Graphviz 格式)
图构建与机器学习:使用networkx构建函数调用图(DiGraph)、并导出为 .gml,nodes_vectorize.py对每个函数节点的代码内容进行指令统计,生成22维向量,作为节点属性存入图结构。虽然本项目开源代码未直接包含神经网络训练部分,但所有图数据(含节点特征、边类型)均为标准图神经网络(如DGL、PyTorch Geometric等)可直接读取的格式 3. 其他:使用multiprocessing、psutil等多进程与系统资源管理开源库
3.2 代码实现难度及工作量评估
实现难度:代码涉及Java与Native(C/C++)代码的静态分析与图融合,需处理多种文件格式(smali、dot、gml等),并实现跨语言函数关系抽取,难度较高。涉及多进程并发、超时控制、日志管理、异常处理等工程细节,保证了大规模APK批量处理的健壮性。
工作量:核心功能逻辑(如 regex 关联逻辑、图融合控制流、GGNN 构建、数据管道)是作者自实现,而底层大多借助成熟库完成。代码量较大,模块划分清晰,涵盖了反编译、CFG/FCG生成、关系抽取、图融合、特征提取等完整流程。适配了大规模数据集(4万APK),工程化程度高,自动化程度强。
结论:实现难度较大,工作量大,并且也结合了大量的开源工具。
3.3 代码关键实现的功能(模块)
3.3.1 Java与Native代码的静态分析与CFG/FCG生成
(1). Java部分(cfg_java.py):利用apktool反编译APK,提取Smali代码。调用androguard生成Java方法的控制流图(CFG)和函数调用图(FCG),并以.gml格式保存。自动提取包名、类名等信息,支持大规模APK自动化处理。
(2). Native部分(cfg_so.py、r2_gen_single.py):利用r2pipe和Radare2对.so库进行反汇编,提取native函数的CFG/FCG。通过pydot解析dot文件,转换为networkx图结构,统一管理。
3.3.2 跨语言关系抽取与融合:
(1). 关系抽取(relations_abstract.py):自动分析Java调用Native(J2N)和Native回调Java(N2J)的函数关系。生成关系字典(JSON),为后续图融合提供跨语言边的信息。
(2). 多关系有向图融合(graphs_merge.py):将Java和Native的函数调用图,以及J2N/N2J关系融合为一个多关系有向图(MRDG)。支持多种边类型(如Java调用、Native调用、跨语言调用),为图神经网络建模提供结构基础。
3.3.3 节点特征提取与向量化模块
(1). 节点向量化(nodes_vectorize.py):针对每个函数节点,统计其代码中指令类别,生成22维向量作为节点属性。支持Java字节码和Native汇编指令的特征提取,保证跨语言节点特征统一。
3.3.4 数据存储与工程化管理模块
(1). 图数据存储(store_native_and_java_gmls.py):管理和存储生成的Java和Native图数据,便于后续训练和复现。 (2). 批量处理与多进程调度(main.py):支持多进程批量处理大量APK,自动化完成反编译、图生成、特征提取、关系融合等全流程。日志与异常处理完善,保证大规模实验的稳定性。
3、论文点评
论文紧扣当前移动安全领域中Java与Native代码联动导致检测难度提升,尤其是隐藏在跨语言(Native)中的恶意代码难以挖掘的核心问题,填补了主流静态分析工具对Native代码覆盖不足、以及无法有效建模跨语言行为的空白。但是论文也存在一些不足和改进的空间,阅读分析论文的不足有以下几点:
跨语言边的构建精度依赖命名约定:当前跨语言函数关系的识别主要依赖JNI约定俗成的命名模式,使用正则表达式来提取跨语言函数关系,这种方式对命名规范依赖性强,难以处理混淆代码或非标准JNI调用(如使用宏封装、多态回调、动态加载等)。
语义特征提取方式较浅层:节点特征为Java和Native的函数指令统计向量(在前面的汇总表格中可以看到),仅反映函数在操作层面的静态频率,缺乏对高阶语义特征(如数据流、敏感API序列、权限调用路径)的刻画。边的向量采用Word2Vec处理边类型语义,这种方式仅从局部邻接角度捕捉关系,并未结合上下文或跨图信息建模。
神经网络部分细节欠缺:论文未在原始代码库中提供图神经网络模型训练的完整实现,并且网络部分没有给出如下关键信息:传播步数 T、节点嵌入维度大小、图卷积核数量、全连接层结构、损失函数、正则化方法、优化器选型与学习率调度等,不利于论文复现和模型对比。可以补充一些对网络参数相关的实验来证明网络优化方面的说服力。
总体来说,使用正则表达式和指令统计特征向量十分简单高效,可以极大的提升检测效率,但是由于复杂度的不足,准确率有一定的优化空间,在一些追求更高准确的场景可以做出以下优化;
增强跨语言关系识别的鲁棒性:引入动态分析辅助静态匹配(例如基于动态符号执行定位实际JNI调用栈);或使用基于Embedding的跨语言调用匹配模型(如以函数行为为基础学习跨语言对齐向量空间)但是这种解决方案无疑会导致复杂度的上升和效率的下降,需要评估实际场景的效率可行性。
引入语义增强的节点/边特征:可考虑在节点级别加入数据依赖关系、权限调用路径、API序列图等高阶语义特征;在边级别引入调用上下文、跨语言调用场景标签(例如UI触发、系统调用层面),数据依赖分析同样会增加计算开销,也需要评估实际场景的效率可行性。
增加对网络参数的调优实验,或引入更适配多关系图的神经网络结构,例如:Relational-GCN (R-GCN)——支持每类边单独变换矩阵,提升边语义建模精度,GAT / RGAT——使用注意力机制进行边重要性学习,强化关键函数、关键调用路径对分类的影响力。
4、论文文献
(1). Xi N, Zhang Y, Feng P, 等. GNNDroid: Graph-Learning Based Malware Detection for Android Apps With Native Code[J]. IEEE Transactions on Dependable and Secure Computing, 2025, 22(2): 1460-1476.
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com
声明:本文来自安全学术圈,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。