adrbn/nt30-airplay-guide

GitHub: adrbn/nt30-airplay-guide

一份针对 Nonete NT30 Allwinner H713 投影仪的逆向工程指南,通过 root 设备并替换投屏接收器来实现 macOS AirPlay 屏幕镜像,同时修复 Wi-Fi、蓝牙、时钟等问题。

Stars: 0 | Forks: 0

# Root 与修复 Nonete NT30 投影仪 — 并让 macOS AirPlay 正常工作 **关于一款廉价 Allwinner H713 / Android 11 智能投影仪的实战指南:获取 root 权限,审计灰产投屏固件,修复无线模块与时钟,以及——重头戏——让真正的 macOS 桌面屏幕镜像正常工作。** 这是我针对自有设备进行的独立逆向工程,出于维修和安全清理的目的。 这里的一切都可以通过本仓库中的脚本和 Magisk 模块重现,并且 所有操作都是可逆的。这是为社区编写的——如果您拥有同款投影仪, 非常欢迎提出更正和 PR。 最重磅的是:**原生的 macOS AirPlay 屏幕镜像可以工作了。** 并不是通过逆向工程破解 OEM 接收器(那已被证明是死胡同——见下文),而是通过*替换*它。只需一个 `adb install`, 一个 `pm disable-user`,外加一个显示设置。 ## TL;DR — 目前可用的功能 | 功能 | 状态 | 方式 | | --- | --- | --- | | iPhone 屏幕镜像 | ✅ 可用 | OEM 接收器,或 AirScreen | | **macOS 桌面镜像** | ✅ **可用** | **AirScreen** (`com.ionitech.airscreen`),禁用 OEM 接收器 | | iPhone AirPlay 视频 / 音频 | ✅ 可用 | OEM 接收器 | | Wi-Fi (扫描/关联) | ✅ 已修复且持久化 | `fix.sh wifi` + Magisk 模块 | | Bluetooth | ✅ 已修复且持久化 | 通过 prop.default overlay 设置 `bt_mode=dual` | | 系统时钟 / TLS (通过 AirPlay 播放 YouTube) | ✅ 已修复且持久化 | NTP + 时区锁定(此板子无 RTC) | | 遥测 / 回传中间件 | ✅ 已中和(可逆) | `fix.sh debloat` | | `su` 后门 → 托管 root | ✅ `boot_a` 上的 Magisk 28.1 | 重启后依然有效 | | Mac -> 投影仪视频文件 | ✅ 可用 | 绕过 DLNA / HLS | **关于 macOS 成功方案的真实局限:** - AirScreen **免费版将镜像上限锁定在 ~720p**(1080p+ 需要 Premium)。 - 免费版**包含广告**(内置 AdMob / Facebook SDK)。 - 来自 Mac 的 AirPlay 是**屏幕镜像**,而不是类似 Chromecast 的应用接力——这个盒子 *并不是* Google Cast / Spotify Connect 的目标设备。 - 在 **OEM** 协议栈上实现原生 macOS 镜像仍然不可能(已查明根本原因,请参阅 [TECHNICAL.md](docs/TECHNICAL.md) §8.1 / §8.1a)。我们是绕过它,而不是修复它。 ## 设备 - **SoC:** Allwinner **H713**("ares" TV/投影仪产品线),四核 Cortex-A53 + Mali GPU,32 位 用户空间 (`armeabi-v7a`)。 - **OS:** Android **11** (`RP1A.201005.006`),kernel **5.4.99**,安全补丁 2022-02-05。 - **伪造的身份:** 系统镜像将自己报告为 Google **`ADT-3`**(Android TV 开发套件)以通过 GMS 认证并搭载 Play Services;而厂商镜像则吐露实情—— `Allwinner/h713_tuna_p3`,由 "hotack" 构建。 - **Wi-Fi/BT:** AICSemi **AIC8800** (`aic8800d80`) 通过 SDIO 连接 — 这是大多数 Wi-Fi 不稳定的根本原因。 - **核心洞察:** 它不是什么神奇的 AirPlay 设备。**它仅仅是拥有了 root 权限的 Android 11 以及 Play Services** — 所以你可以用一个*不同的* AirPlay 接收器来替换坏掉的那个。 ## 访问模型 下面的每条命令都是通过远程 adb 链发出的,因此整个过程无需坐在投影仪前即可 驱动完成: ``` Mac ──(Tailscale)──▶ adb-host (Linux host) ──adb──▶ NT30 ``` `adb-host` 是 tailnet 上一台通过 USB 连接投影仪的个人主机。(macOS 修复中第 4 步里的 mDNS/AirPlay 步骤仍然需要 Mac 与投影仪在**同一局域网**内。) ## 快速开始 ### 1. 获取 root 权限 固件在 `/system/bin/wifi` 处附带了一个 setuid-root 二进制文件,它实际上就是**重命名的 `su`** (这是一种出厂便利做法 — 它的帮助字符串是 `usage: su [WHO [COMMAND...]]`)。这就是你的 root 权限,在运行时获取,无需刷机: ``` /system/bin/wifi root /system/bin/sh -p # interactive root shell /system/bin/wifi root /system/bin/sh -p FILE # run a script as root ``` ### 2. 运行修复脚本 ``` cd scripts ./fix.sh all # wifi + bt + airplay + time + status ./fix.sh status # inspect current state at any time ./fix.sh audit # read-only inventory of middleware + open sockets ``` `fix.sh all` 修复的内容:卡死的 `wpa_supplicant` + 霸占无线模块的 Miracast (Wi-Fi), `bt_mode=source→dual` (Bluetooth),AirPlay mDNS 重新发布,以及——价值最高、操作最少的 ——**时钟**:该主板**没有电池供电的 RTC**,因此它启动时会使用陈旧的日期,导致 每次 HTTPS 握手都失败("cert not yet valid")。该修复设置了时区 + `auto_time=1` + NTP。 ### 3. 使 root 与修复持久化 (Magisk) 运行时 root 适合实时修复,但不具备持久性。我们使用 **Magisk 28.1**(无头模式,`armeabi-v7a` 二进制文件 — 32 位用户空间)修补了 `boot_a`,并用 `dd` 进行了刷入。AVB 报告 `device_state=locked`,但在该设备上实际验证为**宽容模式**:修补后的 boot 正常启动,没有红屏警告,也没有清除数据。原版与修补版镜像均已备份以便回滚。完整步骤见 [TECHNICAL.md](docs/TECHNICAL.md) §9。 然后安装 **`nt30_airplay_fixer` (v2)** 模块,让修复在重启后依然生效: ``` magisk --install-module /data/local/tmp/nt30_airplay_fixer-v2.zip ``` 该模块(`magisk-module/)执行了三个 init 曾经在每次启动时都会破坏的持久化操作: - **`system/etc/prop.default` overlay** → `bt_mode=dual`,`factory_test=0`,`miracast.state=0` 由 init 自身加载(消除了 `resetprop` 与厂商服务的竞态条件)。 - **`libexplay.so` 2字节补丁** (`AppleTV3,2 → AppleTV6,2`) 以便让 macOS 甚至愿意*提供*镜像 菜单项。 - **`service.sh`** 开机后:锁定时区/NTP,禁用 `wifi_display`,强制停止 Miracast 接收器,并重新启用 mphotool 投屏应用。 ### 4. macOS 镜像修复 (AirScreen) ★ 这是最关键的步骤。**不要**尝试修复 OEM 接收器——它是一个源自 Shairport 的克隆,由于两个独立的底层原因无法支持 macOS(缺少用于视频投屏的 `/pair-pin-start` HAP 配对端点;在镜像帧的传输路径上 `fairplay_decrypt` 从未被调用 → 导致加密乱码进入 Allwinner 解码器 → 陷入无限的 `recreateVideoPlayer()` 循环)。取而代之的是,安装一个*能够*做到这一点的接收器:**AirScreen**。 **a. 获取 APK 并验证其真实性:** ``` brew install apkeep apkeep -a com.ionitech.airscreen -d apk-pure ./airscreen # 存在 32-bit libs (H713 仅限 armeabi-v7a): unzip -l airscreen/com.ionitech.airscreen.apk | grep -E 'armeabi-v7a' # signer 必须为 CN=AirScreen, OU=IoniTech: unzip -p airscreen/com.ionitech.airscreen.apk META-INF/CERT.RSA \ | openssl pkcs7 -inform DER -print_certs -noout ``` **b. 安装它(预先授予运行时权限):** ``` adb -s install -r -g airscreen/com.ionitech.airscreen.apk adb -s shell pm path com.ionitech.airscreen # confirm installed ``` **c. 将 AirPlay 端口移交给 AirScreen**(可逆——OEM 应用占用着 TCP `:7000`): ``` adb -s shell pm disable-user --user 0 com.mphotool.airplay adb -s shell am force-stop com.mphotool.airplay adb -s shell monkey -p com.ionitech.airscreen -c android.intent.category.LAUNCHER 1 adb -s shell 'netstat -tlnp | grep -E ":7000|:5000"' # both now held by AirScreen ``` **d. 从 Mac 连接——唯一真正需要注意的坑:** **结果:** 通过原生 AirPlay 实现完整的 Mac 桌面镜像;iPhone 仍然可用(现在通过 AirScreen)。在 logcat 中已确认:Allwinner `cedarc` H.264 解码器成功解码了 Mac 的流—— 这与 OEM 失败的现象截然相反。随时可以通过 `pm enable com.mphotool.airplay` 还原。完整解析:[AIRSCREEN-SOLUTION.md](docs/AIRSCREEN-SOLUTION.md)。 ## 仓库结构 ``` nt30-airplay-guide/ ├── docs/ │ ├── TECHNICAL.md # full deep-dive: hardware, root, security audit, Magisk, OEM dead-end │ ├── TECHNICAL.fr.md # French version │ ├── AIRSCREEN-SOLUTION.md # the macOS mirroring win │ └── CASTING-WORKAROUNDS.md # DLNA / HLS Mac→projector casting ├── scripts/ │ ├── fix.sh # all|wifi|bt|airplay|time|status|audit|debloat|restore-bloat │ ├── run.sh # DLNA/HLS caster: start|file|screen|audio|status|stop │ ├── common.sh # shared helpers │ ├── audio.sh screen.sh file.sh # DLNA/HLS mode implementations │ ├── nt30_audit.sh nt30_backdoor.sh # security audit helpers │ ├── nt30_fix.sh nt30_fix2.sh # earlier fix iterations │ └── web.py # tiny HTTP server (+ hls.js) for the HLS path └── magisk-module/ ├── module.prop # nt30_airplay_fixer v2 metadata └── service.sh # post-boot pins (tz, NTP, miracast off, cast apps on) ``` ## 文档 - **[docs/TECHNICAL.md](docs/TECHNICAL.md)** — 深入剖析。硬件与分区映射, 作为 `wifi` 的 `su` 获取 root,灰产投屏协议栈,完整的安全审计(Tencent/Baidu 遥测,IOCs,LAN 监听面),Magisk 持久化,以及在根本原因上证明 在 OEM 二进制文件上实现原生 macOS AirPlay 是不可能的。 - **[docs/AIRSCREEN-SOLUTION.md](docs/AIRSCREEN-SOLUTION.md)** — 成功方案:替换接收器 以实现 macOS 镜像。 - **[docs/CASTING-WORKAROUNDS.md](docs/CASTING-WORKAROUNDS.md)** — 从 Mac 进行 DLNA/HLS 投屏(miniDLNA + `ffmpeg` + BlackHole),用于传输视频文件或独立于 AirPlay 的屏幕绕过方案。 ## 安全性、可逆性与免责声明 本仓库中的所有操作都是**可逆的**: - `fix.sh debloat` 会禁用遥测中间件,但可以通过 `fix.sh restore-bloat` 撤销。 - AirScreen 的替换可以通过 `pm enable com.mphotool.airplay` 撤销(也可以选择卸载 AirScreen)。 - 原版和经过 Magisk 修补的 `boot_a` 镜像均已备份以供回滚。 这里的所有工作都是在**我自己的硬件**上进行的,目的是为了维修和安全清理。 获取 root 权限、刷机和旁加载可能会导致设备变砖或使保修失效——风险自负, 并且不要在你不拥有的硬件上运行任何这些操作。与 Nonete、 Allwinner、AirScreen/IoniTech 或 Apple 没有任何关联。欢迎更正和提交 PR。 ## 许可证 代码(脚本,Magisk 模块源代码)在 [MIT License](LICENSE) 下发布。 `docs/` 中的文字内容是对第三方产品的逆向工程研究和评论, 发布是出于互操作性和安全清理的目的。此处不重新分发任何专有固件、 二进制文件或 APK。
标签:AirPlay投屏, Cutter, Magisk, 云资产清单, 安卓系统优化, 智能硬件修复, 服务器监控, 物联网设备调试, 逆向工具, 逆向工程