19121A05A4/Android-Malware-Detection
GitHub: 19121A05A4/Android-Malware-Detection
一个基于机器学习与静态权限分析的Android恶意软件Web检测系统,解决传统签名防病毒难以应对新型变种的问题。
Stars: 0 | Forks: 0
# CyberGuard - Android恶意软件检测系统
一个用于检测Android恶意软件的机器学习Web应用程序,使用静态权限分析和APK二进制扫描。构建在TUANDROMD数据集上,包含四种机器学习分类器。最佳模型(随机森林)达到98.92%的准确率。
在线演示:[android-malware-detection-xahi.onrender.com](https://android-malware-detection-xahi.onrender.com)
## 简介
Android占据了全球移动操作系统市场的70%以上,使其成为恶意软件的主要目标。基于签名的防病毒工具难以应对新的或经过混淆的恶意软件变种。基于机器学习的检测通过从应用程序行为中学习模式,而不是依赖已知签名,使其更具适应性。
本项目专注于Android权限分析。每个Android应用程序在安装时都会在AndroidManifest.xml中声明其所需权限。恶意应用程序通常会请求远超其声称用途的权限组合,这种过度特权的权限行为是检测的基础。
系统具有两种检测模式:
- 手动检测:手动选择Android权限并使用四种训练好的机器学习模型之一进行分类
- APK扫描器:上传APK文件进行自动化分析,包括权限提取、API扫描、签名检测和风险评分
## 数据集
TUANDROMD(Tezpur大学Android恶意软件数据集)- Borah & Bhattacharyya, 2020
| 属性 | 值 |
|----------|-------|
| 样本总数 | 4,464(清洗后) |
| 恶意软件 | 3,565 |
| 良性软件 | 899 |
| 总特征数 | 242 |
| 使用的特征 | 23(统计选择的权限) |
数据集存储在`model/`文件夹下。
数据集的类别不平衡比例约为4:1(恶意软件对良性软件)。SMOTE仅在训练集上应用,在训练/测试分割之后进行,以在训练前平衡类别。在分割前应用SMOTE会导致测试集信息泄露。
## 特征选择
使用互信息与点二列相关系数的组合得分,从241个可用特征中选择了23个权限特征。API调用签名被排除,仅保留Android权限名称。
```
RECEIVE_BOOT_COMPLETED SEND_SMS RECEIVE_SMS
READ_SMS SYSTEM_ALERT_WINDOW GET_TASKS
KILL_BACKGROUND_PROCESSES MODIFY_AUDIO_SETTINGS READ_PHONE_STATE
ACCESS_FINE_LOCATION WRITE_EXTERNAL_STORAGE BLUETOOTH_ADMIN
WAKE_LOCK DISABLE_KEYGUARD USE_FINGERPRINT
CHANGE_NETWORK_STATE BLUETOOTH CHANGE_WIFI_STATE
ACCESS_COARSE_LOCATION VIBRATE ACCESS_NETWORK_STATE
READ_OWNER_DATA DOWNLOAD_WITHOUT_NOTITIFICATION
```
## 训练流程
```
1. Load TUANDROMD (4,464 samples, 242 features)
2. Feature selection - 23 permission features via MI + Point-Biserial
3. 75/25 stratified train/test split (random_state=42)
4. SMOTE on training set only - balanced to 50/50
5. Train 4 ML models
6. Evaluate on original unbalanced test set
7. 5-fold stratified cross-validation
8. Save models as .pkl files + risk_weights.json
```
选择75/25的训练/测试分割,而不是80/20,是因为数据集较小(4,464个样本),额外的测试样本可以提高评估可靠性,特别是对于少数类。SMOTE通过生成合成样本来弥补较小的训练集。
## 模型结果
| 模型 | 测试准确率 | 宏F1 | ROC-AUC | 交叉验证均值 | 交叉验证标准差 |
|-------|-------------|---------|---------|---------|--------|
| 逻辑回归 | 97.58% | 0.9624 | 0.9840 | 97.40% | +/-0.78% |
| XGBoost(调优) | 98.57% | 0.9776 | 0.9987 | 98.36% | +/-0.30% |
| 随机森林 | 98.92% | 0.9833 | 0.9989 | 98.66% | +/-0.26% |
| 朴素贝叶斯 | 95.70% | 0.9365 | 0.9868 | 96.06% | +/-0.58% |
随机森林被选为主要模型。它具有最高的准确率、最佳的宏F1分数以及最低的交叉验证标准差,表明其在各折中表现一致。
XGBoost使用GridSearchCV进行调优:
```
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 6, 9],
'learning_rate': [0.01, 0.1, 0.3],
'subsample': [0.8, 1.0],
}
```
## 每类指标(随机森林)
| 类别 | 精确率 | 召回率 | F1 | 支持数 |
|-------|-----------|--------|-----|---------|
| 良性 | 0.97 | 0.97 | 0.97 | 225 |
| 恶意软件 | 0.99 | 0.99 | 0.99 | 891 |
| 宏平均 | 0.98 | 0.98 | 0.98 | 1116 |
## 混淆矩阵
| 模型 | TN | FP | FN | TP |
|-------|----|----|----|----|
| 逻辑回归 | 211 | 14 | 13 | 878 |
| XGBoost | 215 | 10 | 6 | 885 |
| 随机森林 | 219 | 6 | 6 | 885 |
| 朴素贝叶斯 | 217 | 8 | 40 | 851 |
朴素贝叶斯具有最高的假阴性计数(40),意味着它漏掉了最多的实际恶意软件。随机森林在两侧错误数最少(6个FP,6个FN),使其成为最平衡的选项。
## 为什么选择这四种模型
**逻辑回归** - 线性基线。易于解释,并提供校准的概率估计。由于逻辑回归对特征幅度敏感,训练前应用StandardScaler。
**XGBoost** - 梯度提升,每个树纠正前一个树的错误。使用GridSearchCV进行超参数调优。在安全机器学习研究中广泛使用。
**随机森林** - 由100个决策树组成的集成,每个树在数据的随机子集上训练。对噪声具有鲁棒性。最终预测基于所有树的多数投票。
**朴素贝叶斯(BernoulliNB)** - 针对二进制特征(权限存在与否)设计。假设特征之间相互独立,这在实践中并不总是成立,因为权限经常共同出现。这解释了其准确率低于基于树的模型的原因。
## APK静态分析引擎
APK扫描器在不运行应用程序的情况下分析应用。APK文件是ZIP归档文件,因此扫描器直接读取其内容。
**步骤1 - Androguard解析**
使用Androguard解析二进制AndroidManifest.xml并提取包名和声明的权限。
**步骤2 - 基于规则的评分**
根据TUANDROMD训练数据中恶意软件与良性软件的频率比率计算权限风险评分,并存储在`risk_weights.json`中。
**步骤3 - ML分类**
提取的权限与23个训练特征进行匹配,并传递给随机森林模型,输出恶意软件置信度百分比。
**步骤4 - 最终判决**
```
ML confidence > 50% -> MALWARE
Rule score >= 80, ML Benign -> MALWARE (rule override)
Rule score 35-79, ML Benign -> SUSPICIOUS
Rule score < 35, ML Benign -> SAFE
```
## 测试APK
为演示目的本地保留四个APK文件:
| 文件 | 判决 | 风险评分 | ML置信度 | 备注 |
|------|---------|------------|--------------|-------|
| GPA_calculator.apk | 安全 | 15/100 | 7.7% | 干净应用,无危险权限 |
| test_suspicious2.apk | 可疑 | 36/100 | 27% | 隐私侵犯权限 |
| test_malware.apk | 恶意 | 100/100 | 73% | SMS木马权限模式 |
| test_malware2.apk | 恶意 | 100/100 | 83% | 间谍软件/RAT权限模式 |
## 项目结构
```
CyberGuard/
|
|-- app.py # Flask backend and APK scanner
|-- train_models.py # ML training script
|-- verify_metrics.py # Metric verification script
|-- risk_weights.json # Permission risk scores from training data
|-- features_selected.txt # 23 selected permission features
|-- scaler.pkl # StandardScaler for Logistic Regression
|-- requirements.txt # Python dependencies
|-- Accuracy.txt # Model accuracy summary
|
|-- model/
| └── TUANDROMD.csv # Dataset
|
|-- static/
| |-- download.png # LR confusion matrix
| |-- download1.png # XGBoost confusion matrix
| |-- download2.png # RF confusion matrix
| └── download3.png # Naive Bayes confusion matrix
|
|-- templates/
| |-- index.html # Landing page
| |-- login.html # Login page
| |-- first.html # Detection mode selection
| |-- prediction.html # Manual permission input
| |-- result.html # Classification result
| |-- apk_scanner.html # APK upload and scan
| |-- performance.html # Model metrics dashboard
| └── chart.html # Charts
|
└── uploads/ # Temporary APK storage (deleted after scan)
```
## 安装
要求:Python 3.10+
```
git clone https://github.com/19121A05A4/Android-Malware-Detection.git
cd Android-Malware-Detection
pip install -r requirements.txt
python train_models.py
python app.py
```
打开 http://localhost:5000
默认登录:admin / admin
## 依赖项
```
flask==2.3.2
pandas==2.2.2
numpy==1.26.4
scikit-learn==1.5.0
imbalanced-learn==0.12.3
matplotlib==3.8.4
seaborn==0.13.2
werkzeug==2.3.7
openpyxl==3.1.2
xgboost==2.0.3
androguard
```
## 后续工作
- 在更新的数据集上重新训练以提高现代APK的ML性能
- 添加SHAP值以解释哪些权限驱动了每个预测
- 扩展权限之外的特性,包括API调用和意图过滤器
- 用适当的身份验证替换硬编码登录
- 跟踪模型性能随时间的变化以测量概念漂移
## 参考文献
- Borah, P. & Bhattacharyya, D. (2020). TUANDROMD (Tezpur University Android Malware Dataset). Available at: https://www.kaggle.com/datasets/joebeachcapital/tuandromd
- Arp, D., et al. (2014). DREBIN: Effective and Explainable Detection of Android Malware in Your Pocket. NDSS.- Felt, A. P., et al. (2011). Android Permissions Demystified. ACM CCS.
- Pedregosa et al. (2011). Scikit-learn: Machine Learning in Python. JMLR, 12, 2825-2830.
- Yerima, S. Y., et al. (2014). Analysis of Bayesian Classification-Based Approaches for Android Malware Detection. IET Information Security, 8(1), 25-36.
- Chen, T. and Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. KDD.
## 作者
Sai Katari
GitHub: https://github.com/19121A05A4
## 许可证
MIT License
标签:AMSI绕过, AndroidManifest.xml, Android安全, Android恶意软件检测, Apex, APK静态分析, Flask Web应用, SMOTE过采样, XGBoost, 后端开发, 威胁检测, 数据集TUANDROMD, 朴素贝叶斯, 机器学习, 权限分析, 权限声明, 模型部署, 特征选择, 移动端安全, 网络应用, 逆向工具, 逻辑回归, 随机森林, 静态检测, 风险评分