CC-NX/MobC2Inspector
GitHub: CC-NX/MobC2Inspector
一个结合动态 Hook、静态模拟和机器学习的跨平台恶意软件 C2 通信检测平台,通过 MCP 协议支持 LLM 驱动的自动化分析。
Stars: 0 | Forks: 0
# MobC2Inspector
[](https://python.org)
[](https://frida.re)
[](LICENSE)
## 项目背景
本项目借鉴 **HITCON 2026 "AI Agent × 恶意程式C2通訊辨識"** 的前沿探索思路,结合 MCP (Model Context Protocol) 协议实现自动化恶意C2通信检测分析。
**核心创新点:**
- 将Frida动态Hook + Unidbg静态模拟相结合的全链路C2分析
- 隐蔽对抗模块确保在具备反沙箱、反Frida、反抓包能力的恶意样本前仍能采集真实特征
- **跨平台C2检测**:不仅支持Android恶意APK,还可直接分析Windows EXE木马捕获的PCAP流量,使用同一套检测模型输出结果
- 通过MCP协议将检测能力封装为标准工具,使LLM可以编排调度完整分析流程
- 量化评估体系(准确率、召回率、F1、ROC-AUC、误报率)
## 环境依赖
### Python 依赖
pip install frida frida-tools pandas numpy scikit-learn matplotlib joblib pyshark
# 或降级使用scapy
pip install scapy
| 包名 | 用途 | 最低版本 |
|------|------|---------|
| frida | 动态Hook框架 | 16.0.0 |
| frida-tools | Frida命令行工具 | 12.0.0 |
| pandas | 数据处理 | 1.5.0 |
| numpy | 数值计算 | 1.24.0 |
| scikit-learn | 机器学习模型 | 1.2.0 |
| matplotlib | 特征重要性可视化 | 3.7.0 |
| joblib | 模型序列化 | 1.2.0 |
| pyshark | PCAP解析(推荐) | 0.4.3 |
| scapy | PCAP解析(降级) | 2.5.0 |
### Android 环境(可选,用于真实设备分析)
- **Android SDK/NDK**:用于编译测试样本
- **Frida-server**:运行在Android设备端(与PC frida版本匹配)
- **ADB**:Android Debug Bridge
- **tcpdump**:可选,用于流量抓包
- **Unidbg**:Java静态模拟执行SO(可选,用于密钥提取)
### Unidbg 安装
git clone https://github.com/zhkl0228/unidbg
cd unidbg
mvn clean package -DskipTests
# 将 unidbg-android/target/unidbg-android-*.jar 复制到 unidbg/lib/
## 项目结构
MobC2Inspector/
├── mcp_server.py # MCP Server主程序 (stdio JSON-RPC, 7个工具)
├── engine/
│ ├── __init__.py # 引擎包初始化
│ └── engine.py # AnalysisEngine 核心分析引擎
├── pcap_analyzer.py # PCAP跨平台C2流量分析模块(新增)
├── frida_scripts/
│ ├── frida_hook_network.js # 网络行为Hook脚本
│ └── evasion_bypass.js # 隐蔽对抗(反检测伪装)脚本
├── unidbg/
│ └── unidbg_loader.java # Unidbg SO静态加载器
├── train_model.py # 机器学习模型训练脚本
├── data/
│ ├── sample_features.csv # 示例特征数据集 (120条,含Windows样本)
│ └── feature_importance.png # 特征重要性柱状图(训练生成)
├── models/
│ └── c2_model.joblib # 预训练随机森林模型(训练生成)
├── reports/ # 分析报告输出目录
├── logs/ # 日志输出目录
└── README.md # 项目文档
## 安装与配置
### 1. 克隆项目
git clone https://github.com/your-org/MobC2Inspector.git
cd MobC2Inspector
### 2. Python环境
python -m venv venv
source venv/bin/activate # Linux/macOS
# 或
.\venv\Scripts\activate # Windows
pip install -r requirements.txt
### 3. 创建依赖清单
pip freeze > requirements.txt
### 4. 验证安装
python mcp_server.py --test
### 快速演示
所有功能均支持 `demo_mode=True`,无需连接Android设备即可演示完整流程。
#### Step 1: 运行自测试
python mcp_server.py --test
输出包括6个工具的调用结果,覆盖全部功能。
#### Step 2: 训练检测模型
python train_model.py
输出5折交叉验证指标和特征重要性图。
#### Step 3: 单工具调用
# 列出样本
python mcp_server.py --tool list_samples
# 静态分析
python mcp_server.py --tool static_analysis --params '{"apk_id": "sample_001"}'
# 动态分析(启用隐蔽对抗)
python mcp_server.py --tool dynamic_analysis --params '{"apk_id": "sample_001", "bypass_evasion": true}'
# 流量捕获
python mcp_server.py --tool traffic_capture --params '{"apk_id": "sample_001", "duration_sec": 60}'
# 检测评估
python mcp_server.py --tool evaluate_detection
# 生成报告
python mcp_server.py --tool generate_report --params '{"apk_id": "sample_001"}'
#### Step 4: 启动MCP Server(供LLM调度)
python mcp_server.py
通过stdin/stdout接收JSON-RPC请求。LLM可使用标准MCP协议与其交互:
// 工具发现
{"jsonrpc": "2.0", "method": "tools/list", "id": 1}
// 调用工具
{"jsonrpc": "2.0", "method": "tools/call", "params": {
"name": "static_analysis",
"arguments": {"apk_id": "sample_001"}
}, "id": 2}
### 真实设备分析
# 连接设备
adb devices
# 启动frida-server
adb shell /data/local/tmp/frida-server-16.x.x-android-arm64 &
# 运行MCP Server(关闭demo模式)
python mcp_server.py --demo false --adb "C:\Android\platform-tools\adb.exe" --device "emulator-5554"
## 隐蔽对抗模块
### 设计思路
恶意样本常使用以下反分析技术:
1. **反Frida**:检测 `/proc/self/maps` 中的 `frida`、`gum-js-loop` 字符串
2. **反沙箱**:检测 `Build.MODEL`、`Build.TAGS`、`Debug.isDebuggerConnected()`
3. **反抓包**:检测 `tcpdump` 进程、代理设置
4. **环境指纹**:检查内核版本、设备属性、Root状态
### 对抗手段
| 对抗技术 | 实现方式 | Frida脚本 |
|---------|---------|----------|
| Build伪装 | Hook `android.os.Build` 静态字段getter,返回三星真机值 | `evasion_bypass.js:1` |
| 调试检测绕过 | `isDebuggerConnected()` 强制返回false | `evasion_bypass.js:2` |
| maps过滤 | Hook File/RandomAccessFile读取,过滤Frida关键字行 | `evasion_bypass.js:3` |
| 内核伪装 | Hook `android.system.Os.uname()` 返回真机内核 | `evasion_bypass.js:4` |
| Root检测绕过 | Hook `Runtime.exec()` 拦截su/root检测命令 | `evasion_bypass.js:7` |
| 模拟器检测绕过 | Hook `File.exists()` 过滤QEMU路径 | `evasion_bypass.js:8` |
| 环境变量过滤 | Hook `System.getProperty()` 过滤Frida环境变量 | `evasion_bypass.js:6` |
| 抓包降级 | 无tcpdump时使用Frida内存抓取明文 | `engine.py:_memory_capture_fallback` |
### 启用方法
# 通过MCP接口启用
# 设置 bypass_evasion=true(默认)
python mcp_server.py --tool dynamic_analysis --params '{"apk_id": "sample_001", "bypass_evasion": true}'
# 或通过引擎直接调用
engine = AnalysisEngine(demo_mode=True)
result = engine.dynamic_analysis("sample_001", bypass_evasion=True)
## 检测评估指标
### 指标含义
| 指标 | 缩写 | 含义 | 理想值 |
|------|------|------|--------|
| 准确率 | Accuracy | (TP+TN)/(TP+TN+FP+FN) | >0.95 |
| 精确率 | Precision | TP/(TP+FP) | >0.90 |
| 召回率 | Recall | TP/(TP+FN) | >0.90 |
| F1分数 | F1 | 2×P×R/(P+R) | >0.90 |
| AUC-ROC | AUC | ROC曲线下面积 | >0.95 |
| 误报率 | FPR | FP/(FP+TN) | <0.05 |
### 评估结果示例
{
"accuracy": 0.9640,
"precision": 0.9562,
"recall": 0.9783,
"f1_score": 0.9671,
"roc_auc": 0.9941,
"false_positive_rate": 0.0541,
"true_positive": 47,
"false_positive": 2,
"true_negative": 48,
"false_negative": 1
}
### 特征重要性
Top 5 区分C2通信的关键特征:
1. **packet_length_entropy** — C2通信载荷经过加密,熵值显著高于正常流量
2. **interval_variance** — 恶意C2通信间隔通常固定或有规律,方差小
3. **dns_query_entropy** — DGA生成的域名熵值高
4. **unique_destinations** — C2通信目标固定(1-3个),正常App连接多台服务器
5. **connection_count** — C2通信频率密集
## MCP协议接口
### tools/list
返回7个可用分析工具及其参数Schema。
### tools/call
MCP Server 通过 stdin/stdout 接收 JSON-RPC 2.0 请求。支持两种调用方式:
**方式一:MCP 标准协议(LLM/Agent 使用)**
{"jsonrpc": "2.0", "method": "tools/list", "id": 1}
{"jsonrpc": "2.0", "method": "tools/call", "params": {
"name": "static_analysis",
"arguments": {"apk_id": "sample_001"}
}, "id": 2}
**方式二:命令行单工具模式(人类使用)**
python mcp_server.py --tool static_analysis --params '{"apk_id": "sample_001"}'
### MCP 工具详细参考
#### 1. list_samples — 列出可用样本
| 项目 | 说明 |
|------|------|
| 用途 | 扫描 `samples/` 目录中的 APK/SO/PCAP 文件,返回可用样本列表 |
| 参数 | 无 |
| 返回值 | `list[dict]` |
返回字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| apk_id | string | 样本标识符(文件名去扩展名) |
| type | string | 样本类型: `apk` / `so` / `pcap` |
| available | bool | 是否可用 |
| path | string | 文件相对路径 |
| package_name | string | (APK 类型) Android 包名 |
| description | string | (APK 类型) 样本描述 |
| so_count | int | (APK 类型) 内部 SO 数量 |
#### 2. static_analysis — 静态分析
| 项目 | 说明 |
|------|------|
| 用途 | 对目标 APK/SO 执行 Unidbg 静态模拟,提取加密密钥和 TLS ClientHello 指纹(JA3) |
| 参数 | `apk_id: string`(必需) |
| 返回值 | `dict` |
返回字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| apk_id | string | 样本标识符 |
| package_name | string | Android 包名 |
| analysis_type | string | `"static"` |
| key_info.encryption_key_hex | string | 提取到的密钥 Hex |
| key_info.encryption_key_base64 | string | 密钥 Base64 |
| key_info.algorithm | string | 加密算法(如 AES-256-CBC) |
| key_info.iv_hex | string | IV 向量 Hex |
| tls_fingerprint.clienthello_cipher_suites | string[] | TLS 密码套件列表 |
| tls_fingerprint.supported_groups | string[] | 支持的椭圆曲线 |
| tls_fingerprint.signature_algorithms | string[] | 签名算法 |
| tls_fingerprint.extensions | string[] | TLS 扩展 |
| tls_fingerprint.ja3_hash | string | JA3 指纹哈希 |
| source | string | `"unidbg"` / `"mock_demo"` |
示例:
{"apk_id": "sample_001", "package_name": "com.malware.banking", "key_info": {
"encryption_key_hex": "A1B2C3D4E5F60718293A4B5C6D7E8F90",
"algorithm": "AES-256-CBC"}, "tls_fingerprint": {"ja3_hash": "e7d705a3286e19ea42f587b344ee43a5"},
"source": "unidbg"}
#### 3. dynamic_analysis — 动态分析
| 项目 | 说明 |
|------|------|
| 用途 | 使用 Frida 动态 Hook 目标 App 网络层,采集 C2 通信特征。支持 spawn(启动注入)和 attach(附加已有进程)两种模式 |
| 参数 | 见下表 |
| 返回值 | `dict` |
参数:
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| apk_id | string | — | **必需** 样本标识符 |
| bypass_evasion | bool | true | 是否启用隐蔽对抗(反 Frida 检测、反沙箱伪装) |
| attach | bool | false | attach 模式(附加到已在运行的 App)vs spawn 模式(启动 App) |
| process_name | string | null | 目标进程名。attach 模式下用于定位进程,spawn 模式下覆盖 `-f` 参数 |
| timeout_sec | int | 120 | 最大采集等待时间(秒) |
返回值关键字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| status | string | `"success"` / `"no_data"` / `"install_failed"` |
| connections | array | 每条连接的特征记录(ip, port, domain, tls_sni, cipher_suites, entropy, interval_ms, packet_len 等) |
| features | dict | 聚合特征(见下表) |
| source | string | `"mock_demo"`(仅 demo 模式) |
features 聚合字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| unique_ips | int | 不重复目标 IP 数 |
| unique_domains | int | 不重复域名数 |
| domain_entropy | float | 域名平均熵值(DGA 检测) |
| port_diversity | int | 端口多样性 |
| avg_interval_ms | float | 通信平均间隔(毫秒) |
| interval_variance | float | 通信间隔方差(心跳特征) |
| avg_payload_entropy | float | 载荷平均信息熵 |
| max_payload_entropy | float | 载荷最大信息熵 |
| total_connections | int | 总连接数 |
| tls_connection_count | int | TLS 连接数 |
| dns_query_count | int | DNS 查询次数 |
| has_sni | bool | 是否包含 SNI |
#### 4. traffic_capture — 流量抓包
| 项目 | 说明 |
|------|------|
| 用途 | 在设备后台执行网络抓包(tcpdump 或 Frida 内存抓取降级) |
| 参数 | `apk_id: string`(必需), `duration_sec: int`(默认 60) |
| 返回值 | `dict`(capture_method, pcap_path, packet_count, protocols 等) |
#### 5. analyze_pcap — PCAP 跨平台 C2 分析
| 项目 | 说明 |
|------|------|
| 用途 | 分析 Windows EXE 木马等非 Android 平台的 PCAP 流量文件,提取 C2 特征并调用 ML 模型预测 |
| 参数 | `pcap_path: string`(必需), `label: int`(可选 0/1 真实标签) |
| 返回值 | prediction, confidence, features 字典 |
#### 6. evaluate_detection — 检测模型评估
| 项目 | 说明 |
|------|------|
| 用途 | 使用标记数据集评估 C2 检测模型性能,输出量化指标 |
| 参数 | `ground_truth_csv: string`(默认 data/sample_features.csv), `pcap_list: array`(可选) |
| 返回值 | accuracy, precision, recall, f1_score, roc_auc, false_positive_rate |
#### 7. generate_report — 生成分析报告
| 项目 | 说明 |
|------|------|
| 用途 | 自动执行完整分析链(静态+动态+流量+ML),生成 Markdown 格式的综合分析报告 |
| 参数 | `target_id: string`(必需,APK ID 或 .pcap 文件路径) |
| 返回值 | report_path, judgment (malicious_c2/benign), confidence, summary |
示例:
{"target_id": "sample_001", "report_path": "reports/report_sample_001_20260626_202213.md",
"judgment": "malicious_c2", "confidence": 0.9941,
"summary": "检测到 5 条连接, 1 个域名, 平均载荷熵 4.12, 判定为恶意C2"}
## AnalysisEngine 引擎 API
`engine/engine.py` 中的 `AnalysisEngine` 类提供 7 个公有方法:
| 方法 | 签名 | 返回值 | 说明 |
|------|------|--------|------|
| `list_samples()` | `(self) -> list` | `list[dict]` | 扫描 samples/ 目录,返回可用样本列表 |
| `static_analysis(apk_id)` | `(apk_id: str) -> dict` | `dict` | 静态分析(Unidbg SO 模拟) |
| `dynamic_analysis(apk_id, bypass_evasion, timeout_sec, attach, process_name)` | `(apk_id: str, bypass_evasion: bool = True, timeout_sec: int = 120, attach: bool = False, process_name: str = None) -> dict` | `dict` | 动态分析(Frida Hook) |
| `traffic_capture(apk_id, duration_sec, use_tcpdump)` | `(apk_id: str, duration_sec: int = 60, use_tcpdump: bool = True) -> dict` | `dict` | 流量抓包 |
| `analyze_pcap(pcap_path, label)` | `(pcap_path: str, label: int = None) -> dict` | `dict` | PCAP 跨平台 C2 分析 |
| `evaluate_detection(ground_truth_csv, pcap_list)` | `(ground_truth_csv: str = None, pcap_list: list = None) -> dict` | `dict` | ML 模型评估 |
| `generate_report(target_id)` | `(target_id: str) -> dict` | `dict` | 生成综合 Markdown 报告 |
from engine.engine import AnalysisEngine
# 初始化引擎(默认非演示模式)
engine = AnalysisEngine()
# 列出样本
samples = engine.list_samples()
# 静态分析(Unidbg 模拟执行 SO)
result = engine.static_analysis("sample_001")
# 动态分析(spawn 模式,无隐蔽对抗)
result = engine.dynamic_analysis("sample_001", bypass_evasion=False)
# 动态分析(attach 模式,指定进程名)
result = engine.dynamic_analysis("base", attach=True, process_name="TestC2")
# 生成完整报告
report = engine.generate_report("sample_001")
# 切换演示模式(无真实设备)
engine_demo = AnalysisEngine(demo_mode=True)
## Frida Hook 脚本参考
`frida_scripts/frida_hook_network.js` 包含 8 组 Hook,覆盖 Java 层和 Native 层网络调用:
### Java 层 Hook
| # | 函数 | 目标方法 | 捕获特征 |
|---|------|---------|---------|
| 1 | `hookSocket()` | `java.net.Socket.connect(SocketAddress)` + `connect(SocketAddress, int)`(两个重载) | `ip, port, interval_ms` |
| 2 | `hookSSLSocket()` | `javax.net.ssl.SSLSocket` + 4 个具体实现类的 `connect()`(两个重载)+ `startHandshake()` | `ip, port, domain, tls_sni, cipher_suites, interval_ms` |
| 3 | `hookHttpsURLConnection()` | `getOutputStream()`, `getInputStream()`, `getResponseCode()`, `connect()` | `url, domain, port, tls_sni, interval_ms` |
| 4 | `hookOkHttp()` | `okhttp3.OkHttpClient.newCall()` | `url, domain, tls_sni, interval_ms` |
| 5 | `hookDatagramSocket()` | `java.net.DatagramSocket.send()` | `ip, port, packet_len, entropy, interval_ms` |
| 6 | `hookDNS()` | `java.net.InetAddress.getAllByName(String)` | `dns_query, interval_ms` |
| 7 | `hookURL()` | `java.net.URL.openConnection()` + `openConnection(Proxy)`(两个重载) | `url, domain, port, interval_ms` |
### Native 层 Hook
| # | libc 函数 | 捕获特征 |
|---|----------|---------|
| 8 | `connect` | `ip, port, protocol: "tcp"` |
| 9 | `send` | `packet_len, entropy, protocol: "tcp"` |
| 10 | `sendto` | `ip, port, packet_len, entropy, protocol: "udp"` |
| 11 | `recv` | `packet_len, entropy, protocol: "tcp"` |
| 12 | `getaddrinfo` | `dns_query` |
### 隐蔽对抗脚本
`frida_scripts/evasion_bypass.js` 提供 8 种反检测伪装:
| # | 技术 | 实现 |
|---|------|------|
| 1 | Build 伪装 | Hook 13 个 `android.os.Build` 字段,返回三星 Galaxy S21 真机值 |
| 2 | 调试检测绕过 | `isDebuggerConnected()` / `waitingForDebugger()` 强制返回 false |
| 3 | maps 过滤 | 拦截 `/proc/self/maps` 读取,过滤 frida/gum-js-loop 等关键字行 |
| 4 | 内核伪装 | Hook `android.system.Os.uname()` 返回假内核版本 |
| 5 | Frida 线程隐藏 | 枚举线程,记录 Frida 相关线程名 |
| 6 | 环境变量过滤 | Hook `System.getProperty()` / `getenv()` 过滤 Frida 环境变量 |
| 7 | Root 检测绕过 | Hook `Runtime.exec()` 拦截 su/busybox/magisk 命令 |
| 8 | 模拟器检测绕过 | Hook `File.exists()` 拦截 QEMU 路径检测 |
### 数据回传机制
Hook 回调(任意线程)
sendFeature(data) → push JSON 到 _sendQueue
↓
setInterval(250ms) → _flushQueue()
→ 所有队列数据批量为 JSON 数组
→ 同步 XMLHttpRequest POST → http://127.0.0.1:8888/data_collect
→ 失败时数据放回队首,下次重试
## 高级用法
### Attach 模式 vs Spawn 模式
# spawn 模式(默认):启动 App → 注入 Hook → 恢复执行
python mcp_server.py --tool dynamic_analysis --params '{"apk_id": "base"}'
# → frida -U --no-pause -f com.example.app -l script.js
# attach 模式:附加到已在运行的进程
python mcp_server.py --tool dynamic_analysis --params '{"apk_id": "base", "attach": true, "process_name": "TestC2"}'
# → frida -U TestC2 -l script.js(跳过 APK 安装)
attach 模式典型场景:手动打开 App 并登录到关键页面后,再 attach 上去 Hook 网络层,避免反调试逻辑在启动阶段触发。
### 自定义进程名
当进程名与包名不同(如 `com.example.app:push`),或 attach 模式需要指定不同名称时:
python mcp_server.py --tool dynamic_analysis \
--params '{"apk_id": "base", "attach": true, "process_name": "com.example.app:remote"}'
### 演示模式
# 无真实设备时可使用演示模式
python mcp_server.py --demo --tool static_analysis --params '{"apk_id": "sample_001"}'
python mcp_server.py --demo --tool dynamic_analysis --params '{"apk_id": "sample_001"}'
### 真实设备分析
# 1. 连接设备
adb devices
# 2. 启动 frida-server
adb shell /data/local/tmp/frida-server-16.x.x-android-arm64 &
# 3. 启动 MCP Server(非演示模式)
python mcp_server.py --adb "C:\Android\platform-tools\adb.exe"
# 4. 自动建立 ADB reverse(设备 127.0.0.1:8888 → 主机:8888)
python mcp_server.py --tool dynamic_analysis --params '{"apk_id": "base"}'
## 跨平台C2检测:PCAP流量分析
本平台不仅支持Android恶意C2检测,还可直接分析Windows木马捕获的pcap流量,使用**相同检测模型**输出结果,实现了平台无关的C2通信检测。
### 架构设计
Windows EXE木马抓包 → .pcap文件
↓
pcap_analyzer.py (新增独立模块)
↓
提取与动态Hook同构的特征:
TLS SNI, CipherSuites, 包长度熵,
通信间隔方差, DNS查询域名熵, 证书信息
↓
加载 c2_model.joblib → predict_proba
↓
{"prediction": "malicious", "confidence": 0.97}
### 解析引擎选择
| 优先级 | 引擎 | 安装方式 |
|--------|------|---------|
| 首选 | pyshark | `pip install pyshark` |
| 降级 | scapy | `pip install scapy` |
| 兜底 | 内置模拟数据 | 无需安装(仅演示) |
### 核心能力
1. **TLS ClientHello解析**:纯Python实现,不依赖外部库即可从TCP载荷中提取SNI、密码套件列表、TLS扩展
2. **DNS查询检测**:从DNS应答/请求中提取查询域名,计算域名Shannon熵值
3. **流量时序特征**:计算数据包到达间隔的均值和方差(心跳特征)
4. **包长度熵**:计算包长度序列的Shannon熵(加密流量特征)
5. **证书信息提取**:若有完整TLS握手,提取服务器证书的Issuer和Subject
### 使用方法
# 通过MCP接口分析PCAP
python mcp_server.py --tool analyze_pcap --params '{"pcap_path": "capture_malware.pcap", "label": 1}'
# 分析PCAP并生成报告(自动识别.pcap后缀)
python mcp_server.py --tool generate_report --params '{"target_id": "capture_malware.pcap"}'
# 合并PCAP评估
python mcp_server.py --tool evaluate_detection --params '{
"pcap_list": [
{"pcap_path": "malware1.pcap", "label": 1},
{"pcap_path": "normal1.pcap", "label": 0}
]
}'
### 特征同构性
PCAP分析提取的特征字段名与Frida动态Hook完全一致:
| 特征字段 | 动态Hook来源 | PCAP分析来源 |
|---------|-------------|-------------|
| tls_sni | SSLSocket.getHostName() | TLS ClientHello解析 |
| cipher_suites | getEnabledCipherSuites() | ClientHello Cipher Suites |
| packet_length_entropy | Socket数据长度统计 | IP包长度序列熵 |
| interval_variance | 连续连接时间戳差 | 包到达时间间隔方差 |
| dns_query_entropy | InetAddress.getAllByName | DNS查询域名熵 |
| cert_issuer | 证书解析 | 服务器证书Issuer |
## 关键技术实现
### 静态分析 — Unidbg
APK → 提取libnative.so → Unidbg模拟执行 → JNI环境补全
→ 调用JNI函数(genKey) → 提取密钥(Hex/Base64)
→ Hook SSL_write → TLS CipherSuites → JA3指纹
### 动态分析 — Frida
启动HTTP数据接收服务器 → [隐蔽对抗脚本加载]
→ 网络Hook脚本注入 → 追踪Socket/TLS/OkHttp/DNS
→ 实时计算熵值和间隔 → HTTP POST回传特征
→ 聚合分析 → C2判定
### 流量捕获
[ADB tcpdump] → 有root: 设备后台tcpdump抓包 → 拉取pcap
↓ tcpdump不可用/反抓包检测
[Frida内存抓取] → 无root/安全检测: 内存拦截Socket数据
### 机器学习检测
特征CSV → 标准化 → 随机森林(5折交叉验证)
→ 输出: 准确率/召回率/F1/AUC/FPR
→ 特征重要性排序 → 保存模型 joblib
## 注意事项
1. **合法使用**:本工具仅用于安全研究、教学和授权的渗透测试
2. **模拟数据**:`demo_mode=True` 时所有分析返回模拟数据,仅演示流程
3. **Frida版本**:确保PC端的frida版本与设备端的frida-server版本一致
4. **Root权限**:tcpdump需要Root权限;Frida Hook不需要Root
5. **中文错误**:所有异常提示使用中文
## 参考资源
- [Frida官方文档](https://frida.re/docs/)
- [Unidbg - Android SO模拟执行](https://github.com/zhkl0228/unidbg)
- [MCP协议规范](https://modelcontextprotocol.io/)
- [HITCON 2026 Conference](https://hitcon.org/)
- [scikit-learn 随机森林](https://scikit-learn.org/stable/modules/ensemble.html#forest)
**CC Team © 2026**
标签:Android安全, Apex, DLL 劫持, 云资产清单, 大语言模型, 安全, 机器学习, 目录枚举, 移动安全, 超时处理, 逆向工具, 逆向工程