akhilkumarv009-eng/Android-Malware-Dynamic-Analysis
GitHub: akhilkumarv009-eng/Android-Malware-Dynamic-Analysis
该框架通过在 Android 模拟器中注入 Frida Hook 捕获 APK 运行时行为,并对结构化轨迹进行质量过滤与机器学习训练,实现恶意软件的自动化动态检测。
Stars: 0 | Forks: 0
# Android 动态恶意软件分析框架
### Frida · Android Emulator · 行为 ML 分类
## 目录
1. 项目概述
2. 系统要求
3. 环境配置
4. 模拟器配置
5. Frida Server 设置
6. 项目结构
7. 运行动态分析流水线
8. 运行 ML Notebook
9. 数据集信息
10. 已知问题与修复
11. 下一步工作
## 1. 项目概述
该框架在模拟器内执行 Android APK,将 Frida JavaScript hooks 注入到运行中的进程,并捕获行为事件(网络调用、文件访问、加密使用、运行时执行、DEX 加载、SMS、设备 ID 访问)至结构化的 JSON 轨迹中。随后,这些轨迹会进行质量评分、过滤,并用于训练 ML 分类器。
**流水线一览:**
```
APKs (malware + benign)
↓
Android Emulator (API 30, x86_64)
↓
Frida Hooks → Runtime Events captured
↓
JSON behavioral traces saved per APK
↓
Quality filtering (score + rank all traces, keep top-300 per class)
↓
Feature engineering → CSV dataset
↓
ML training (RF, XGBoost, LightGBM, CatBoost, Ensembles)
↓
~96% accuracy on Dataset E (600 quality-filtered samples)
```
**关键文件:**
| 文件 | 作用 |
|---|---|
| `script.js` | 注入到 APK 进程中的 Frida JavaScript hooks |
| `runner.py` | 编排 APK 安装 → Frida 注入 → Monkey 事件 → JSON 输出 → 卸载 |
| `parser.py` | 将原始 Frida 日志输出标准化为干净的 JSON |
| `quality_filter.py` | 对所有 JSON 轨迹进行评分和排名,输出每个类别的 top 300 |
| `feature_engineering.py` | 将 JSON 轨迹转换为 ML 就绪的特征向量 |
| `finalBTPcode_final.ipynb` | 包含完整 ML 训练、调优、集成和评估的 notebook |
## 2. 系统要求
| 组件 | 要求 |
|---|---|
| 操作系统 | Windows 10/11 64 位 |
| 内存 | 推荐 16 GB(最低 8 GB —— 模拟器开销很大) |
| CPU | 必须支持硬件虚拟化 (VT-x / AMD-V) —— 需在 BIOS 中启用 |
| 硬盘 | 50+ GB 可用空间,首选 SSD |
| Python | 3.10 或更高版本 |
| Java | JDK 17 或更高版本 |
## 3. 环境配置
### 3.1 Java JDK
从 adoptium.net 下载并安装 Eclipse Temurin JDK 17。
设置环境变量:
```
JAVA_HOME = C:\Program Files\Eclipse Adoptium\jdk-17.x.x.x-hotspot
```
添加到 PATH:
```
%JAVA_HOME%\bin
```
验证:
```
java -version
```
### 3.2 Android Studio
从 developer.android.com/studio 下载。安装过程中请确保勾选以下选项:
- Android SDK
- Android SDK Platform-Tools
- Android Emulator
- Android Virtual Device
安装完成后,打开 SDK Manager 并在 SDK Platforms 下安装 **Android 11 (API 30)**。
将以下路径添加到系统 PATH:
```
C:\Users\\AppData\Local\Android\Sdk\platform-tools
C:\Users\\AppData\Local\Android\Sdk\build-tools\
```
### 3.3 Python 包
```
pip install frida-tools
pip install xgboost lightgbm catboost imbalanced-learn datasketch
pip install pandas numpy scikit-learn matplotlib seaborn
```
### 3.4 验证所有配置
运行以下所有命令 —— 全部必须成功才能继续:
```
adb version
aapt version
frida --version
```
请记下确切的 `frida --version` 输出 —— 下一步中会用到此数字。
## 4. 模拟器配置
### 4.1 创建虚拟设备
1. Android Studio → Tools → Device Manager → Create Device
2. 选择硬件:**Pixel 5**
3. 系统镜像:**API 30, x86_64, Google APIs**
4. 如果出现提示,请下载该镜像
需配置的设置:
| 设置 | 值 |
|---|---|
| RAM | 4096 MB(最低 2048) |
| VM Heap | 512 MB |
| Internal Storage | 6 GB |
| SD Card | 512 MB |
| Graphics | Hardware — GLES 2.0 |
### 4.2 启动模拟器
```
adb devices
```
预期结果:
```
emulator-5554 device
```
在运行任何内容之前,请等待完全启动并进入主屏幕。
## 5. Frida Server 设置
每次模拟器重启后都必须执行此操作。
### 5.1 下载 Frida Server
前往:github.com/frida/frida/releases
下载与您的 `frida --version` 完全匹配的文件:
```
frida-server--android-x86_64.xz
```
使用 7-Zip 解压。将解压后的文件重命名为 `frida-server`。
### 5.2 推送到模拟器
```
adb push frida-server /data/local/tmp/
```
### 5.3 启动 Frida Server
```
adb shell
su
chmod 755 /data/local/tmp/frida-server
/data/local/tmp/frida-server &
exit
```
### 5.4 验证连接
```
frida-ps -U
```
您应该会看到正在运行的模拟器进程列表。如果看到了,说明 Frida 正常工作。
## 6. 项目结构
```
project/
│
├── input/
│ ├── malware/ ← place malware APKs here
│ └── benign/ ← place benign APKs here
│
├── dataset/ ← generated JSON behavioral traces
│ ├── malware/
│ └── benign/
│
├── filtered/ ← quality-filtered Dataset E traces
│ ├── top300_malware/
│ └── top300_benign/
│
├── features/
│ ├── features_raw.csv ← features from all 1044 samples
│ └── dataset_E_top300_balanced.csv ← features from Dataset E (600 samples)
│
├── models/
│ └── malware_detector.pkl ← saved best model
│
├── script.js ← Frida hooks
├── runner.py ← main dynamic analysis pipeline
├── parser.py ← log parser
├── quality_filter.py ← behavioral quality scoring
├── feature_engineering.py ← JSON → feature CSV
└── finalBTPcode_final.ipynb ← ML notebook
```
## 7. 运行动态分析流水线
### 第 1 步 —— 放置 APK
```
input/malware/ ← malware APKs
input/benign/ ← benign APKs
```
### 第 2 步 —— 确认模拟器正在运行
```
adb devices
```
### 第 3 步 —— 确认 Frida server 正在运行
```
frida-ps -U
```
如果未运行,请重复第 5.3 节。
### 第 4 步 —— 运行流水线
```
cd path/to/project
python -u runner.py
```
对于每个 APK,runner.py 将会:
1. 通过 `aapt` 提取包名
2. 通过 `adb install` 安装 APK
3. 通过 Frida 生成 (spawn) 进程
4. 在任何应用代码运行之前注入 `script.js` hooks
5. 恢复进程
6. 通过 `adb shell monkey` 触发 UI 交互
7. 在配置的时间窗口内收集行为事件
8. 将 JSON 轨迹写入 `dataset/malware/` 或 `dataset/benign/`
9. 卸载 APK
10. 移至下一个 APK
### 第 5 步 ——(可选)运行质量过滤
```
python quality_filter.py
```
在 5 个维度(事件量、行为多样性、熵、加权恶意软件指标、通过 MinHash LSH 进行重复检测)上对所有 JSON 轨迹进行评分。保留每个类别的 top 300。写入 `filtered/`。
### 第 6 步 —— 特征工程
```
python feature_engineering.py
```
## 8. 运行 ML Notebook
该 notebook (`finalBTPcode_final.ipynb`) 专为 Google Colab 设计,但也支持在本地运行。
### 选项 A —— Google Colab
1. 将 notebook 上传到 Colab
2. 将 `dataset_E_top300_balanced.csv` 上传到 Google Drive 的 `MyDrive/recent-dataset/` 目录下
3. 运行 Cell 1(自动安装所有包)
4. 出现提示时挂载 Drive
5. 按顺序运行所有 cell
### 选项 B —— 本地 Jupyter
```
pip install jupyter
jupyter notebook finalBTPcode_final.ipynb
```
将 `dataset_E_top300_balanced.csv` 放在与 notebook 相同的文件夹中。如果放在其他地方,请更新 Cell 1 中的 `SEARCH_PATHS`。
### Notebook 执行顺序
| Cell | 执行内容 |
|---|---|
| 1 | 安装 xgboost, lightgbm, catboost, imbalanced-learn, datasketch |
| 2 | 挂载 Google Drive(仅限 Colab) |
| 3 | 加载 Dataset E,丢弃管理列 |
| 4 | 添加交互特征:对数转换、信号比率、共现标志 |
| 5 | 训练/验证拆分 (80/20 分层) + RobustScaler |
| 6 | 基线模型:RF, XGBoost, LightGBM, KNN, MLP |
| 7 | 对 XGBoost, LightGBM, Random Forest 进行 GridSearchCV 调优 |
| 8 | Voting 集成 (RF + XGB + LGB),Stacking 集成 |
| 9 | 对集成权重进行网格搜索 (Grid-search) |
| 10 | CatBoost 基线 + 调优后的 CatBoost |
| 11 | RFE 特征选择 + 基于 top-20 特征的集成 |
| 12 | 汇总结果表 + 所有模型的柱状图 |
### 保存最佳模型
```
import joblib
joblib.dump(best_catb, "models/malware_detector.pkl")
# 加载并预测
model = joblib.load("models/malware_detector.pkl")
pred = model.predict(new_features_dataframe)
```
## 9. 数据集信息
### 数据集版本
| 版本 | 样本数 | 备注 |
|---|---|---|
| 原始阶段 1 | ~600 | 初始收集,准确率约 92% |
| 原始阶段 2 | ~1044 | 规模扩大,由于包含噪点轨迹,准确率下降至约 88–91% |
| Dataset E | 600 | 质量过滤后:top-300 良性 + top-300 恶意。准确率约 96% |
Notebook 使用的是 Dataset E。它移除了:
- 93 次无效执行(≤ 2 个事件)
- 259 条几乎重复的轨迹(MinHash LSH,Jaccard ≥ 0.85)
- 118 条仅包含启动行为的轨迹
- 136 条稀疏轨迹(< 15 个事件)
### 数据集链接
| 资源 | 描述 |
|---|---|
| 完整 JSON 数据集 | 所有原始行为轨迹 |
| Dataset E CSV | `dataset_E_top300_balanced.csv` —— notebook 可直接使用 |
| ML Notebook | `finalBTPcode_final.ipynb` |
| 数据集恢复代码 | 用于从 CSV 重建数据集的脚本 |
### 每条轨迹提取的行为特征
统计特征:`n_events`, `duration_ms`, `event_density`, `ts_entropy`
计数特征:`cnt_network`, `cnt_file`, `cnt_runtime_exec`, `cnt_dex_load`, `cnt_crypto`, `cnt_sms`, `cnt_socket`, `cnt_device_id`
衍生/交互特征:`high_signal_ratio`, `noise_ratio`, `signal_to_noise`, `crypto_x_network`, `dex_x_exec`, `deviceid_x_network`, `webview_x_url`, `sms_x_deviceid`, `richness_x_volume`
## 10. 已知问题与修复
| 问题 | 原因 | 修复 |
|---|---|---|
| `adb not recognized` | PATH 未设置 | 将 platform-tools 添加到系统 PATH |
| `aapt not found` | PATH 未设置 | 将 build-tools 添加到 PATH |
| `frida-ps -U` 无返回 | 版本不匹配或服务器未运行 | 严格匹配 frida-tools 版本;重启 server |
| JSON 输出为空 | APK 崩溃、Frida 注入失败或恶意软件处于休眠状态 | 检查 ADB logcat 中的崩溃信息;增加执行时间;这些将被质量评分器过滤掉 |
| `INSTALL_FAILED_ALREADY_EXISTS` | 前一次运行未清理 | 手动运行 `adb uninstall ` |
| 模拟器在批处理中途卡死 | 内存累积 | 每运行 20–30 个 APK 重启一次模拟器 |
| frida-server 上提示 `Address already in use` | Server 已经在运行 | 不是错误 —— 正常继续即可 |
| APK 可安装但立即崩溃 | ABI 不匹配(在 x86_64 上仅有 ARM 原生库) | 这些会产生死轨迹,质量过滤器会将其移除 |
| Notebook:找不到 CSV | 路径错误 | 更新 Cell 1 中的 `SEARCH_PATHS` 列表,或将 CSV 上传到同一文件夹 |
| CatBoost 在 Colab 中安装失败 | Colab 环境问题 | 先在单独的 cell 中运行 `!pip install -q catboost` |
## 11. 下一步工作
如果您打算接手以扩展此研究,以下是能够带来最大提升的方向:
**改善行为覆盖率(影响最大)**
用 UIAutomator2 或 Appium 替换 `adb shell monkey`。Monkey 只能生成随机点击 —— 它无法导航登录屏幕、关闭对话框或触发特定流程。许多 APK 需要实际的用户交互才能被激活。这是当前流水线中最大的单一缺口。
**添加更多 APK(但需进行过滤)**
不要仅仅倾倒更多 APK 进去并重新训练。每个新的 APK 都应该经过 `quality_filter.py`。阶段 2 的实验表明,添加带有噪点的样本会明显损害准确率。只有在保持质量的前提下,增加数量才会有帮助。
**处理休眠恶意软件**
某些恶意软件样本会等待 C2 命令或 SMS 触发器后才会有所动作。要捕获这些行为:设置一个伪造的 C2 服务器(例如 Wireshark + 在模拟器网络内的可路由地址上运行一个简单的 Python socket 服务器),或者使用 intent fuzzing 来模拟外部触发。
**添加网络数据包捕获**
Frida 捕获 URL 字符串和主机名。添加 `tcpdump` 或将模拟器流量通过 `mitmproxy` 路由,以获取完整的数据包级网络数据 —— 有效载荷大小、TLS 指纹、连接模式。这将开启更丰富的网络特征集。
**时序/序列特征**
当前的特征是词袋模型(忽略顺序)。尝试在事件类型序列上使用 n-gram TF-IDF。事件顺序包含信号 —— 例如,`device_id → crypto → network` 比这三个事件以任何随机顺序出现都是更可疑的模式。
**反模拟硬化**
复杂的样本会检测到它们处于模拟器中并保持静默。研究模拟器指纹欺骗:伪造的 IMEI、真实的传感器值、正确的设备属性。`AndroGuard` 和 `apk-mitm` 等工具可以帮助检查样本正在运行哪些检测。
**多次运行平均**
目前每个 APK 只运行一次。使用不同的 Monkey seeds 运行每个 APK 3 次,并合并行为事件。这可以减少由于概率性 UI 交互产生的方差,并产生更丰富的轨迹。
*有关理论背景、数据集质量方法论和完整的实验结果 —— 请参阅详细的项目报告。*
标签:Android安全, Frida Hook, NoSQL, 动态分析框架, 安卓恶意软件分析, 数据可视化, 机器学习分类, 自动化分析, 行为检测, 跨站脚本, 逆向工具