news 2026/9/17 1:48:36

Rayhunter on PinePhone:在 Quectel EG25-G 调制解调器上部署蜂窝站点模拟器检测器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rayhunter on PinePhone:在 Quectel EG25-G 调制解调器上部署蜂窝站点模拟器检测器

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):

BandFrequency
12100 MHz (IMT)
21900 MHz (PCS)
31800 MHz (DCS)
41700 MHz (AWS-1)
5850 MHz (CLR)
72600 MHz (IMT-E)
8900 MHz (E-GSM)
12700 MHz (LSMH)
13700 MHz (USMH)
18850 MHz (LSMH)
19850 MHz (L800)
20800 MHz (DD)
251900 MHz (E-PCS)
26850 MHz (E-CLR)
28700 MHz (APT)
382600 MHz (IMT-E)
39850 MHz (E-CLR)
402300 MHz (S-Band)
412500 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()函数。安装流程的实际步骤如下:

  1. 解锁 modem:通过 USB AT 接口发送命令启用 adb(start_adb()),等待 3 秒后建立 ADB USB 连接;
  2. 通过 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
  3. 重启 modemshutdown -r -t 1 now,等待约 30 秒启动;
  4. 再次解锁并验证:重新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:8080

Shell 访问

使用安装器工具启用 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-adbpinephone-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-usbpinephone等需要 libusb/ADB 支持)。

【免费下载链接】rayhunterRust tool to detect cell site simulators on an orbic mobile hotspot项目地址: https://gitcode.com/GitHub_Trending/ra/rayhunter

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 1:47:13

PB级数据平台容量规划实战与优化策略

1. 数据服务容量规划的核心挑战过去三年&#xff0c;我参与过七个PB级数据平台的容量规划项目&#xff0c;最深刻的体会是&#xff1a;传统经验法则在指数级数据增长面前完全失效。某电商平台在促销季曾因容量预估偏差导致API响应延迟从200ms飙升到8秒&#xff0c;直接损失千万…

作者头像 李华
网站建设 2026/9/17 1:47:11

AI时代程序员的不可替代价值与技能进化

1. 程序员与AI的共生关系解析最近两年&#xff0c;AI代码生成工具的出现确实让不少同行感到焦虑。作为从业15年的全栈工程师&#xff0c;我亲历了从传统开发到AI辅助的转变过程。GitHub Copilot这类工具现在能自动补全整段代码&#xff0c;甚至根据注释生成完整函数&#xff0c…

作者头像 李华
网站建设 2026/9/17 1:47:07

如何把 e900v22d 电视盒子刷成 Armbian 完整实战

如何把 e900v22d 电视盒子刷成 Armbian 完整实战 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568, rk3399, …

作者头像 李华
网站建设 2026/9/17 1:46:32

HBase Shell实战指南:从集群检查到数据操作的核心命令详解

1. 开工之前必看&#xff1a;连接、退出与集群状态检查先说个我自己的场景。有一次线上HBase集群出现RegionServer频繁心跳超时&#xff0c;刚接手的大数据同事跑过来问&#xff1a;到底哪台机器出问题了&#xff1f;你们平时怎么用HBase Shell查的&#xff1f;我一听就明白了&…

作者头像 李华
网站建设 2026/9/17 1:45:32

Maven exec:java报错排查:从default-cli到Caused by的完整指南

1. 报错拆解&#xff1a;exec-maven-plugin 与 default-cli 究竟是谁在说话先把这个报错放回它出现的场景里看。你在 IDEA 里写了一个带 main 方法的类&#xff0c;想在 Maven 项目里快速跑一下&#xff1b;或者在命令行敲了mvn exec:java&#xff1b;又或者用 IDEA 的 Run Any…

作者头像 李华
网站建设 2026/9/17 1:45:28

STM32F105+W5500+双CAN+RS232/485工业通信板设计

简介&#xff1a;一套基于STM32F105R的工业通信控制板完整设计资料&#xff0c;面向嵌入式硬件开发与单片机工程师&#xff0c;集成W5500以太网、CAN、RS232、RS485等多种通信接口&#xff0c;适用于物联网网关、工业数据采集和分布式控制等场景。压缩包内共226个文件&#xff…

作者头像 李华