danusha2345/xgecu-t48-reverse

GitHub: danusha2345/xgecu-t48-reverse

对 XGecu T48 通用编程器的 eMMC(ISP)USB 通信协议进行逆向工程并提供了 Linux 下可用的 Python 读写工具。

Stars: 1 | Forks: 0

# xgecu-t48-reverse 逆向工程的 USB 协议笔记以及一个可用的 Python 工具,用于与 **XGecu T48 (TL866-3G)** 通用编程器进行通信,重点关注 **eMMC** 读写操作(包括在电路/ISP 操作)。 XGecu T48 是一款广受欢迎的通用芯片编程器;其官方软件(`Xgpro`)仅支持 Windows,且该设备的 USB 协议未公开。开源项目 [`minipro`](https://gitlab.com/DavidGriffith/minipro) 涵盖了该协议的经典芯片部分,但明确**未**实现 eMMC。本仓库记录了该协议的 eMMC 扩展——即线路格式(wire-format)的实际样貌——并提供了一个可用的 Python 工具,它使用相同的编码方式,在 Linux 下在线读取和写入 eMMC。 ## 包含内容 - [`docs/PROTOCOL.md`](docs/PROTOCOL.md) — 完整的逆向工程说明:USB 标识(`a466:0a53`, WinUSB),端点角色(EP1 OUT/IN 命令 + EP2 OUT 批量传输),顶层操作码/子操作码层级,eMMC 命令表,初始化流程,RPMB 帧布局,`.alg` 算法文件格式,以及批量传输格式。 - [`docs/ISP_SETTINGS.md`](docs/ISP_SETTINGS.md) — 关于 Xgpro **eMMC ISP 设置**(总线宽度,VCCQ,`ICSP_VCC Enable`,CLK,`Vcc current Imax`,分区,RST_n 接线)的通俗参考指南:解释每个选项的作用以及启用/禁用什么,并与线路抓包进行了交叉验证。俄语版本:[`ISP_SETTINGS.ru.md`](docs/ISP_SETTINGS.ru.md)。 - [`examples/t48_emmc_isp.py`](examples/t48_emmc_isp.py) — **可用的在电路 eMMC 工具。** 通过重放按块地址参数化的捕获协议,经由 XGecu eMMC-ISP 适配器读写任意区域。已在 1-bit / 3.3 V 下通过硬件验证。支持分区选择(`USER` / `BOOT1` / `BOOT2` / `RPMB`),擦除,分区表/文件系统魔数解析,引导扇区往返自检,以及 VCCQ `--voltage {3.3,1.8}`。模式:只读验证(默认,非破坏性),`--write-test`,`--partitions`,`--boot-roundtrip`。包含防卡死(anti-wedge)的拆卸/恢复机制,使得超时不再需要物理重新插拔。 - [`examples/t48_emmc.py`](examples/t48_emmc.py) — ISP 工具所基于的底层传输层:通过 VID:PID 连接到 T48,构建已记录的数据包,并通过高级方法(`switch_partition`, `read_ecsd`, `bulk_read`,RPMB 帧构建器等)进行调用。包含一个离线健全性测试,用于验证解码出的三个 CMD6 SWITCH 参数是否与在 `Xgpro.exe` 中观察到的字节相匹配。每次 USB 传输都可以记录到文件中(`T48Emmc(log_path=…)`),从而使真实会话成为协议文档的真实依据。 - [`examples/first_contact.py`](examples/first_contact.py) — 一个**零风险**的首次会话探测脚本,可在插上 T48 的瞬间运行:`connect → identify → measure voltages → status → read pins`。它**不施加任何编程电压**,**不需要芯片**和**eMMC-ISP 适配器**,并记录每一次传输。这是在接触芯片之前验证传输层和经典操作码的安全方式。 - [`tools/extract_alg.py`](tools/extract_alg.py) — 针对 `Xgpro` 附带的专有 `.alg` 文件的独立解包程序。每个 `.alg` 文件都包含一个采用零游程编码(zero-RLE)压缩的 Xilinx Spartan-6 FPGA 比特流(解压后为 340 604 字节),并带有一个 32 位 CRC。本仓库不包含任何 `.alg` 文件本身——请从合法的 Xgpro 安装中自行获取。 ## 快速了解协议 EP1 OUT 上的 `Xgpro` USB 命令以 1 字节的顶层操作码开始。经典范围(`0x02..0x3F`)中的操作码已由 `minipro` 实现。eMMC 扩展添加了以下顶层操作码: | 顶层操作码 | 用途 | |------------|------------------------------------------------------| | `0x08` | 长接收封装(例如子操作 `0x48` → 读取 512 B) | | `0x14` | 在 EP2 OUT 上进行 N × 512 B 批量写入之前的设置 | | `0x21` | eMMC 初始化 / 算法选择 | | `0x27` | eMMC 子命令调度器(子操作位于字节 1) | 对于 `0x27` 类命令,其布局为 8 字节: `[0x27][sub-op][u16 = 0][u32 arg LE]`。在子操作中,**CMD6 SWITCH** 编码提供的信息最丰富:其 32 位的 `arg` 完全符合 JEDEC eMMC CMD6 参数的大端序格式,例如 ``` SWITCH PARTITION_CONFIG → RPMB → arg = 0x01B30300 SWITCH HS_TIMING → HS-200 → arg = 0x01AF0100 restore PARTITION_ACCESS → USER → arg = 0x02B30700 (CLEAR_BITS of 0x07) ``` 完整表格请参见 `docs/PROTOCOL.md` §7。 ## 离线健全性测试 ``` pip install pyusb python3 examples/t48_emmc.py ``` 这将在不触及任何硬件的情况下运行字节级别的健全性测试: ``` == Проверка структур пакетов (offline) == cmd_A(SWITCH→RPMB) = 274600000003b301 cmd_A(SWITCH→USER restore)= 274600000007b302 cmd_A(SWITCH→HS200) = 274600000001af01 ... [OK] Все три расшифрованные команды сходятся с реверсом Xgpro.exe. ``` 插入 T48 后,`python3 examples/t48_emmc.py --connect` 将尝试通过 libusb 打开设备。在 Linux 上,您可能需要一条 udev 规则来授予用户访问设备接口的权限;在 Windows 上,使用 XGecu 提供的官方 WinUSB 驱动程序即可。 对于新设备上的**首次**运行,建议使用安全探测——它不施加电压,不需要芯片,并会保存完整的传输跟踪记录: ``` python3 examples/first_contact.py # → t48_first_contact.log ``` ## 在电路读写 eMMC 将 XGecu eMMC-ISP 适配器连接到目标 eMMC 后,ISP 工具可以读写任意区域。默认模式是非破坏性的(握手 + 初始化,打印 CID,读取一个 16 KB 的数据块并对其进行 hexdump): ``` python3 examples/t48_emmc_isp.py # read-only @ block 0x8000 python3 examples/t48_emmc_isp.py --block 0x100000 # read-only @ another block python3 examples/t48_emmc_isp.py --partitions # parse the partition table python3 examples/t48_emmc_isp.py --boot-roundtrip # read boot sectors, write them back, verify python3 examples/t48_emmc_isp.py --write-test 0x8000 # write marker + read-back verify (DESTRUCTIVE) python3 examples/t48_emmc_isp.py --voltage 1.8 # 1.8 V VCCQ (UNVERIFIED — use only on a known 1.8 V chip) ``` 关于 Xgpro 设置(总线宽度,VCCQ,CLK,分区,RST_n 接线)的含义及稳定的起始点,请参阅 [`docs/ISP_SETTINGS.md`](docs/ISP_SETTINGS.md);有关 ISP 读写流程的线路级分解,请参阅 `docs/PROTOCOL.md` §33–§35。 ## 解包 `.alg`(可选) 如果您想查看 `Xgpro` 为特定芯片系列提供的 FPGA 比特流,解包程序会输出原始的 340604 字节有效载荷: ``` python3 tools/extract_alg.py path/to/Xgpro/algorithm/EMMC_41_18.alg # → EMMC_41_18.bit (340604 字节,带有 16 字节 0xFF preamble + FPGA sync) ``` ## 不包含的内容 根据该项目的目的,本仓库仅包含原创材料——逆向工程说明以及我们自己的、*用于与已记录协议通信*的代码。我们刻意**不**提供: - 任何来自 XGecu 的二进制文件(`Xgpro.exe`,驱动程序,固件更新) - 任何 `.alg` 算法文件 - 芯片数据库(`InfoIC2Plus.dll` 转储) - 解压后的 FPGA 比特流 这些是 XGecu 的受版权保护的材料。`Xgpro` 软件可从制造商 () 免费获取,并且 `minipro` 中的 `dumpic` 工具可以根据合法的安装在本地生成芯片数据库转储。 ## 存在原因 这些资料的预期用户是另一款 eMMC 读取器应用程序,该程序已经支持其他 USB-eMMC 后端,并希望将 T48 作为 Windows 和 Linux 上的又一个后端添加进去。公开记录该协议对于任何在 Linux 下运行 T48 且希望获得比在 Wine 下运行 `Xgpro` 更具可编程性的人来说,也是非常有用的。 这项工作建立在优秀的 [`minipro`](https://gitlab.com/DavidGriffith/minipro) (GPL-3.0) 基础之上——它已经实现了共享的 T48 传输层(操作码 `0x02..0x3F`,USB 握手,电压/时钟控制)——以及在 [`radiomanV/TL866`](https://github.com/radiomanV/TL866) 中关于该设备系列固件方面的研究。 ## 许可证 [MIT](LICENSE)。出于在独立开发的软件与其所有者购买的硬件之间实现互操作性目的而进行的逆向工程。 [![Boosty](https://img.shields.io/badge/Boosty-Buy_me_a_coffee-FF7143?logo=boosty&logoColor=white&style=for-the-badge)](https://boosty.to/danusha/donate)
标签:eMMC, Python, USB协议, XGecu T48, 云资产清单, 嵌入式系统, 无后门, 硬件与设备, 逆向工具, 逆向工程