2,008
stars
+0
165
forks
2
watchers
–
prs
–
issues
10
releases
–
discussions
README
███╗ ██╗ ██████╗ ██╗██████╗
████╗ ██║██╔═══██╗██║██╔══██╗
██╔██╗ ██║██║ ██║██║██████╔╝
██║╚██╗██║██║ ██║██║██╔══██╗
██║ ╚████║╚██████╔╝██║██║ ██║
╚═╝ ╚═══╝ ╚═════╝ ╚═╝╚═╝ ╚═╝
NOIR
!platforms
把「这台手机到底能泄露什么」变成一份可复现的报告。
NOIR 是一个跑在电脑上的审计工具,通过 adb 读取已连接 Android 设备的应用清单、权限和 APK 里的网络端点,给出分类、风险评分和可执行的处置建议。它也可以在需要时调用 jadx 对单个应用做反编译和关键字检索。
定位:审计与自我防护。面向自己的设备、自己的应用、已授权的安全研究。
官网 / Website: https://verlintas.dev/noir/ · 中文
AtomGit G-Star 项目 / Mirror: https://atomgit.com/Verlintas/NOIR
---
它做什么
1. 盘点:列出所有「有网络权限 + 敏感权限」的应用,以及它们各自拿到了什么。
2. 抽取端点:在设备端用 unzip + strings 从每个 APK 的 dex 里提取 URL,只回传几 KB,不把整包拉回电脑。
3. 分类与打分:按包名和域名识别厂商(Xiaomi / Google / 腾讯 / 高德 …)与类别(遥测、广告、定位、输入法 …),结合权限和上报端点计算风险分。
4. 数据关联:把权限翻译成"能拿到什么数据"(位置/通讯录/短信/通话/麦克风/相机/屏幕/应用列表/设备标识/文件/日历/账号),再和上报域名配对,得出"哪类数据可能流向哪里"。
5. 共享 UID:识别 android.uid.system 这类共享用户,列出哪些包实际上共享同一套权限并集。
6. 清单层:解析 AndroidManifest.xml 二进制 AXML,找出没有权限保护的导出组件、明文流量、备份、debuggable、targetSdk。
7. 给建议:区分「可安全自动执行」「需人工确认」「不建议动」,并为每条动作生成回滚命令。
8. 必要时深挖:deep 会把一个应用的基础 APK 和 split APK 拉到本地,用 jadx 反编译后检索 Runtime.getRuntime().exec、setApplicationEnabledSetting、DexClassLoader、MediaProjection 等高风险调用。
它不做什么
- 不联网、不上传任何数据、不需要账号。
- 不修改系统分区,不需要 root。
- 默认不会卸载任何东西;只有 noir deepscan --purge 会逐个确认卸载高风险用户应用。
---
第一次运行
bash
noir
不带参数会进入向导:
1. 检查 adb,没有就问你要不要自动下载(~/.noir/tools)
2. 检查设备,没有就打印开发者模式 / USB 调试的开通步骤,然后等你插线(最多 180 秒)
3. 问一句「开始扫描?」,扫完直接出仪表盘
4. 问一句「执行安全处置?」,y 就执行,并写好回滚文件
全程只会问两三个 y/n,其余都是自动的。
环境自检
bash
noir doctor
NOIR doctor
platform Mac OS X aarch64
java 17.0.19
adb /opt/homebrew/.../platform-tools/adb
Version 37.0.1-15733141
device 178b0d2f device 2509FPN0BC
jadx /opt/homebrew/bin/jadx
bash
noir setup 缺什么下什么
noir setup --yes 不询问,适合脚本
出现问题时
所有错误都会带「怎么办」,而不是抛异常栈:
╭─ ERROR ──────────────────────────────────────────────────────────╮
│ 指定的 adb 不存在:/nonexistent/adb │
├──────────────────────────────────────────────────────────────────┤
│ 检查路径,或运行 noir setup 自动安装。 │
╰──────────────────────────────────────────────────────────────────╯
没有设备时给出的是可执行步骤:
╭─ 没有检测到设备 ──────────────────────────────────────────────╮
│ 1. 打开开发者模式 │
│ 小米 / HyperOS:设置 → 我的设备 → 全部参数 → 连点「MIUI 版本」7 次
│ 2. 开启 USB 调试:设置 → 系统 → 开发者选项 → USB 调试 │
│ 3. 插线后手机弹「允许 USB 调试吗?」→ 勾选「一律允许」 │
│ 4. 还不行就换一根数据线(很多线只能充电) │
╰──────────────────────────────────────────────────────────────╯
已连接但没授权时,会单独提示「撤销 USB 调试授权后重插」。
支持平台
| 系统 | 状态 |
|---|---|
| macOS (Intel / Apple Silicon) | ✅ |
| Windows 10 / 11 | ✅ |
| Debian / Ubuntu | ✅ |
依赖:
- JDK 17+
- Android platform-tools(adb)
- jadx(仅 deep 命令需要)
程序会自动在常见安装位置查找 adb 和 jadx;找不到时可以用 --adb / --jadx 指定。
bash
macOS
brew install --cask android-platform-tools jadx
Debian / Ubuntu
sudo apt install adb
jadx: https://github.com/skylot/jadx/releases
Windows (scoop)
scoop install adb jadx
---