Rayhunter on PinePhone:在 Quectel EG25-G 调制解调器上部署蜂窝站点模拟器检测器
【免费下载链接】rayhunterRust tool to detect cell site simulators on an orbic mobile hotspot项目地址: https://gitcode.com/GitHub_Trending/ra/rayhunter
本文讲解 Rayhunter 在 PinePhone / PinePhone Pro 上的部署方式:基于 Quectel EG25-G LTE 模块(内置 Qualcomm mdm9607 基带)的硬件背景、完整支持的 LTE 频段表、安装与 adb 转发访问流程,以及启用/关闭 adb 的 AT 命令原理、modem 重启陷阱与 ModemManager 占用 AT 口的排障方法。读完本文,你可以在 PinePhone 上独立完成 Rayhunter 安装、通过adb forward访问 Web UI、进入 modem shell,并理解安装器源码中的 QADBKEY 解锁与AT+QCFG="usbcfg"切换机制。
硬件背景:为什么 PinePhone 能运行 Rayhunter
PinePhone 和 PinePhone Pro 都使用 Quectel EG25-G LTE 模块,其中搭载Qualcomm mdm9607 调制解调器。EG25-G 的两个特性决定了它适合运行 Rayhunter:
- 全球 LTE 频段支持:模块覆盖下文表格中的大部分全球频段,便于在不同地区的网络中部署;
- 内置 GNSS 定位模块:Rayhunter 目前并不直接使用 GNSS,这一能力仅作为硬件背景。
该调制解调器完全具备运行 Rayhunter 的能力,但自身没有显示屏,也没有网络接口,因此 Rayhunter 的 Web UI 无法像 Orbic、TP-Link 那样直接通过 Wi-Fi 或管理 IP 访问。它通过 AT 命令接口对外暴露,安装器可以经由该接口发送命令,甚至启用 adb(pinephone-start-adb/pinephone-stop-adb工具就是基于这一路径实现的)。
在 Rayhunter 的设备枚举中,PinePhone 是一等公民,见 lib/src/lib.rs 中的Device::Pinephone变体;在 doc/supported-devices.md 中,PinePhone / PinePhone Pro 被列为"Functional devices"(已确认可用)档位,推荐区域为 Global。
支持的 LTE 频段
EG25-G 的完整支持频段表(继承自官方文档 doc/pinephone.md):
| Band | Frequency |
|---|---|
| 1 | 2100 MHz (IMT) |
| 2 | 1900 MHz (PCS) |
| 3 | 1800 MHz (DCS) |
| 4 | 1700 MHz (AWS-1) |
| 5 | 850 MHz (CLR) |
| 7 | 2600 MHz (IMT-E) |
| 8 | 900 MHz (E-GSM) |
| 12 | 700 MHz (LSMH) |
| 13 | 700 MHz (USMH) |
| 18 | 850 MHz (LSMH) |
| 19 | 850 MHz (L800) |
| 20 | 800 MHz (DD) |
| 25 | 1900 MHz (E-PCS) |
| 26 | 850 MHz (E-CLR) |
| 28 | 700 MHz (APT) |
| 38 | 2600 MHz (IMT-E) |
| 39 | 850 MHz (E-CLR) |
| 40 | 2300 MHz (S-Band) |
| 41 | 2500 MHz (BRS) |
注意:Quectel EG25-G不支持 LTE band 48(CBRS 3500 MHz),该频段在美国用于无许可的 4G/5G 连接。如果你的目标网络主要运行在 CBRS 频段,PinePhone 无法作为 Rayhunter 载体。
安装
PinePhone 的安装方式与其他 Rayhunter 安装器有一个关键区别:必须在 PinePhone 自身的 shell 中下载并解压安装器,然后在设备本地运行,而不是在宿主机上远程推送。
./installer pinephone从源码看,该命令对应 installer/src/lib.rs 中的Command::Pinephone子命令,调用 installer/src/pinephone.rs 的install()函数。安装流程的实际步骤如下:
- 解锁 modem:通过 USB AT 接口发送命令启用 adb(
start_adb()),等待 3 秒后建立 ADB USB 连接; - 通过 adb 写入文件:
mount -o remount,rw /将根文件系统重挂载为可写;mkdir -p /data/rayhunter创建数据目录;- 推送
rayhunter-daemon二进制到/data/rayhunter/rayhunter-daemon; - 生成
config.toml——从通用模板config.toml.in中把占位注释#device = "orbic"替换为device = "pinephone",使守护进程识别设备类型; - 推送开机自启脚本
/etc/init.d/rayhunter_daemon与/etc/init.d/misc-daemon,并分别chmod 755;
- 重启 modem:
shutdown -r -t 1 now,等待约 30 秒启动; - 再次解锁并验证:重新
start_adb(),然后执行test_rayhunter冒烟测试,确认 Web 接口可访问。
实现细节上,安装器对每个 adb shell 命令都追加; echo exit code $?并校验输出(run_command_expect,见 installer/src/pinephone.rs);由于 modem 的 legacy adbd 会重新解析 argv,命令体需要额外加引号,否则mkdir -p /data/rayhunter这类带参数的命令会被拆散(源码注释中引用了 EFForg/rayhunter#1056,见 installer/src/pinephone.rs)。文件推送采用"先传/tmp、md5sum 校验、再mv到目标位置"的两段式策略,避免半写入状态(installer/src/pinephone.rs)。
访问 Rayhunter
由于 modem 没有自己的显示屏和网络接口,在 PinePhone 上只能通过TCP over adb 转发访问 Rayhunter:
adb forward tcp:8080 tcp:8080转发会随 adb 连接断开而丢失:这条 forward 绑定到 modem 的 adb 连接上,每当该连接重新建立(例如 modem 复位后),转发就会失效。此时adb devices仍会列出 modem、Rayhunter 也仍在录制,但 Web UI 不再响应。恢复方法:
adb forward --list # 输出为空说明转发已丢失 adb forward tcp:8080 tcp:8080Shell 访问
使用安装器工具启用 adb 后,即可进入 modem shell:
./installer util pinephone-start-adb adb shell省电:禁用 adb
adb 处于启用状态时,即使 Rayhunter 已停止,modem 也无法进入休眠(省电)状态。不需要调试时,用以下命令关闭 adb 以恢复省电:
./installer util pinephone-stop-adb原理剖析:start_adb 与 stop_adb 的 AT 命令流程
安装器通过直接操作 modem 的 USB 接口收发 AT 命令。从 installer/src/pinephone.rs 可以看到关键实现:
- USB 标识:modem 的 Vendor ID 为
0x2C7C,Product ID 为0x125,AT 串口位于USB 接口编号 2(installer/src/pinephone.rs)。serial_interface()通过detach_and_claim_interface(2)夺取该接口——这正是下文 "Resource busy" 错误的来源。 - 解锁密钥:
start_adb()先发AT+QADBKEY?读取 8 字节 salt,计算md5crypt("SH_adb_quectel", salt)并截取第 12–28 字符,再发AT+QADBKEY="<hashed>"解锁——这是源码注释中标注的 "qadbkey-unlock.c 的重新实现"(installer/src/pinephone.rs)。 - 切换 USB 组成:解锁后发送
AT+QCFG="usbcfg",...命令,格式为 vendor ID、product ID 加 7 个功能位(diag、nmea、at、modem、net、adb、audio)。Qusbcfg::default()中adb = 0(锁定状态),start_adb将其置为 1(installer/src/pinephone.rs)。单元测试test_qadbcfg_fmt验证了默认命令串为:
AT+QCFG="usbcfg",0x2C7C,0x125,1,1,1,1,1,0,0- AT 命令收发:通过 USB 控制请求(
Class/Interface,request0x22,value 3)启用串口,再经 bulk out(端点0x3)写入命令、bulk in(端点0x84)读取响应,超时 1 秒(installer/src/pinephone.rs)。
注意:切换 adb 会重启 modem
pinephone-start-adb与pinephone-stop-adb都通过AT+QCFG="usbcfg"修改 modem 的 USB 组成,而modem 在该值被写入时总会复位——即使请求的组成与当前完全相同。modem 复位后需要约一分钟才能完成启动,期间手机没有蜂窝服务。
编写自动化脚本时必须考虑这一点:
- 只在 adb 确实未启用时才调用
pinephone-start-adb; - 给 modem 留足约一分钟的启动时间再重试后续操作;
- 切勿在短于 modem 启动时间的重试循环中反复调用
pinephone-start-adb——那会让 modem 陷入永久性重启循环。此状态下 ModemManager 的 QMI 探测永远无法完成,日志出现:
port cdc-wdm0 timed out N consecutive times modem couldn't be initialized: Failed to load current capabilities手机将完全失去移动数据,直到 modem 被静置足够长时间完成启动。
启用 adb 时出现Resource busy
在由ModemManager(或eg25-manager等其他 modem 守护进程)管理 EG25-G 的发行版上,这些守护进程会先于安装器占用 AT 接口,导致启用 adb 失败:
Failed to start adb on the PinePhone's modem Caused by: 0: detach_and_claim_interface({USB_INTERFACE_NUMBER}) failed 1: Resource busy (os error 16)这与源码中serial_interface()的detach_and_claim_interface(USB_INTERFACE_NUMBER)调用完全对应(installer/src/pinephone.rs)——接口被守护进程 claim,无法脱离。
解决方法:在调用期间临时停止守护进程,之后再恢复。由于 usbcfg 写入本身就会触发 modem 复位,ModemManager 恢复后会自动重新探测 modem:
sudo systemctl stop ModemManager sudo ./installer util pinephone-start-adb sudo systemctl start ModemManager小结
- PinePhone / PinePhone Pro 的 EG25-G 模块(Qualcomm mdm9607)可完整运行 Rayhunter,但载体是modem 本身:Rayhunter 安装在 modem 文件系统内,经 USB/adb 访问;
- 安装命令
./installer pinephone必须在PinePhone 本地 shell中执行; - 访问 Web UI 依赖
adb forward tcp:8080 tcp:8080,modem 复位后需重新执行; - adb 开启会阻止 modem 省电;
start-adb/stop-adb均会触发 modem 复位(约一分钟无信号),脚本化时要避免快速重试; - 遇到
Resource busy时,先systemctl stop ModemManager再启用 adb。
相关文档可参考 doc/pinephone.md 原始设备页、doc/supported-devices.md 设备总表与 doc/installing-from-source.md 的从源码构建说明(其中提到 USB 系安装器orbic-usb、pinephone等需要 libusb/ADB 支持)。
【免费下载链接】rayhunterRust tool to detect cell site simulators on an orbic mobile hotspot项目地址: https://gitcode.com/GitHub_Trending/ra/rayhunter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考