luongnc2k/trafficav
GitHub: luongnc2k/trafficav
该项目使用 Python 对学术论文中的 TrafficAV 系统进行复现,通过分析网络流量中的 HTTP 和 TCP 行为特征来检测 Android 恶意软件。
Stars: 0 | Forks: 0
# TrafficAV — 通过网络流量分析检测 Android Malware
使用 Python 对论文中发布的 **TrafficAV** 系统进行的重新实现:
## 概述
TrafficAV 不再分析应用程序的代码(因为代码很容易被 obfuscation 绕过),而是监控 Android 设备的**实际网络行为**。该系统构建了两个独立的分类模型,并通过 union rule 将它们结合起来:
```
PCAP ──▶ HTTP Feature Extractor ──▶ C4.5 HTTP Model ─┐
──▶ TCP Flow Extractor ──▶ C4.5 TCP Model ─┴─▶ Verdict + Score
```
| 模型 | 特征 | Detection Rate |
|---------|-----------|---------------|
| HTTP Model | Host, URI, Method, User-Agent | 96.38% |
| TCP Model | duration, pkt_count, byte_count, avg_pkt_size, pkt_interval, dst_port | 91.31% |
| **Combined (Union)** | — | **97.89%** |
## 项目结构
```
trafficav/
├── trafficav_pipeline.ipynb # TOÀN BỘ code: feature extraction, C4.5 model, pipeline,
│ # evaluate, và 3 bước chuẩn bị dataset / huấn luyện / dự đoán
│
├── data/ # Dataset PCAP thô CIC-AndMal2017 (xem docs/dataset_guide.md)
│ ├── Benign//*.pcap # Benign/2015, Benign/2016, Benign/2017
│ ├── Adware//*.pcap # Dowgin, Ewind, Feiwo, Gooligan, ...
│ ├── Ransomware//*.pcap # Charger, Jisut, Koler, ...
│ ├── Scareware//*.pcap # FakeAV, AndroidDefender, ...
│ ├── SMSMalware//*.pcap # Plankton, Beanbot, Zsone, ...
│ ├── http_features.csv # Features HTTP đã trích xuất từ PCAP (build_dataset_from_folder)
│ └── tcp_features.csv # Features TCP đã trích xuất từ PCAP, gộp theo file (build_dataset_from_folder)
│
├── models/ # Trained models (joblib)
│ ├── http_model.pkl # Train từ data/http_features.csv (host/uri/method/ua trích xuất từ PCAP)
│ └── tcp_model.pkl # Train từ data/tcp_features.csv
│
├── results/ # Biểu đồ và metrics CSV
│
├── docs/
│ ├── methodology.md # Giải thích thuật toán chi tiết
│ ├── dataset_guide.md # Hướng dẫn tải và chuẩn bị dataset
│ ├── usage_guide.md # Hướng dẫn chạy từng phần trong notebook: trích xuất / train / dự đoán
│ └── api_reference.md # Tham chiếu các hàm/class định nghĩa trong notebook
│
└── requirements.txt # Tham khảo (notebook có cell %pip install riêng, đọc cùng danh sách)
```
## 安装
**环境要求:** Python 3.10+,Jupyter(或安装了 Jupyter 扩展的 VS Code)
```
cd trafficav
pip install -r requirements.txt
```
或者打开 `trafficav_pipeline.ipynb` 并运行第一个代码块(“0. 安装依赖库”部分)——该代码块
会自动使用 `%pip install` 安装同一列表中的依赖库。
主要依赖库:
| 库 | 用途 |
|----------|----------|
| `dpkt` / `scapy` | 读取和解析 PCAP 文件 |
| `scikit-learn` | Decision Tree(C4.5 近似算法) |
| `pandas` / `numpy` | 处理表格数据 |
| `matplotlib` / `seaborn` | 绘制结果图表(在 notebook 中 inline 显示) |
| `joblib` | 保存/加载训练好的模型 |
| `tqdm` | 处理多个 PCAP 时显示进度条 |
## 使用 CIC-AndMal2017 数据集(原始 PCAP)的工作流程
本项目直接使用 CIC-AndMal2017 的**原始 PCAP**,并按照
`data///*.pcap` 和 `data/Benign//*.pcap` 的目录结构进行组织——这与
CIC 网站上数据集的原始布局完全一致。两个提取器(`extract_http_features` 和 `extract_tcp_features`,定义在
notebook 的“2. 提取特征”部分中)均使用 `dpkt` 直接在 PCAP 上运行,因此**无论是 HTTP model 还是
TCP model 都能从该数据源中进行训练**。
在 Jupyter/VS Code 中打开 `trafficav_pipeline.ipynb`,并**从第一个代码块开始按顺序运行**——
定义函数/类的代码块(0-5 部分)必须在运行下文 6-8 部分的代码块之前执行。
### 1. 准备 PCAP
下载原始的 CIC-AndMal2017 PCAP 数据(https://www.unb.ca/cic/datasets/andmal2017.html,需要通过邮箱注册获取
链接)或者使用自行抓取的 PCAP,然后将其按以下结构组织到 `data/` 目录中:
```
data/
├── Benign/2015|2016|2017/*.pcap
├── Adware//*.pcap # Dowgin, Ewind, Feiwo, Gooligan, ...
├── Ransomware//*.pcap # Charger, Jisut, Koler, ...
├── Scareware//*.pcap # FakeAV, AndroidDefender, ...
└── SMSMalware//*.pcap # Plankton, Beanbot, Zsone, ...
```
`infer_label_from_path()` 会自动从文件夹名称中识别标签(路径中任何名为
`benign` 的部分 → 标签为 `"benign"`,否则直接取上一级父文件夹的名称作为 family),因此这种布局
无需重命名或扁平化结构即可直接使用。
### 2. 提取特征 — notebook 中的“6. 步骤 1 — 准备数据集”部分
修改变量并运行代码块(相当于以前的 CLI 参数 `--data`/`--output`/`--mode`/`--scan`):
```
DATA_DIR = os.path.join(BASE_DIR, "data")
OUTPUT_DIR = os.path.join(BASE_DIR, "data")
EXTRACT_MODE = "both" # "http" | "tcp" | "both"
SCAN_ONLY = False # True = chỉ quét thống kê nhanh, không trích xuất
```
运行该代码块将递归遍历 `data/` 下的所有 `*.pcap`/`*.pcapng` 文件,在每个
文件上同时运行两个提取器,然后输出保存为 `data/http_features.csv` 和 `data/tcp_features.csv`。
### 3. 训练 — notebook 中的“7. 步骤 2 — 训练”部分
```
HTTP_CSV = os.path.join(BASE_DIR, "data", "http_features.csv")
TCP_CSV = os.path.join(BASE_DIR, "data", "tcp_features.csv")
TRAIN_DATA_DIR = None # đặt = DATA_DIR để tự trích xuất PCAP nếu chưa có CSV
```
然后依次运行 “Load” → “Train” → “Evaluate” → “报告 + 保存模型” 代码块。
### 4. 预测 — notebook 中的“8. 步骤 3 — 预测”部分
```
PCAP_PATH = "suspicious.pcap" # một file
BATCH_PATTERNS = None # hoặc: [os.path.join(BASE_DIR, "data", "test", "*.pcap")]
```
## 在 notebook 中使用库
不再需要 `import src...` ——在运行定义相关的代码块(“1. 导入”到“5. 评估和
绘图”部分)后,所有函数/类都已经可以直接在 notebook 的 kernel 中使用,可直接在下一个代码块中调用:
```
# 加载已 train 的 models
av = TrafficAV.load(os.path.join(BASE_DIR, "models"))
# 从 PCAP 文件预测
result = av.predict_pcap("suspicious.pcap")
print(result.verdict) # "malware" | "benign"
print(result.confidence) # "high" | "medium" | "low"
print(result.http_label) # "Gappusin" | "benign" | None
print(result.explanation) # Giải thích tại sao
# 从已提取的 features 预测
result = av.predict_features(
http_feat={"host": "app.wapx.cn", "uri": "/update",
"method": "GET", "ua": "Apache-HttpClient/UNAVAILABLE (java 1.4)"},
tcp_feat={"duration": 1.2, "pkt_count": 10, "byte_count": 450,
"avg_pkt_size": 45.0, "pkt_interval": 0.15, "dst_port": 8080},
)
```
完整的 API(了解哪个函数定义在 notebook 的哪个部分)请参见 [`docs/api_reference.md`](docs/api_reference.md)。
## 复现结果
原论文中的数据(13,872 个样本 — Drebin 数据集):
| 方法 | Detection Rate |
|-------------|---------------|
| TrafficAV (论文) | **97.89%** |
| DREBIN (静态分析) | 93.90% |
| AntiVir | 96.41% |
| AVG | 93.71% |
| BitDefender | 84.66% |
在原始 CIC-AndMal2017 PCAP 数据集上的实际结果(`data/` — 包含 2,126 个 PCAP 文件,42 个
malware 家族以及 Benign,特征由 `dpkt` 直接提取 — 见 `results/metrics.csv`):
| 模型 | Accuracy | Detection Rate | FPR | Precision | F1 |
|-------|---------:|---------------:|----:|----------:|---:|
| HTTP | 95.59% | 82.11% | 2.22% | 85.71% | 83.87% |
| TCP | 81.79% | 63.16% | 15.19% | 40.27% | 49.18% |
| **Combined** | **84.73%** | **96.84%** | **17.24%** | **47.67%** | **63.89%** |
各模型与原论文的对比:
| 模型 | Detection Rate — 原论文 (Drebin) | Detection Rate — 实际结果 (CIC-AndMal2017) |
|-------|---------------------------------------:|-------------------------------------------:|
| HTTP | 96.38% | 82.11% |
| TCP | 91.31% | 63.16% |
| **Combined (Union)** | **97.89%** | **96.84%** |
由于原始 PCAP 包含了充足的 HTTP 和 TCP 数据,这次成功对两个模型都进行了训练。Union Rule 清晰地
展现了其设计初衷所带来的折中:Combined 的 Detection Rate (96.84%) 明显高于任何单一的
模型(因为它捕获了另一个模型遗漏的样本——95 个测试样本中仅剩 3 个 malware 未被检测到),
代价是 FPR 也会相应上升(17.24% 对比单一模型的 2.22–15.19%)——即优先考虑 recall
而非 precision,这完全符合原始设计的安全意图。
尽管使用了截然不同的数据源(CIC-AndMal2017 与论文中的 Drebin 数据集),Combined Detection Rate (96.84%) 已经非常接近原论文的数据 (97.89%)。剩余的差异主要来自:
(1) `sklearn.DecisionTreeClassifier` 仅支持二叉分裂(CART),而不是原始
C4.5 的多路分裂;(2) 样本的规模和分布存在差异——由于
CIC-AndMal2017 包含更多样化的 HTTPS/benign 流量,而 HTTP model 无法读取这些 header,导致 FPR (17.24%) 明显高于论文水平。
在你的本地机器上重新运行 `trafficav_pipeline.ipynb` 中的 “6. 步骤 1”和“7. 步骤 2”部分即可复现上述数据。
## 参考文献
- Wang et al. (2019). *A Mobile Malware Detection Method Using Behavior Features in Network Traffic.* JNCA. https://doi.org/10.1016/j.jnca.2018.10.009
- Quinlan, J. R. (1993). *C4.5: Programs for Machine Learning.* Morgan Kaufmann.
- Arp, D. et al. (2014). *DREBIN: Effective and Explainable Detection of Android Malware in Your Pocket.* NDSS.
- CIC-AndMal2017 Dataset: https://www.unb.ca/cic/datasets/andmal2017.html
标签:Android, Apex, C4.5决策树, DSL, Python, 安全, 无后门, 机器学习, 网络流量分析, 自定义DNS解析器, 超时处理, 逆向工具