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, 动态分析框架, 安卓恶意软件分析, 数据可视化, 机器学习分类, 自动化分析, 行为检测, 跨站脚本, 逆向工具