rohanambati-bot/Malware-Whisperer
GitHub: rohanambati-bot/Malware-Whisperer
面向执法与取证的全栈 Android 恶意软件分析平台,结合静态分析、动态沙箱与网络欺骗层,生成可操作的取证报告。
Stars: 1 | Forks: 0
# Malware Whisperer
**专为执法机构与网络取证设计的 Android APK 恶意软件分析平台**
这是一个全栈应用程序,能够对可疑的 Android APK 执行静态分析、动态沙箱执行、网络欺骗(DNS Sinkhole + 伪造的 C2 蜜罐)以及证据关联分析——最终为 CID 调查官生成可操作的取证报告。
## 架构
```
┌──────────────┐ ┌──────────────────────────────────────┐ ┌──────────────────┐
│ Frontend │◄─────►│ Backend (FastAPI) │◄─────►│ Android Emulator │
│ React/Vite │ API │ Static + Dynamic + Deception Engine │ ADB │ (malware-sandbox)│
└──────────────┘ └──────────────────────────────────────┘ └──────────────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
DNS Sinkhole Fake C2 Honeypot SQLite DB
(UDP port 53) (HTTP catch-all) (evidence store)
```
**技术栈:**
- 后端:Python 3.12, FastAPI, Uvicorn, SQLite (aiosqlite), YARA, Androguard, JADX
- 前端:React 18, TypeScript, Vite, Tailwind CSS, D3.js, Motion (Framer)
- 沙箱:Android Emulator (API 35), ADB, Frida(可选)
- AI:Google Gemini(可选,用于生成调查官摘要)
## 功能特性
### 静态分析
- **权限分析** —— 提取并分类所有声明的权限(正常/危险/签名)
- **YARA 签名扫描** —— 19 条取证规则:短信窃取器、键盘记录器、勒索软件、银行钓鱼覆盖攻击、间谍软件、Dropper、屏幕录制、通过 Firebase 的 C2 通信、加密货币矿工等
- **IOC 提取** —— APK 中内嵌的 URL、域名和 IP 地址,经过验证和过滤以去除框架噪音
- **证书分析** —— 签名者主题/颁发者、SHA-1 指纹、跨样本匹配
- **可疑 API 检测** —— 模拟器检测、调试器检测、root/su、Frida、动态代码加载、发送短信、位置追踪、滥用辅助功能
- **反分析检测** —— 识别沙箱规避代码,确保此类样本永远不会被标记为“安全”
- **混淆评估** —— 加密的 ZIP 条目、加壳的 DEX、反射、动态加载信号
- **逆向工程** —— 原始 ZIP 字符串提取、原生库扫描、针对加密 APK 的反混淆技术
### 动态沙箱
- **模拟器实时执行** —— 通过 ADB 在真实的 Android 模拟器上安装并运行 APK
- **Logcat 捕获** —— 30-120 秒的观察窗口,捕获所有设备活动
- **次级行为检测** —— 将运行时日志分类为:数据外泄、释放二级 APK、文件生成、命令执行、权限提升、动态代码加载、原生库加载
- **安装诊断** —— 针对 ABI 不匹配、缺少 splits、无桌面图标应用的结构化错误检测
- **安全 UI 刺激** —— 中立交互(点击、滑动、菜单、monkey 事件)以触发潜伏的恶意软件
- **GPS 位置设置** —— 可配置的坐标,用于触发基于位置感知的恶意软件
- **网络重定向** —— 在可 root 的模拟器上使用 iptables NAT,将 DNS 和 HTTP 重定向到欺骗层
### 网络欺骗
- **DNS Sinkhole** —— 纯 Python 异步 UDP 服务器拦截所有域名查询,并将响应伪造为你的 IP
- **伪造 C2 蜜罐** —— HTTP 全捕获端点捕获恶意软件信标,并对其进行分类(注册/命令/数据外泄/信标/指纹识别)
- **实时 WebSocket** —— 将事件流实时传输到前端仪表板
- **案件关联** —— 每个捕获的事件都通过 SHA-256 打标签关联到对应的 APK 案件
### 威胁情报
- **基于关联的评分** —— 来自权限、YARA、IOC、API 和运行时行为的加权证据;在升级威胁级别前需要多个独立信号达成一致
- **VirusTotal 集成** —— 哈希信誉查询(文件绝不会被上传至 VT)
- **MITRE ATT&CK 映射** —— 将检测到的行为映射到移动端的 ATT&CK 技术
- **证书交叉匹配** —— 查找共享相同签名证书的其他样本
### 报告与调查
- **取证 PDF 报告** —— 自动生成档案,包含所有发现结果、按严重程度排序的 C2 活动、证据保管链
- **AI 调查官摘要** —— 由 Gemini 驱动的自然语言总结,适合非技术背景的调查人员(无 API 密钥时回退到模板生成)
- **证据账本** —— 经 HMAC 签名的防篡改审计日志,记录每一个操作
- **C2 事件描述** —— 每个捕获的事件都会获得一句通俗易懂的单行解释
### 安全性
- **身份验证** —— 存储于 HttpOnly cookie 中的 JWT,采用恒定时间密钥比较
- **CSRF/CORS 防护** —— 来源允许列表、Referer 验证
- **速率限制** —— 针对上传和登录的基于 IP 的限流
- **路径遍历防护** —— 对所有上传文件进行文件名过滤处理
- **证据完整性** —— 带有验证端点的 HMAC 签名审计链
- **隐私保护** —— API 响应中对 IMEI/MAC/OTP 进行脱敏处理
- **沙箱隔离** —— 一次性模拟器,APK 绝不被修改/打补丁,不绕过反检测机制
## 项目结构
```
malware-whisperer-backend/
├── app/
│ ├── main.py # FastAPI app, routes, middleware, honeypot
│ ├── analysis.py # Static analysis engine + threat scoring
│ ├── yara_rules.py # 19 YARA detection rules
│ ├── sandbox.py # Dynamic sandbox (ADB runtime)
│ ├── sandbox_orchestrator.py # Emulator lifecycle management
│ ├── dns_sinkhole.py # DNS sinkhole server
│ ├── anti_analysis.py # Anti-analysis detection
│ ├── secondary_behaviors.py # Runtime behavior categorization
│ ├── install_diagnostics.py # APK install failure detection
│ ├── reverse_engineer.py # Advanced IOC extraction
│ ├── jadx_decompiler.py # JADX integration
│ ├── zip_inspector.py # Encrypted/packed APK detection
│ ├── pcap_generator.py # Synthetic PCAP writer
│ ├── pcap_parser.py # PCAP analysis
│ ├── ai_brief.py # Gemini AI officer's brief
│ ├── behavior_log.py # Event classification + descriptions
│ ├── reports.py # PDF report generation
│ ├── db.py # SQLite database (aiosqlite)
│ ├── events.py # WebSocket event bus
│ ├── platform_utils.py # Cross-platform path detection
│ ├── frida_generator.py # Frida script generation
│ ├── apk_package.py # APK/bundle unpacking
│ └── tld_list.py # Valid TLD list for IOC validation
├── .env # Configuration (see below)
├── requirements.txt # Python dependencies
└── whisperer.db # SQLite database (auto-created)
malware-whisperer-frontend/
├── src/
│ ├── pages/
│ │ ├── UploadPage.tsx # APK upload
│ │ ├── AnalysisPage.tsx # Static + dynamic results
│ │ ├── DeceptionPage.tsx # DNS sinkhole + C2 live feed
│ │ ├── TrafficPage.tsx # Behavior event timeline
│ │ ├── KillChainPage.tsx # D3 network graph
│ │ ├── CidPage.tsx # Evidence ledger + AI brief
│ │ └── ReportPage.tsx # Forensic report + PDF export
│ ├── components/ # Reusable UI components
│ ├── lib/ # API client, derive functions, utilities
│ └── types/ # TypeScript interfaces
├── package.json
└── vite.config.ts
```
## 前置条件
- **Python 3.12+**
- **Node.js 18+** 及 npm
- **Android Studio**(用于 SDK、Emulator 和 AVD Manager)
- **JADX** 反编译器(可选,用于完整的 Java 反编译)
- **Frida**(可选,用于运行时动态插桩:`pip install frida-tools`)
## Android Studio 与模拟器配置(分步指南)
### 步骤 1:安装 Android Studio
1. 从 https://developer.android.com/studio 下载
2. 运行安装程序 —— 接受所有默认选项
3. 首次启动时,让设置向导安装 **Android SDK**(它会自动选择一个默认位置):
- **Windows:** `C:\Users\\AppData\Local\Android\Sdk`
- **macOS:** `~/Library/Android/sdk`
- **Linux:** `~/Android/Sdk`
4. 将 `ANDROID_HOME` 环境变量设置为此路径(应用会自动检测,但显式设置是最安全的)
### 步骤 2:安装必需的 SDK 组件
打开 **Android Studio → Settings → SDK Manager**(或从终端运行 `sdkmanager`):
```
# Platform Tools (ADB)
sdkmanager "platform-tools"
# Emulator
sdkmanager "emulator"
# System Image — 必须是 google_apis (rootable),而不是 google_apis_playstore
sdkmanager "system-images;android-35;google_apis;x86_64"
# (可选)在 Intel/AMD 机器上运行 ARM APK 时,x86_64 image 会通过 ndk-translation 转译 ARM
```
### 步骤 3:创建 AVD (Android Virtual Device)
**选项 A:通过 Android Studio UI**
1. 打开 **Tools → Device Manager → Create Device**
2. 选择硬件:**Pixel 6a**(或类似设备)
3. 选择系统镜像:**API 35, Google APIs, x86_64**
4. 为 AVD 命名:**`malware-sandbox`**
5. 设置以下推荐选项:
- RAM: 2048 MB
- Internal Storage: 6 GB
- SD Card: 已启用
- GPU: Auto
- Boot: Fast Boot
**选项 B:通过命令行**
```
# 创建 AVD
avdmanager create avd \
-n malware-sandbox \
-k "system-images;android-35;google_apis;x86_64" \
-d pixel_6a
# 验证其是否存在
emulator -list-avds
# 应该显示:malware-sandbox
```
### 步骤 4:为恶意软件分析配置 AVD
编辑 AVD 配置文件以优化分析环境:
- **Windows:** `C:\Users\\.android\avd\malware-sandbox.avd\config.ini`
- **macOS/Linux:** `~/.android/avd\malware-sandbox.avd/config.ini`
推荐设置(大部分默认已开启):
```
hw.cpu.ncore = 4
hw.ramSize = 2048
hw.lcd.density = 420
hw.lcd.height = 2400
hw.lcd.width = 1080
hw.gps = yes
hw.camera.back = emulated
hw.camera.front = none
image.androidVersion.api = 35
tag.id = google_apis
PlayStore.enabled = false
fastboot.forceFastBoot = yes
```
### 步骤 5:启动模拟器
```
# 以 headless 模式启动(无 GUI 窗口)— 适合服务器/后台运行
emulator -avd malware-sandbox -no-window -no-audio
# 或者带 GUI(用于调试/demo)
emulator -avd malware-sandbox
```
等待 30-60 秒完成启动,然后验证:
```
adb devices
# 预期输出:
# List of devices attached
# emulator-5554 device
```
### 步骤 6:验证 root 权限(DNS 重定向所需)
```
adb root
# 预期:"adbd is already running as root" 或 "restarting adbd as root"
adb shell id
# 预期:uid=0(root)
adb shell which iptables
# 预期:/system/bin/iptables
```
如果 `adb root` 提示 "cannot run as root in production builds" —— 说明你选了**错误的镜像**(PlayStore 版)。请返回步骤 2 并使用 `google_apis`(而不是 `google_apis_playstore`)。
### 步骤 7:(可选)安装 JADX
JADX 用于 Java 反编译。如果未安装,系统将回退到原始字符串提取。
1. 从 https://github.com/skylot/jadx/releases 下载
2. 解压到某个文件夹(例如 `Android/Sdk/tools/jadx/`)
3. 在 `.env` 中设置 `JADX_BIN`:
- Windows: `JADX_BIN=C:\path\to\jadx\bin\jadx.bat`
- Linux/macOS: `JADX_BIN=/path/to/jadx/bin/jadx`
或者直接将 `jadx` 添加到你的 PATH 环境变量中。
### 步骤 8:(可选)安装 Frida
Frida 提供更深度的运行时插桩(加密密钥追踪、网络 Hook)。
```
# 安装 Frida CLI
pip install frida-tools
# 下载适用于 x86_64 Android 的 frida-server
# 匹配通过以下命令显示的版本:frida --version
# 从以下地址下载:https://github.com/frida/frida/releases
# 推送到 emulator:
adb push frida-server--android-x86_64 /data/local/tmp/frida-server
adb shell "chmod 755 /data/local/tmp/frida-server"
```
在 `.env` 中设置:
```
FRIDA_SERVER_PATH=/data/local/tmp/frida-server
```
## 配置与安装
### 1. 克隆代码库
```
git clone https://github.com/YOUR_USERNAME/malware-whisperer.git
cd malware-whisperer
```
### 2. 后端配置
```
cd malware-whisperer-backend
python -m venv .venv
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
pip install -r requirements.txt
```
### 3. 配置环境变量
将 `.env.example` 复制为 `.env` 并编辑:
```
cp .env.example .env
```
关键设置:
```
# 必需
ADMIN_ACCESS_KEY=your-secure-random-key
JWT_SECRET_KEY=your-jwt-secret
AUDIT_HMAC_KEY=your-hmac-key
DISABLE_AUTH=true # Set false in production
# Android SDK(如果设置了 ANDROID_HOME 则会自动检测)
# ANDROID_HOME=/path/to/Android/Sdk
# 可选集成
# GEMINI_API_KEY=your-gemini-key # 用于 AI briefs
# VT_API_KEY=your-virustotal-key # 用于 hash lookups
```
### 4. 前端配置
```
cd malware-whisperer-frontend
npm install
```
### 5. 创建 Android 模拟器
```
# 创建 AVD(如果不存在)
avdmanager create avd -n malware-sandbox -k "system-images;android-35;google_apis;x86_64" -d pixel_6a
```
## 运行项目
**请按以下顺序启动:模拟器 → 后端 → 前端**
### 终端 1:Android Emulator
```
emulator -avd malware-sandbox
# 等待完全启动,然后验证:
adb devices
# 应该显示:emulator-5554 device
```
### 终端 2:后端
```
cd malware-whisperer-backend
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
```
你应该看到:
```
[INIT] Set Windows ProactorEventLoop for subprocess support
======================================================================
ANDROID ENVIRONMENT DETECTION
======================================================================
ANDROID_HOME [FOUND] /path/to/Android/Sdk
ADB [FOUND] /path/to/adb
...
======================================================================
DNS Sinkhole Server successfully listening on port 53
Uvicorn running on http://0.0.0.0:8000
```
### 终端 3:前端
```
cd malware-whisperer-frontend
npm run dev
```
### 在浏览器中打开
导航至 **http://localhost:5173**
## 使用说明
1. 通过上传页面上传可疑的 **APK**
2. **审查静态分析** —— 权限、YARA 命中情况、IOC、证书、可疑 API
3. **运行动态分析** —— 点击 "Run Runtime Analysis" 在模拟器中执行
4. **监控网络欺骗** —— 观察 DNS Sinkhole 和 C2 蜜罐捕获实时流量
5. **导出报告** —— 下载取证 PDF 或生成 AI 调查官摘要
## API 端点(核心路由)
| 方法 | 路径 | 用途 |
|--------|------|---------|
| POST | `/api/upload` | 上传并分析 APK |
| GET | `/api/apks` | 列出所有已分析的 APK |
| GET | `/api/apks/{sha256}` | 获取完整的分析结果 |
| POST | `/api/sandbox/run/{sha256}` | 运行动态分析 |
| GET | `/api/sandbox/status` | 检查模拟器就绪状态 |
| GET | `/api/c2/events` | 列出捕获的 C2 事件 |
| GET | `/api/dns/sinkhole/status` | DNS Sinkhole 状态 |
| GET | `/api/dns/sinkhole/verify` | 验证 DNS 拦截是否生效 |
| GET | `/api/behavior` | 行为事件时间轴 |
| GET | `/api/evidence` | 证据账本(证据保管链) |
| GET | `/api/report/{sha256}` | 下载取证 PDF |
| POST | `/api/officer-brief/{sha256}` | 生成 AI 摘要 |
| WS | `/ws` | 实时事件流 |
## 配置参考
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `DISABLE_AUTH` | `true` | 在本地使用时禁用身份验证 |
| `SANDBOX_PROVIDER` | `adb_runtime` | 沙箱模式 (`adb_runtime` / `emulator`) |
| `SANDBOX_DURATION` | `30` | 运行时捕获窗口(秒) |
| `SANDBOX_UI_STIMULUS` | `true` | 发送安全交互以触发潜伏的恶意软件 |
| `SANDBOX_SET_LOCATION` | `true` | 在模拟器上设置 GPS 坐标 |
| `DNS_SINKHOLE_PORT` | `53` | DNS Sinkhole UDP 端口 |
| `SINKHOLE_IP` | `127.0.0.1` | 用于欺骗所有域名解析的 IP 地址 |
| `FULL_IOC_EXTRACTION` | `true` | 提取所有 IOC(无限制) |
| `MAX_APK_SIZE_MB` | `200` | 最大上传大小 |
| `GEMINI_API_KEY` | _(空)_ | Google Gemini API 密钥(可选) |
| `VT_API_KEY` | _(空)_ | VirusTotal API 密钥(可选) |
## 安全实现
- **身份验证:** JWT(HttpOnly cookie, HS256, 24 小时过期)
- **CSRF:** 对状态更改方法执行 Origin/Referer 允许列表检查
- **CORS:** 显式来源允许列表,支持可选的正则表达式
- **速率限制:** SlowAPI(每小时 10 次上传每分钟 5 次登录)
- **输入验证:** 文件名过滤、大小限制、后缀名允许列表
- **证据完整性:** 带有篡改检测验证的 HMAC 签名审计日志
- **隐私保护:** API 响应中对 PII(IMEI/MAC/OTP)进行脱敏
- **沙箱隔离:** 一次性模拟器,尽力清理,不修改 APK
## 局限性(客观评估)
1. **未拦截 HTTPS C2 通信** —— 仅限 DNS 和明文 HTTP;不对加密流量进行解码(设计上不含 TLS MITM)
2. **固定的观察窗口** —— 延时或基于触发的 Payload 可能不会在 30-120 秒的运行中被激活
3. **可被模拟器检测** —— 复杂的恶意软件能够检测到沙箱并保持潜伏(会被标记为反分析行为,但无法观测到实际 Payload)
4. **启发式评分** —— 非 ML/AI;属于基于确定性的规则关联
5. **DNS 噪音** —— Sinkhole 会捕获所有模拟器流量,包括操作系统的后台请求;尚未过滤为仅针对特定应用
6. **需要可 Root 的模拟器** —— DNS/HTTP 重定向需要使用 `adb root`(必须使用 google_apis 镜像,而非 google_apis_playstore)
## 未来路线图
- [ ] 利用沙箱 CA 进行 TLS 拦截,以实现对加密 C2 流量的可见性
- [ ] 从特定应用的查询中过滤掉操作系统级别的 DNS 噪音
- [ ] 在已标注的恶意软件语料库上训练基于机器学习的威胁分类模型
- [ ] 多 AVD 配置文件(不同的 API 级别、制造商)
- [ ] Docker 容器化以实现便携式部署
- [ ] 真实设备沙箱支持(已 Root 的物理手机)
- [ ] 基于样本聚类自动化生成 YARA 规则
## 许可证
本项目为 CID 网络犯罪黑客松开发。许可条款待定 (TBD)。
## 作者
由 Malware Whisperer 团队构建。
标签:AV绕过, FastAPI, React, Syscalls, 动态沙箱, 威胁情报, 安全取证, 安卓恶意软件分析, 开发者工具