Android 系统可以通过 JNI 接口调用 C/C++ 库函数,使 Android 程序运行更加高效,但是同时也会加大 Android 恶意应用检测的难度,大多数恶意分析技术通常在 Java 层对 Android 应用程序进行分析,Native Code 在 Android 恶意应用检测中的作用并没有被深入研究。
通过对 Android应用程序在 Java 层与 Native 层的行为进行监测,使用机器学习技术,设计了一套Android 恶意应用检测系统,该系统能够提取 Android 应用程序在运行过程中,Native 层和 Java 层调用产生的 API 序列,以及 Android 应用中申请的 Permission序列,通过 RNN 技术,实现对应用程序恶意性的识别。
本项目主要由三个模块组成:特征提取模块、向量化模块、分类器模块。
-
特征提取模块:特征提取模块的主要功能是将 APK 中的特征提取出来,主要包括两个方式,一个是通过静态方式提取 APK 文件中的 Permission 信息,一个是通过动态方式,也就是在设备上运行,通过 Hook 技术获取运行过程中的系统调用,包括 Native 层和 Java 层的 API。
-
向量化模块:向量化模块的主要功能是将特征提取模块所提取的特征转化成向量的形式,特征提取模块所得到的 API 序列和 Permission 信息都是字符串组成的序列,所以需要通过 Word2Vec 技术将这些字符串结构转化为向量这些,作为分类器模块的输入。
-
分类器模块:分类器模块的主要功能就是通过机器学习技术,主要是 RNN 技术,对向量化的特征进行分析,实现对 APK 文件的恶意性检测。
系统的整体流程如下图所示。
整个工具有三个模块构成,将分三部分介绍模块配置。
系统的配置环境如下
| 环境 | 版本 |
|---|---|
| Python | 3.10 |
| pytorch | 2.1.1 |
| CUDA | 11.8 |
| mysql | 8.0.39-0 |
运行一下命令安装python依赖包
pip install -r requirements.txt 特征提取模块位于Feature-Extraction文件夹中。
主要有两个模块构成:AndroidAnalyse和PermissionAnalyse。
这是通过动态分析对提取调用API的程序,配置较为复杂。
首先需要提前对测试手机进行root,并且安装好frida框架和atx模块
https://blog.csdn.net/weixin_73636162/article/details/134043402 https://crifan.github.io/reverse_debug_frida/website/install_upgrade/install_frida.html https://github.com/NetEaseGame/AutomatorX
本项目需要mysql,创建一个创建一个数据库(名字无所谓,只需要在后面的config中设置即可),并且创建一个名为APKMetadata的表,创建的sql语言如下图所示。
create table APKMetadata
(
APKID bigint auto_increment
primary key,
APPName varchar(1024) not null,
APKName varchar(1024) not null,
APKFilePath varchar(1024) not null,
APKStoreName varchar(1024) not null,
createTime datetime default CURRENT_TIMESTAMP not null,
lastModifi/home/lyu-xuan/Path/APKS/ccplay.apkedTime datetime default (now()) not null,
needAnalyse int default 1 not null,
packageName varchar(1024) null
)
engine = InnoDB;然后配置config,在AndroidAnalyse中有一个config.conf文件,对其中的设置根据实际情况进行修改。通过修改本文件对AndroidAnalyse模块进行设置。
[database]
host = localhost
port = 3306
user = <你的用户名>
password = <你的密码>
database = <你的数据库>
[device]
deviceID = <你的设备ID>
[filePath]
pcapFilePathPrefix = <已废弃>
stackFilePathPrefix = <已废弃>
APKFilePath = <APK存储路径(到文件夹)>
PythonPath = <Python路径(到python3)> 例:/home/xxx/Environment/Python/Python310/bin/python3
之后运行APKloader文件,将文件夹下的apk写入到数据库中。
至此环境配置完成。
运行一下命令:
adb shell #进行adb连接
su # 切换root用户
cd /data/local/tmp #进入到frida和atx
./atx-agent -d # 后台运行atx
./frida # 后台运行frida启动手机端的服务之后,直接运行main文件,即可进行自动点击操作,对java层和native层api调用序列进行提取。
python main.pyPermissionAnalyse配置方法较为简单:
Train_Benign_APKs = "这是训练集良性软件文件夹路径"
Test_Benign_APKs = "这是测试集良性软件文件夹路径"
Train_Malware_APKs = "这是训练集恶意软件文件夹路径"
Test_Malware_APKs = "这是测试集恶意软件文件夹路径"
Train_Benign_Permissions = "这是训练集良性权限文件夹路径"
Test_Benign_Permissions = "这是测试集良性权限文件夹路径"
Train_Malware_Permissions = "这是训练集恶意权限文件夹路径"
Test_Malware_Permissions = "这是测试集恶意权限文件夹路径"配置好路径之后直接运行该python文件即可
python getPermission这个模块的内容较少,更详细的代码介绍可以看注释
- 通过plot_distribution.py,可以生成文本的分布图,也就是通常情况下每个文件大概有多长,通过这个分布确定word2Vec模型的参数
- 运行dataloader.py,将所有的文本整合到一个文件中,并且将过短的文件进行填充<PAD>字符
- 运行word2vec.py可以生成训练好的word2Vec模型
主要包括RNN与voting两个组成
RNN部分需要修改的地方有
- RNN_Function:17-19行,需要根据情况选择在哪个层次进行训练(java、native还是permission),调整好参数;20行,需要选择对应的word2Vec模型;50-53行,选择对应的数据集合;
- RNN_Main:20行,根据不同层次选择对应的输入。
- RNN_Train:69行,设置保存的模型的名字。
将数据配置好之后,运行RNN_Main.py,进行模型的训练
voting中需要再ProcessData.py和voting.py中配置相应的文件路径,这些在文件中都非常明显了,所以在此不赘述。
配置好后运行voting文件,可以得到准确率。
因为本项目是基于tracedroid,但是很多tracedroid中的功能没有用到,如果深入进行配置的话可以加入tracedroid抓获的网络信息,下面介绍tracedroid的其他信息。
tracedroid因为要对网络进行分析,所以设置了其他的数据表,这些数据表的插入方式如下:
create table CaptureLog
(
logID varchar(40) not null
primary key,
APKID varchar(1024) not null,
APKName varchar(1024) not null,
APPName varchar(1024) not null,
createTime datetime default CURRENT_TIMESTAMP not null,
pcapFilePath varchar(1024) not null,
stackFilePath varchar(1024) not null,
needExtract int not null,
extractTime datetime default (now()) not null
)
engine = InnoDB;create table HTTP
(
id bigint unsigned auto_increment
primary key,
packageName varchar(1024) null,
srcAddr varchar(1024) null,
srcPort int null,
dstAddr varchar(1024) null,
dstPort int null,
host varchar(1024) null,
URL varchar(1024) null,
requestTime timestamp null,
requestHeaders varchar(1024) null,
requestBody longtext null,
responseHeaders varchar(1024) null,
responseBody longtext null,
protocol varchar(1024) null,
method varchar(1024) null,
contentType varchar(1024) null
)
engine = InnoDB;create table PreProcessLog
(
APKID bigint auto_increment
primary key,
APKName varchar(1024) null,
APPName varchar(1024) null
)
engine = InnoDB;
create table Stack
(
packageName varchar(1024) null,
requestTime varchar(1024) null,
SSL_Session varchar(1024) null,
function varchar(1024) null,
srcAddr varchar(1024) null,
srcPort varchar(1024) null,
dstAddr varchar(1024) null,
dstPort varchar(1024) null,
stack longtext null
)
engine = InnoDB;关于tracedroid的一个大坑,需要安装pcapkit的0.15版本才可以运行,进行信息的提取。
本介绍已经较为详细,如有问题请联系ryttermohn@gmail.com

