夜雨聆风学习资料网

ARTICLE · 1312631

NOIR:查清手机里的 App 把数据发给了谁

NOIR:查清手机里的 App 把数据发给了谁

每日开源 · 2026-11-05

NOIR 是一个 Android 隐私审计工具,用 adb 扫出应用权限、上报端点与数据流向

手机上装了八十个应用,谁在往外发东西

这个问题大部分人答不上来。权限管理只告诉你「这个应用有定位权限」,不告诉你定位发去了哪;商店的隐私标签是开发者自己填的,填错也没人核。

于是「去广告」和「隐私保护」混在了一起:大家下各种清理工具,操作完清爽了,但没人知道到底关掉了什么、有没有关错。

NOIR 站的位置不太一样。它不清理,它出证据。

它是什么

NOIR 是一个跑在电脑上的 Android 审计工具。手机插上线,它通过 adb 读取应用清单、权限、APK 里的网络端点,做分类、打分、给处置建议;需要深挖时调 jadx 反编译单个应用。

2,009 星,165 fork,2026-10-31 建库——4 天。Kotlin 写的,MIT 协议,最新 v0.2.6(2026-11-04)。支持 macOS、Windows 10/11、Debian/Ubuntu。

它自己在 README 里把定位写得很直白:审计与自我防护,面向自己的设备、自己的应用、已授权的安全研究。

这句话决定了下面所有的取舍。

定位一:它不是清理工具

大多数「手机优化」应用的做法是扫描、发现、一键处理。用户得到结果,得不到解释。

NOIR 反过来:默认完全只读。

它不加 --apply 就只输出报告,什么都不会改。加了 --apply,也只动 app-ops 级别的开关;要卸载应用,必须显式再加 --aggressive。

更关键的是它处理「后果」的方式。每一条建议分三级:

  • 可安全自动执行:app-ops 级别的调整,随时能改回来;
  • 需人工确认:会影响到功能的;
  • 不建议动:系统应用这类,--user 0 卸载也会被 OTA 或恢复出厂装回来。

每条动作都生成回滚命令写进 rollback.txt;执行过的命令、退出码和完整输出进 applied.txt。

这个设计假设自己可能会做错,所以每一步都留了退路。

定位二:它不是抓包工具

想搞清楚「应用到底发了什么」,标准答案是抓包:装证书、配代理、解 TLS。这条路麻烦,很多应用还做了证书固定,抓不到。

NOIR 走的是静态路线:从 APK 的 dex 里抽 URL 字符串。

这个做法决定了它能不能用在低配手机上:端点抽取在设备端完成。它通过 adb shell 在手机里跑 unzip | strings | grep,只把几 KB 的结果传回电脑,不把几百个 APK 拉回来。设备上缺 unzip 或 strings 时,才退化成在本地解析。

这件事的代价要讲清楚:静态证据只能证明「代码里有这个端点」,不能证明「这次真的发出去了」。

README 的免责声明原话就是这个意思——它给出的是「这个应用具备这个能力,并且代码里有这个端点」,不能证明某次具体传输发生过。

这是它和抓包工具之间不能跨的线。想证明某次传输,还得看网络层。

定位三:它不是拦截工具

扫完之后,你会拿到四个域名清单:

文件 内容 怎么用
domains-trackers.txt 统计、广告、崩溃上报 可以整份导入
domains-other.txt 用途不明 导入前逐条判断
domains-functional.txt 推送、登录、更新、支付、商店、云同步 禁止拦截
domains.txt 等于 trackers,兼容旧脚本 —

注意第三个。它把「拦了会掉功能」的域名单独列出来,不是让你一起拦。

而且它只导出,不执行:跨平台改 DNS 很容易把设备网断掉,作者在开发中踩过。

这就是定位的第三层:它不替你做决定,只把决定所需的信息整理好。 会把「哪些不能拦」标出来的工具,和「一键去广告」是两种东西。

它实际做了什么

扫描分五步:

  1. 盘点:列出所有「有网络权限 + 敏感权限」的应用,以及各自拿到了什么。
  2. 抽端点:从每个 APK 的 dex 里提 URL,只回传结果。
  3. 分类打分:按包名和域名识别厂商(小米、Google、腾讯、高德等)与类别(遥测、广告、定位、输入法),结合权限和端点算风险分。
  4. 数据关联:把权限翻译成「能拿到什么数据」——位置、通讯录、短信、通话、麦克风、相机、屏幕、应用列表、设备标识、文件、日历、账号——再和上报域名配对,得出「哪类数据可能流向哪里」。
  5. 清单层:解析二进制的 AndroidManifest.xml,找没有权限保护的导出组件、明文流量、备份、debuggable、targetSdk。

第 4 步最有价值。「有定位权限」和「定位数据发到了这个域名」是两条独立信息,配起来才有意义。

第 5 步有个细节:android.uid.system 下常挂 50 多个应用,权限记在 dumpsys package 尾部的 Shared users 段,解析器要合并回每个包,否则最该被看见的系统应用反而会从报告里消失。

怎么跑

第一次直接敲 noir 就进向导:检查 adb(没有就问你要不要自动下载到 ~/.noir/tools)、检查设备(没有就打印开发者模式和 USB 调试的开通步骤,然后等你插线,最多 180 秒)、问一句「开始扫描?」、扫完出仪表盘、再问一句「执行这 19 条安全处置?」。全程两三个 y/n,其余自动。

常用命令:

noir scan                  # 全量扫描,输出 JSON / Markdown / 域名清单
noir ui                    # 扫完渲染成终端仪表盘
noir auto --apply          # 执行安全的 appops 动作(可回滚)
noir deep com.example.app   # 拉包 + jadx + 关键字检索
noir deepscan --top 30     # 批量反编译风险最高的 30 个

依赖是 JDK 17+ 与 Android platform-tools,jadx 只有 deep/deepscan 用得着。不想装 Java 就下 portable 包,自带运行时。

边界与风险

第一,静态证据不是事实。 前面说过,再强调一次:它能说「有端点」,不能说「发出去了」,拿它当「我手机被偷数据了」的证据会过度解读。

第二,识别靠规则库。 没收录的域名会落到「用途不明」,规则更新速度取决于项目后续。

第三,报告本身是敏感文件。 里面有设备上的包名和端点,分享前自己看一眼。它不联网不埋点,唯一对外请求是 noir setup 下载 adb 与 jadx。

第四,只支持 Android。 审计逻辑依赖 dumpsys 和 APK 格式,iOS 不支持,README 明确写了。

第五,4 天的新项目,v0.2.x。 版本号说明它还在早期,规则和输出格式都可能变。

判断

NOIR 值得看的不是功能列表,是它把自己限定成了一个「出证据」的工具:

  • 不自动卸载(除非你显式要求再加上 --aggressive)
  • 不改系统分区,不要 root
  • 不联网、不上传、不要账号
  • DNS 只导出不执行,还把「不能拦」的那份单独标出来
  • 每条动作带回滚

这五条加起来,是一个清晰的产品判断:用户要的不是「帮我处理」,是「让我知道处理什么」。

适合谁:想搞清楚自己手机里哪些应用在连哪些域名的人;做 Android 应用、想知道自己的包暴露了什么的人;以及做安全研究、需要一个可复现报告的人。

不适合谁:想要一键清爽的人——它给完建议还要你自己确认;想抓包看具体请求内容的人——它不做那一层;用 iPhone 的人。

项目地址:https://github.com/Verlintas/NOIR

开源协议:MIT

数据截至 2026-11-05:2,009 stars / 165 forks / Kotlin / v0.2.6


创作来源声明

本文由 AI 生成:选题、初稿、排版与封面均出自自动化流程。文中的项目信息、star 数、协议与版本取自 GitHub API 和项目官方仓库、官方文档,数据截至文末标注日期;官方口径的性能与效果描述已在正文中单独标注来源。文中不含作者实测数据,也未进行实际部署验证。

如有事实错误或版本过期,欢迎留言指出,我会核实后更正。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料