proxmark3 T5577 实战指南:从块读写、Bit 级配置到密码保护与嗅探
【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3
本文以 proxmark3(Iceman Fork)仓库自带的doc/T5577_Guide.md教程为主线,系统讲解 T5577 这颗 125 kHz 低频 RFID 芯片的完整使用过程:如何用lf t55xx系列命令检测、转储、读写数据块,如何按位修改 Page 0 Block 0 配置字让卡片启用密码或仿真 EM4100,以及如何使用lf t55xx sniff捕获明文密码。读完本文,你可以独立完成 T5577 的初始化、数据写入、密码开启与关闭、配置解码和命令嗅探等全套操作,并理解每条命令背后的源码实现。
一、T5577 是什么:芯片定位与内存结构
T5577 是一颗通用的低频(LF)RFID 芯片,工作在 125 kHz 频段,常用于学习和各类卡片的仿真。官方教程明确建议:学习 RFID 与阅读数据手册(datasheet)应同时进行——手册中保存着你需要的全部信息,只是你还不知道如何解读它。本指南基于仓库内文档(见 T5577 教程原文),并结合 客户端 T55xx 命令实现 给出源码级佐证。
从芯片内部看,T5577 可以存储数据和配置两部分内容。上方内存布局图中,所有白色块都能存数据,其中部分块有第二用途(如密码块、可追溯数据块),而"Configuration Data"与模拟前端选项则决定芯片如何行为。
可追溯数据(Traceability Data)是制造厂商烧录并锁定的数据,包含生产年份、季度、晶圆编号、die 编号等,用于追溯芯片的生产批次。它占据 Page 1 的 Block 1 与 Block 2,正常情况下不可写——但部分 T5577 克隆芯片允许覆写这两个块。可以使用lf t55xx trace命令读取(对应源码入口 CmdT55xxReadTrace)。
首次接触卡片:detect 与 dump
由于 T5577 的配置可以改变其输出数据的编码方式,proxmark3 必须先弄清"如何解读收到的数据"。每次把 T5577 放到 proxmark3 上后,都应先执行 detect 命令:
[usb] pm3 --> lf t55xx detect典型输出(对应 CmdT55xxDetect):
[=] Chip type......... T55x7 [=] Modulation........ ASK [=] Bit rate.......... 2 - RF/32 [=] Inverted.......... No [=] Offset............ 33 [=] Seq. terminator... Yes [=] Block0............ 000880E0 (auto detect) [=] Downlink mode..... default/fixed bit length [=] Password set...... Nodetect 之后,即可转储整片存储:
[usb] pm3 --> lf t55xx dump[+] Reading Page 0: [+] blk | hex data | binary | ascii [+] ----+----------+----------------------------------+------- [+] 00 | 000880E0 | 00000000000010001000000011100000 | .... [+] 01 | 00000000 | 00000000000000000000000000000000 | .... [+] 02 | 00000000 | 00000000000000000000000000000000 | .... [+] 03 | 00000000 | 00000000000000000000000000000000 | .... [+] 04 | 00000000 | 00000000000000000000000000000000 | .... [+] 05 | 00000000 | 00000000000000000000000000000000 | .... [+] 06 | 00000000 | 00000000000000000000000000000000 | .... [+] 07 | 00000000 | 00000000000000000000000000000000 | .... [+] Reading Page 1: [+] blk | hex data | binary | ascii [+] ----+----------+----------------------------------+------- [+] 00 | 000880E0 | 00000000000010001000000011100000 | .... [+] 01 | 00000000 | 00000000000000000000000000000000 | .... [+] 02 | 00000000 | 00000000000000000000000000000000 | .... [+] 03 | 00000000 | 00000000000000000000000000000000 | ....需要注意:T5577 存在大量克隆芯片,各克隆片的出厂默认配置可能不同;若卡片带有可追溯数据,其内容随生产批次而变,因此你的 dump 结果可能与示例有差异。
二、读与写数据块:32 位粒度与十六进制格式
proxmark3 操作 RFID 卡片的基本功就是读写数据。T5577 的读写规则是一次读写一个完整的块(block),每块存放32 位数据——这也解释了 dump 输出中的 32 位二进制列。
学习阶段请避开配置块(Page 0 Block 0)和 Page 1 的块。用户数据建议存放在 Block 1–7,但记住Block 7 是密码块,将来若要启用密码就会用到它。
2.1 读一个块
[usb] pm3 --> lf t55xx read -b 1结果:
[+] Reading Page 0: [+] blk | hex data | binary | ascii [+] ----+----------+----------------------------------+------- [+] 01 | 00000000 | 00000000000000000000000000000000 | ....命令的读法是:对 T55xx 芯片(t55xx)执行低频(lf)命令,读取块(block,-b)1。
2.2 写一个块
用-d参数提供 8 位十六进制数据,写入 Block 1:
[usb] pm3 --> lf t55xx write -b 1 -d 12345678[=] Writing page 0 block: 01 data: 0x12345678回读验证:
[usb] pm3 --> lf t55xx read -b 1[+] Reading Page 0: [+] 01 | 12345678 | 00010010001101000101011001111000 | .4Vx2.3 十六进制与二进制对照
一个十六进制数字承载 4 位二进制数据,因此 32 位块数据 = 8 个十六进制数字(8 × 4 = 32)。对照速查表:
| Hex | Binary | Decimal |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| A | 1010 | 10 |
| B | 1011 | 11 |
| C | 1100 | 12 |
| D | 1101 | 13 |
| E | 1110 | 14 |
| F | 1111 | 15 |
写入89ABCDEF验证满 32 位:
[usb] pm3 --> lf t55xx write -b 1 -d 89abcdef[=] Writing page 0 block: 01 data: 0x89ABCDEF[usb] pm3 --> lf t55xx read -b 1[+] 01 | 89ABCDEF | 10001001101010111100110111101111 | ....2.4 练习 1
用 read/write 命令让lf t55xx dump显示 Page 0 的 Block 1–7 中 Block 1 为89ABCDEF、其余为00000000的布局。不要写 Block 0,也不要改动 Page 1 的数据:
[usb] pm3 --> lf t55xx dump[+] 00 | 000880E0 | 00000000000010001000000011100000 | .... [+] 01 | 89ABCDEF | 10001001101010111100110111101111 | .... [+] 02 | 00000000 | 00000000000000000000000000000000 | .... [+] 03 | 00000000 | 00000000000000000000000000000000 | .... [+] 04 | 00000000 | 00000000000000000000000000000000 | .... [+] 05 | 00000000 | 00000000000000000000000000000000 | .... [+] 06 | 00000000 | 00000000000000000000000000000000 | .... [+] 07 | 00000000 | 00000000000000000000000000000000 | ....反复练习读写 Block 1–6 直到结果符合预期。练习阶段建议远离 Block 7——那是密码的存放位置,一旦设置后忘记密码,你将无法再读写该卡片。
三、密码保护:从 000880E0 到 000880F0 的 Bit 28
密码操作对新手容易踩坑。核心警告只有一句话:忘记密码 = 失去卡片访问权。
3.1 第 1 步:擦除到已知状态
wipe命令会把 Block 0 重置为默认配置、把 Block 1–7 全部清零(源码入口 CmdT55xxWipe):
[usb] pm3 --> lf t55xx wipe[=] Target T55x7 tag [=] Default configuration block 000880E0 [=] Begin wiping... [=] Writing page 0 block: 00 data: 0x000880E0 [=] Writing page 0 block: 01 data: 0x00000000 [=] Writing page 0 block: 02 data: 0x00000000 [=] Writing page 0 block: 03 data: 0x00000000 [=] Writing page 0 block: 04 data: 0x00000000 [=] Writing page 0 block: 05 data: 0x00000000 [=] Writing page 0 block: 06 data: 0x00000000 [=] Writing page 0 block: 07 data: 0x00000000这个默认值与源码中的常量定义完全一致,见 cmdlft55xx.h 的配置块常量:
#define T55X7_DEFAULT_CONFIG_BLOCK 0x000880E8 // ASK, compat mode, data rate 32, manchester, STT, 7 data blocks #define T55X7_RAW_CONFIG_BLOCK 0x000880E0 // ASK, compat mode, data rate 32, manchester, 7 data blocks #define T55X7_EM_UNIQUE_CONFIG_BLOCK 0x00148040 // ASK, EM4x02/unique - compat mode, manchester, data rate 64, 2 data blocks3.2 第 2 步:确认状态
[usb] pm3 --> lf t55xx detect确认输出中Block0为000880E0。若 Block 0 不是 0x000880E0,必须先解决该问题再继续。
3.3 第 3–4 步:写入密码并核对
本例使用密码12345678,密码存放在 Page 0 Block 7(源码中即T55x7_PWD_BLOCK 0x07):
[usb] pm3 --> lf t55xx write -b 7 -d 12345678[=] Writing page 0 block: 07 data: 0x12345678用lf t55xx dump核对 Block 0 与 Block 7:若二者不严格等于000880E0/12345678,停止后续操作。
3.4 第 5 步:按位开启密码位(Bit 28)
数据手册规定:要让芯片启用密码,需设置配置字(Block 0)的第 28 位 "PWD"。
本例中,只改 Bit 28,其余位一律不动:
- 当前 Block 0:
000880E0 - 新 Block 0:
000880F0
位位置对照(Bit 28 处加粗):
Bit Location (28) 000000000011111111112222222 2 2233 123456789012345678901234567 8 9012| Hex Data | Binary Data |
|---|---|
| 000880E0 | 00000000000010001000000011100000 |
| 000880F0 | 00000000000010001000000011110000 |
即 Bit 28:0 = 无密码,1 = 使用密码。注意其他配置位均未改变。该位掩码在源码中定义为T55x7_PWD 0x00000010(即 0xF0 与 0xE0 之差)。
写入新配置:
[usb] pm3 --> lf t55xx write -b 0 -d 000880F0[=] Writing page 0 block: 00 data: 0x000880F03.5 第 6 步:验证密码生效
密码启用后,不带密码的 detect 将失败:
[usb] pm3 --> lf t55xx detect[!] Could not detect modulation automatically. Try setting it manually with 'lf t55xx config'这是因为读写需要密码。加上-p参数后恢复正常:
[usb] pm3 --> lf t55xx detect -p 12345678[=] Chip type......... T55x7 [=] Modulation........ ASK [=] Bit rate.......... 2 - RF/32 [=] Inverted.......... No [=] Offset............ 33 [=] Seq. terminator... Yes [=] Block0............ 000880F0 (auto detect) [=] Downlink mode..... default/fixed bit length [=] Password set...... Yes [=] Password.......... 123456783.6 第 7–8 步:带密码写/读,以及安全机制
写块时附带密码:
[usb] pm3 --> lf t55xx write -b 1 -d 1234abcd -p 12345678[=] Writing page 0 block: 01 data: 0x1234ABCD pwd: 0x12345678读块时附带密码——重大警告:
在未启用密码的卡片上执行"带密码读"可能导致卡片被锁死。仅在确认卡片确实使用了密码时才使用带密码的 read。
proxmark3 对此内置了安全检查(safety check):执行lf t55xx read -p ...时,客户端会先尝试读取配置块并判断 PWD 位是否置位(实现见 CmdT55xxReadBlock 的安全检查逻辑 及其调用的底层读取函数中的 检查代码):
[usb] pm3 --> lf t55xx read -b 1 -p 12345678[+] Reading Page 0: [+] blk | hex data | binary | ascii [+] ----+----------+----------------------------------+------- [!] Safety check: Could not detect if PWD bit is set in config block. Exits.安全检查介入,拒绝在无法确认 PWD 位的情况下带密码读取,要求提供覆盖参数-o:
[usb] pm3 --> lf t55xx read -b 1 -p 12345678 -o[+] Reading Page 0: [=] Safety check overridden - proceeding despite risk [+] 01 | 1234ABCD | 00010010001101001010101111001101 | .4..此时读回了写入的数据。read 命令的完整参数(-b块号、-p4 字节十六进制密码、-o覆盖安全检查、--pg1读 Page 1,以及下链路编码选项 r0–r3)定义在 CLIParser 参数表中,密码必须是 4 个十六进制字节,否则直接报错退出。
3.7 第 9 步:关闭密码
需要把配置字 Bit 28 清零。正确做法是:先读出当前配置,仅清 Bit 28,再写回——直接盲写一个"标准配置"会覆盖你所有的其他设置(虽然这能救回卡片,但会丢失你已有的配置)。本例已知目标值就是000880E0:
[usb] pm3 --> lf t55xx write -b 0 -d 000880E0 -p 12345678[=] Writing page 0 block: 00 data: 0x000880E0 pwd: 0x12345678验证免密码 detect 恢复:
[usb] pm3 --> lf t55xx detect[=] Block0............ 000880E0 (auto detect) [=] Downlink mode..... default/fixed bit length [=] Password set...... No四、Part 2:理解两个独立的双向通信协议
很多初学者容易忽略的一点:T5577 有两套不同的、各自带有子协议的通信方向。
- Card → Reader(卡到读):T5577 按 Page 0 Block 0 的设置编码数据。无论是默认读模式(上电后自动发送 Block 1 到 x 的循环广播),还是响应命令的回复,都用它。
- Reader → Card(读到卡):T5577 按 Page 1 Block 3 的设置编码(下链路)。若命令编码不正确,芯片会忽略该命令并退回默认读模式。
这就是为什么 detect 输出里会显示 "Downlink mode",以及 read 命令为何提供--r0到--r3四种下链路编码选项(fixed bit / long leading reference / leading zero / 1-of-4,对应 cmdlft55xx.c 中的下链路模式定义)。
五、解码配置字 Block 0(Page 0):以 EM4100 为例
配置字的选择决定了卡片在"生产用途"下的行为形态:想让卡片表现得像 EM4100,就选 EM4100 的参数组合;HID 同理(各协议配置值可参见社区资料,也可对照 cmdlft55xx.h 中内置的协议配置常量表)。
以非密码保护的 EM4100 配置00148040为例,其二进制为00000000000101001000000001000000(32 位)。按位域拆解:
| Bits | Purpose | Value |
|---|---|---|
| 0000 | Master Key | Nothing Set |
| 0000000 | Not used in Basic Mode | |
| 101 | Data Bit Rate | RF/64 |
| 0 | Not used in Basic Mode | |
| 01000 | Modulation | Manchester |
| 00 | PSKCF | RF/2 |
| 0 | AOR | Not Set |
| 0 | Not used in Basic Mode | |
| 010 | Max Block | 2 |
| 0 | Password | Not Set |
| 0 | ST Sequence Terminator | Not Set |
| 00 | Not used in Basic Mode | |
| 0 | Init Delay | Not Set |
5.1 实操:把 T5577 变成 EM4100
假设卡片仍处于 Part 1 结束时的状态(无密码可写)。
- 克隆 EM4100,ID 为
1122334455:
[usb] pm3 --> lf em 410x clone --id 1122334455[+] Preparing to clone EM4102 to T55x7 tag with ID 1122334455 (RF/64) [#] Clock rate: 64 [#] Tag T55x7 written with 0xff8c65298c94a940 [+] Done- 用
lf search验证(可看到 HoneyWell IdentKey 的多种解码结果与 T55xx 芯片指纹):
[=] Checking for known tags... [+] EM 410x ID 1122334455 [+] EM410x ( RF/64 ) [=] -------- Possible de-scramble patterns --------- [+] Unique TAG ID : 8844CC22AA [=] HoneyWell IdentKey [+] DEZ 8 : 03359829 [+] DEZ 10 : 0573785173 [+] DEZ 5.5 : 08755.17493 [+] DEZ 3.5A : 017.17493 [+] DEZ 3.5B : 034.17493 [+] DEZ 3.5C : 051.17493 [+] DEZ 14/IK2 : 00073588229205 [+] DEZ 15/IK3 : 000585269781162 [+] DEZ 20/ZK : 08080404121202021010 [=] [+] Other : 17493_051_03359829 [+] Pattern Paxton : 289899093 [0x11478255] [+] Pattern 1 : 5931804 [0x5A831C] [+] Pattern Sebury : 17493 51 3359829 [0x4455 0x33 0x334455] [+] VD / ID : 017 / 0573785173 [=] ------------------------------------------------ [+] Valid EM410x ID found! [+] Chipset detection: T55xx [?] Hint: try `lf t55xx` commands- 用 detect / info 查看新配置。detect 显示 Bit rate 变为
5 - RF/64、Block0 为00148040:
[usb] pm3 --> lf t55xx detect[=] Chip type......... T55x7 [=] Modulation........ ASK [=] Bit rate.......... 5 - RF/64 [=] Inverted.......... No [=] Offset............ 33 [=] Seq. terminator... Yes [=] Block0............ 00148040 (auto detect) [=] Downlink mode..... default/fixed bit length [=] Password set...... Nolf t55xx info(源码入口 CmdT55xxInfo)给出结构化解读,并附"配置块指纹"匹配:
[=] --- T55x7 Configuration & Information --------- [=] Safer key : 0 [=] reserved : 0 [=] Data bit rate : 5 - RF/64 [=] eXtended mode : No [=] Modulation : 8 - Manchester [=] PSK clock frequency : 0 - RF/2 [=] AOR - Answer on Request : No [=] OTP - One Time Pad : No [=] Max block : 2 [=] Password mode : No [=] Sequence Terminator : No [=] Fast Write : No [=] Inverse data : No [=] POR-Delay : No [=] ------------------------------------------------------------- [=] Raw Data - Page 0, block 0 [=] 00148040 - 00000000000101001000000001000000 [=] --- Fingerprint ------------ [+] Config block match : EM unique, Paxtoninfo 的输出确认了我们手工解码的结果,其中 "Config block match: EM unique, Paxton" 与源码常量T55X7_EM_UNIQUE_CONFIG_BLOCK/T55X7_EM_PAXTON_CONFIG_BLOCK(同为0x00148040)的指纹匹配机制对应。注意:detect 仍然必不可少——proxmark3 必须先 detect 才能知道如何解码 info。EM4100 仿真下 Max Block = 2,数据占用 Block 1 与 Block 2。
5.2 练习 2
用 Part 1 的读写技能查看 Block 1 和 Block 2 的数据。注意1122334455这个 ID 是编码后存储的,不要指望直接看到这些字节——如何解码,去查数据手册。
此时若想给这张 EM4100 仿真卡加密码保护,可走第三节的流程,把配置从00148040更新为00148050(同样只动 Bit 28)。切记先在 Block 7 写入并记住一个有效密码。
(原文档中 "Block 3 Page 1" 一节标注为to be written,即下链路配置块部分尚未撰写;理解其重要性可参考第四节的协议说明。)
六、嗅探 T55xx 命令:抓明文密码
有些读卡器通过 T55xx 命令(read/write 等)与卡片通信,并因此被认为"安全"。但此时密码是以明文在射频场中发送的。proxmark3 提供了嗅探命令,从缓冲区或射频场中捕获这些命令(源码入口 CmdT55xxSniff):
[usb] pm3 --> lf t55xx sniff[=] T55xx command detection [+] Downlink mode | password | Data | blk | page | 0 | 1 | raw [+] ------------------------+------------+----------+-----+------+-----+-+--------------------------------------------- [+] Default write/pwd read | [FFxxxxxx] | FFxxxxxx | 6 | 0 | 16 | 45 | 1011111111101xxxxxxxxxxxxxxxx100000110 [+] Default write/pwd read | [FFxxxxxx] | FFxxxxxx | 6 | 0 | 17 | 46 | 1011111111101xxxxxxxxxxxxxxxx100000110 [+] -------------------------------------------------------------------------------------------------------------------输出表逐列给出:下链路模式、捕获到的密码([FFxxxxxx]表示密码高字节为 FF、其余位未完全解析)、目标数据、块号、页号以及原始位串。
七、T5577 与 Keysy:基于可追溯数据的 DRM
Keysy 标签克隆工具使用一种特殊机制:它在Block 6写入一个特殊"密码"值(注意:这不是第三节的芯片密码),该值与可追溯数据绑定,Keysy 会校验并计算 Block 6 的正确取值,不会写入不满足条件的标签。这一 DRM 技术依赖两个前提:
- 正品 T5577 芯片的可追溯数据(Page 1 的 Block 1 和 2)不可重写;
- 计算 Block 6 正确值的方法是专有的——由此迫使用户购买其品牌标签。
而正如前文所述,部分 T5577 克隆芯片允许覆写可追溯数据,因此把一枚 Keysy 标签的完整 dump 写入这类克隆芯片,即可欺骗 Keysy 使用它。这同时意味着:永远不要覆写 Keysy 标签的 Block 6,否则该标签将无法再被 Keysy 编程(除非恢复该值)。
八、源码级小结:命令体系与关键常量
从 client/src/cmdlft55xx.c 的函数布局可以完整看到lf t55xx子命令的实现脉络(均对应本文出现的操作):
| 命令 | 源码入口 | 作用 |
|---|---|---|
lf t55xx detect | CmdT55xxDetect | 自动检测调制/波特率/Block 0/密码位 |
lf t55xx dump | CmdT55xxDump | 转储全部页块数据 |
lf t55xx read | CmdT55xxReadBlock | 读块,含 PWD 安全检查 |
lf t55xx write | CmdT55xxWriteBlock | 写块,可选密码 |
lf t55xx wipe | CmdT55xxWipe | 恢复默认配置并清零 |
lf t55xx info | CmdT55xxInfo | 结构化解读配置字 + 指纹匹配 |
lf t55xx trace | CmdT55xxReadTrace | 解析 Page 1 可追溯数据 |
lf t55xx sniff | CmdT55xxSniff | 嗅探射频场中的 T55xx 命令 |
lf t55xx brute/chkpwd | CmdT55xxBruteForce/CmdT55xxChkPwds | 字典/穷举恢复密码 |
核心常量集中在 client/src/cmdlft55xx.h:密码块号T55x7_PWD_BLOCK = 0x07、PWD 位掩码T55x7_PWD = 0x00000010、每页块数T55x7_BLOCK_COUNT = 12,以及 EM4100(0x00148040)、HID 26 位(0x00107060)、Indala 64/224(0x00081040/0x000810E0)等各协议的配置字常量——这些常量与本文第五节的位域解码表一一对应。
配置状态在客户端由t55xx_conf_block_t结构(定义)持有,涵盖调制方式、位率、偏移、Block 0 值及其来源状态(NOTSET/AUTODETECT/USERSET/TAGREAD)、密码与下链路模式——这正是 detect 输出各项的内存表示。
附录:本指南的关键安全红线
- 忘记 Block 7 密码 = 卡片报废(除非用
lf t55xx chkpwd/brute从字典恢复)。 - 未在密码模式下不要执行带
-p的 read;必须时配合-o并自担风险——客户端的 safety check 会先拦截。 - 改配置字采用"读—改单 bit—写回"策略,不要盲写标准值覆盖整块。
- 操作前永远先
lf t55xx detect,它是后续所有命令正确解码的前提。
【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考