如何逆向红外电子货架标签协议:TagTinker 帧结构、CRC16 与 PLID 编码完整指南

📅 发布时间:2026/10/9 1:11:16
如何逆向红外电子货架标签协议:TagTinker 帧结构、CRC16 与 PLID 编码完整指南
如何逆向红外电子货架标签协议TagTinker 帧结构、CRC16 与 PLID 编码完整指南【免费下载链接】TagTinkerFlipper Zero app for ESL research using IR. All based on https://www.furrtek.org/?aesl项目地址: https://gitcode.com/gh_mirrors/ta/TagTinkerTagTinker 是一款运行在 Flipper Zero 上的红外电子货架标签ESL研究工具它通过红外 LED 直接向电子价签发送自定义图像与文字让你无需官方基站就能摸清 ESL 的帧结构、CRC16 校验与 PLID 地址编码。本文带你像逆向工程师一样拆解这套协议从 32kHz 载波的 PP4 符号编码到 6 字节帧头 CRC16 校验的完整帧布局再到从 17 位条码提取 24 位标签地址的全过程帮助你在自己的标签上安全完成一次协议级实验。为什么红外 ESL 值得逆向超市里随处可见的电子价签其实分两大类射频2.4GHz更新和红外IR更新。射频价签的通信是私有加密链路很难用软件直接驱动而红外价签的更新信号和你家电视遥控器用的是同一种物理信号——这是纯粹的红外信号和电视遥控器一样。它的全部安全性都依赖协议的保密性。 —— Flipper Zero 团队也就是说只要逆向出协议格式任何带 IR LED 的廉价硬件ESP32 红外头都能驱动标签。TagTinker 选择 Flipper Zero 作为载体其协议层基于社区研究者furrtek公开的 ESL 研究成果PrecIR 参考实现并在其之上构建了一个高性能的 RLE 流式红外引擎。⚠️重要提醒许多红外 ESL 的固件、地址和画面都保存在易失性 RAM 中电池耗尽后标签会彻底变砖无法脱离原厂基站恢复。请务必只测试自己拥有或获准测试的标签本文内容仅限合法研究用途。第一层信号层——PP4 符号编码在拼帧之前先要回答字节是怎么变成红外光脉冲的。这部分实现集中在 ir/tagtinker_ir.c。PP4 调制原理标签侧使用PP4Pulse Position, 4 符号编码一个符号承载 2 个比特靠载波突发后的空隙长度来区分符号值步骤说明参数1点亮 32kHz 红外载波TIM1 PWM2 模式突发约25.8µs2581 个 CPU 周期 64MHz2关闭载波等待一段空隙空隙时长决定符号值3空隙结束后开始下一个符号每个字节发 4 个符号共 8 比特四种空隙与符号值的对应关系预计算为周期数见pp4_gap_cycles数组空隙时长符号值二进制~60µs00~181µs01~121µs10~242µs11两个工程细节值得注意位序是低位优先发送循环里先取byte 0x03再右移即每个字节内的符号从低位比特对开始发出帧尾闭合脉冲所有符号发完后还要再发一次载波突发作为帧结束标记接收端靠它收尾。为了保证微秒级时序不被操作系统打断整个帧的发送被包在临界区FURI_CRITICAL_ENTER中执行ir/tagtinker_ir.c重复帧之间再以 500µs 为单位的间隔循环——重复次数就是应用里的信号强度设置。第二层协议帧结构——6 字节头 CRC16剥开载波后每一帧的布局都遵循同一个模板构建代码在 protocol/tagtinker_proto.c。帧布局总览偏移字段长度说明0协议类型1 字节0x85 点阵标签DM0x84 段码标签SEG1–4PLID 地址4 字节标签 ID低字节在前全 0 表示广播5命令字1 字节如0x97Ping、0x17Wake、0x34MCU 命令6命令负载可变参数、图像数据等末尾CRC162 字节低字节在前小端所有帧在生成后统一经过terminate()函数对前面所有字节计算 CRC16并把结果拆成两个字节追加到帧尾protocol/tagtinker_proto.c。单帧最大长度被限制为96 字节TAGTINKER_MAX_FRAME_SIZE这直接决定了图像数据帧每次只能携带 20 字节有效载荷。CRC16多项式 0x8408 的右移校验CRC 实现只有 8 行protocol/tagtinker_proto.c其参数特征非常明显是逆向中最好识别的指纹之一初始值0x8408多项式0x8408两者相同是典型的初始值即种子设计右移算法逐位判断最低位为 1 时右移 1 位后与0x8408异或校验范围覆盖从帧头到命令负载的每一个字节不含 CRC 自身结果以小端顺序写入crc 0xFF在前(crc 8) 0xFF在后。逆向技巧如果你在抓到的数据流里看到每段固定以 2 字节结尾且改动前面任意一字节后结尾两字节按上述规律变化——基本可以锁定就是这种初始值多项式0x8408的 CRC16。这是验证自己抓包解码是否正确最快的方法。第三层PLID 地址编码——从 17 位条码到 4 字节 ID帧头里的 4 字节 PLID 从哪里来答案是标签背面的17 位条码解码逻辑见 protocol/tagtinker_proto.c。PLID 的 24 位拼装规则17 位条码中有 10 位数字参与地址编码条码位置0 起位数作用第 3–7 位5 位数值 a第 8–12 位5 位数值 b第 13–16 位4 位类型码查标签型号24 位 ID 的拼装方式是高 16 位放 a、低 8 位放 bid (a 16) | b // 共 24 位 PLID [id 0xFF, (id8) 0xFF, (id16) 0xFF, (id24) 0xFF]注意最后一步线上传输时按小端顺序拆成 4 个字节。也就是说条码数字越大越靠前的字节会变化——这也是为什么抓包比对时先改条码后几位、观察帧头前两字节是否联动就能快速验证地址映射关系。类型码与标签画像表第 13–16 位4 位数字构成类型码用于在内置画像表profile_table中查找型号、屏幕分辨率、是否带副色层红/黄等信息protocol/tagtinker_proto.c。例如类型码型号分辨率特点1275DM110320×192灰阶点阵1314SmartTag HD110400×300灰阶点阵1327SmartTag HD M Red208×112点阵 红色副层1626SmartTAG Color 2.6152×296线上传输尺寸彩色特殊坐标翻转不在表中的类型码会被标记为未知型号——这也是逆向扩展新标签时的切入点用 Type Barcode手动输入条码观察帧收发行为即可逐步补全画像。特殊地址——广播当 PLID 全为0x00时命令会送达所有在听的标签如翻页广播帧protocol/tagtinker_proto.c。这正是协议安全性依赖保密性的直观体现协议里没有任何鉴权字段。实战完整图像传输序列Wake → Param → Data → Refresh把前面三层拼起来就是 TagTinker 发送一张图到标签的完整流程调度代码在 scenes/tagtinker_scene_transmit.c。整个序列可概括为一条指令链Ping 帧cmd0x97短帧探测标签是否存活Wake 帧cmd0x170x01 00 00 00 22 个0x01的唤醒序列可重复数百次彩色标签重复 400 次确保从低功耗状态醒来图像参数帧MCU 命令0x05携带压缩后总字节数、压缩类型0原始位图2RLE、目标页0–7、宽高、偏移位置等参数图像数据帧MCU 命令0x20每帧带一个 16 位序号 固定 20 字节图像数据逐帧循环发送每 32 帧插入 1ms 微停顿防止标签缓冲溢出Refresh 帧MCU 命令0x0118 字节零填充通知标签数据接收完毕刷新显示。RLE 位流压缩20 字节帧里的秘密图像像素在编码成帧之前会先经过 RLE 压缩protocol/tagtinker_proto.c位流开头是 1 个标志位随后是游程编码先写像素值再写连续相同像素的计数计数的编码长度随数值位数动态变化位数×2−1位小数更省空间编码器会同时计算 RLE 与原始位图长度取更短者并把压缩类型写进参数帧最终数据会补齐到 160 比特20 字节整数倍正好一帧一帧地装进0x20数据帧。这套参数帧声明总量 数据帧固定分片 序号防乱序的设计本质是一个极简的可靠传输协议——没有 ACK、没有重传靠重复发送repeats来对抗红外链路的丢帧。效果验证协议跑通后标签就会忠实地显示你发过去的任何位图。下面两块 PRICER 标签分别显示了自定义图像和 TagTinker 字样——正是这条 Wake→Param→Data→Refresh 序列的产物小结逆向红外 ESL 协议的检查清单步骤关键动作对应代码1识别载波频率32kHz与调制方式PP4空隙分 4 档ir/tagtinker_ir.c2按类型 PLID 命令 负载 CRC16(0x8408)拆分帧protocol/tagtinker_proto.c3用 CRC16 规律校验解码正确性protocol/tagtinker_proto.c4从 17 位条码提取 24 位 PLID 与 4 位类型码protocol/tagtinker_proto.c5按 Wake → Param(0x05) → Data(0x20) → Refresh(0x01) 复现传输序列scenes/tagtinker_scene_transmit.cTagTinker 的价值不仅在于能黑一下自家标签更在于它把 furrtek 的公开研究成果固化成了一份可运行的协议参考实现。读懂protocol/与ir/这两个目录你就拥有了完整复刻这套红外 ESL 协议所需的全部知识——而这一切的前提永远是对合法设备开展负责任的实验研究 【免费下载链接】TagTinkerFlipper Zero app for ESL research using IR. All based on https://www.furrtek.org/?aesl项目地址: https://gitcode.com/gh_mirrors/ta/TagTinker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考