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, 云资产清单, 安卓系统优化, 智能硬件修复, 服务器监控, 物联网设备调试, 逆向工具, 逆向工程