
Proxmark3 HF_TCPRST 独立模式实战IKEA Rothult ST25TA 密码提取与全功能仿真【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3HF_TCPRST 是 Proxmark3 的一个 HF13.56 MHzStandalone 独立模式可在不连接上位机的情况下读取 IKEA Rothult NFC 门锁标签NXP ST25TA 系列、提取其中 16 字节的 Read Protection 密码并基于该密码完成标签内容的 Dump 与完整仿真。阅读本文后你将掌握该模式的四个工作阶段、LED/按键交互方式、状态机流转逻辑以及底层 ISO 14443A-4 APDU 协议与仿真初始化的源码级实现细节能够独立完成该模式的编译、烧录与实操。一、模式定位它解决什么问题HF_TCPRST 的目标对象是IKEA Rothult——一款电池供电的 NFC 智能门锁其钥匙标签为ST25TA02KISO 14443A 协议的 Type 4 标签。门锁通过读取标签上的一条 NDEF 记录完成身份认证而承载该 NDEF 记录的文件受 16 字节密码保护ST25TA 的 Read Protection 机制。该模式支持四类操作读取READ通过 ISO 14443A 防碰撞选取 ST25TA 标签仿真SIM仿真已读取 UID 的标签基础 UID 级仿真转储DUMP将提取出的密码输出到 USB 调试通道需要客户端连接仿真器EMUL完整标签仿真使用捕获到的 NDEF 数据含密码响应读卡器命令。提取出这 16 字节密码后即可克隆标签或对其进行完整仿真——适用于制作备用钥匙或对该门锁机制做安全研究。二、四个模式的执行机制How根据 hf_tcprst.md 的说明四个模式的工作机制如下READ通过 ISO 14443A 防碰撞选取 ST25TA 标签发送 NDEF SELECT 命令读取包含 16 字节密码的 NDEF 文件。SIM仿真之前读取到的 UID基础 UID 级仿真。DUMP把提取出的密码经 USB debug 输出需要客户端连接。EMUL完整标签仿真——用捕获的 NDEF 数据含密码响应读卡器命令。从 源码实现 看这四个阶段并不是简单并列的而是被组织成一条自动流转的流水线READ 选中 ST25TA 后自动切入 SIMSIM 拿到密码后自动切入 DUMPDUMP 成功后自动切入 EMUL最终形态是一枚可用的 Rothult 主钥匙仿真器。三、LED 指示与按键操作3.1 LED 指示LED含义A常亮READ 模式B常亮SIM 模式UID 仿真C常亮DUMP 模式D常亮EMUL 模式完整仿真A-D顺序轮转的活动模式指示值得注意的差异源码中的注释 采用另一种 LED 组合方案——AD表示 reading 模式、AC表示 simulation 模式用于窃取 Read Protection key、CD表示 dump 模式、C表示 emulation 模式而B表示收发活动receiving/sending。文档表格与源码注释是两套描述实操时建议以固件实际点亮的 LED 组合为准。3.2 按键控制操作效果单击切换到下一个模式READ→SIM→DUMP→EMUL→READ长按执行当前模式的动作从源码的主循环看hf_tcprst.c#L153-L166每次循环都会调用WDT_HIT()喂狗检查data_available()收到 USB 客户端命令则退出 standalone并用BUTTON_HELD(1000)判断按键长按BUTTON_HOLD会直接break退出 standalone 周期并回到正常模式。也就是说长按退出是该模式在代码层面真正硬编码的兜底行为而文档中长按执行当前模式动作的描述在流水线模式下更多体现为各阶段之间的自动推进。四、状态机与完整操作流原文档给出的状态机如下结合源码四个状态STATE_READ/SIM/DUMP/EMULhf_tcprst.c#L142-L148的完整操作流程可以归纳为一次偷钥匙闭环READ 阶段Proxmark3 作为 reader 搜索 ST25TA 标签通过iso14443a_select_card()完成选取匹配成功后保存 7 字节 UIDstuid并自动进入 SIMSIM 阶段Proxmark3 伪装成 Rothult 的 ST25TA 主钥匙。当它被放到 IKEA 门锁附近时门锁会主动向钥匙发起带密码的 VERIFY 认证此时 Proxmark3 截获门锁送来的16 字节 Read Protection key源码中gotkey true并置state STATE_DUMP见 hf_tcprst.c#L269-L277DUMP 阶段Proxmark3 再回到 reader 角色这次手握密码按顺序向卡片发送 5 条 APDUSelect 应用 → Select 文件 → Verify 无密码 → Verify 带密码 → Read NDEF最终读出 31 字节 NDEF 文件内容EMUL 阶段以捕获的 NDEF 数据作为响应体完整仿真原始 Rothult 主钥匙。任何阶段下只要客户端通过 USB 发来命令data_available()为真standalone 循环立即退出——这就是状态机中 USB connection → [*] 的出口。五、源码级实现解析5.1 ST25TA 卡片识别特征READ 阶段通过三个特征值联合判断一张 ISO 14443A 卡是否为 Rothult 所用的 ST25TAhf_tcprst.c#L104-L107 与 L178特征值说明SAK0x20表明是 ISO 14443A-4 兼容卡ATQA0x42 0x00NXP ST25TA 的厂商标识UID 长度7 字节双级联 UID三者全部匹配才认定为 ST25TA否则会打印 Found non-ST25TA card, ignoring. 并继续等待。这个UID 指纹同时被 SIM 阶段用于仿真SimulateIso14443aInit()的tagType 10正是 iso14443a.c 中 的 ST25TA IKEA Rothult 分支预设了ATQA 0x42, 0x00、SAK 0x20与识别端完全对称。5.2 DUMP 阶段的五条 APDUDUMP 模式hf_tcprst.c#L316-L364按固定顺序发送 5 条 APDU这也是 ST25TA NDEF 读取的标准 APDU 序列定义于 L81-L92#命令APDU 十六进制作用1SELECT应用00 A4 04 00 07 D2 76 00 00 85 01 01 00选取 NDEF 应用NFC Forum 标准 AID2SELECT文件00 A4 00 0C 02 00 01选取 NDEF 文件3VERIFY无密码00 20 00 01 00无密码验证受保护卡会返回 63 004VERIFY带密码00 20 00 01 10 00 16 字节密码用窃取到的 16 字节密码解锁读取5READ BINARY00 B0 00 00 1D读出 0x1D29字节 NDEF 文件内容第 5 步成功后代码校验响应体前缀为1B D10x1B是 NDEF TLV 长度前缀0x21为 NDEF 文件类型才置gotndef true随后把 31 字节的 NDEF 内容存入ndef缓冲并自动切到 EMUL。注意一个细节DUMP 循环中verify_pwd的 16 字节密码槽位正是 SIM 阶段从门锁那里memcpy进去的L270——先当钥匙偷密码再当读卡器拿数据的闭环在此闭合。5.3 SIM/EMUL 阶段的动态响应逻辑仿真主循环的结构很典型SimulateIso14443aInit()初始化 →iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN)切到监听路径 → 循环调用GetIso14443aCommandFromReader()收命令、EmSendPrecompiledCmd()发应答。对物理层命令REQA/WUPA/HALT/防碰撞/SELECT/RATS/PPS直接映射到SimulateIso14443aInit预生成的响应表索引枚举定义见 iso14443a.h#L99-L113 的RESP_INDEX_ATQA/UIDC1/UIDC2/SAKC1/SAKC2/ATS/PPS。对 ISO 14443A-4 层的逻辑命令首字节0x02/0x03的带奇偶校验 APDU模式进入动态应答分支只识别三条命令L259-L282收到的命令含奇偶位含义应答02 A2 B0 00 00 1D 51 69读卡器 READ BINARY读 NDEF回 32 字节命令回显 31 字节 NDEF 数据02 00 20 00 01 00 6E A9无密码 VERIFY回63 00认证失败——这正是真实卡的行为03 00 20 00 01 10 16 字节带密码 VERIFYSIM 阶段即在此截获密码回90 00成功其他0x02/0x03命令兜底回90 00SIM 与 EMUL 两段的差别仅在于SIM 段在收到带密码 VERIFY 时多执行gotkey true; state STATE_DUMP;把门锁送来的密码存下来EMUL 段则纯粹应答。所有动态应答发送前都会调用AddCrc14A()补 CRC 并用prepare_tag_modulation()做曼彻斯特调制预计算响应缓冲 64 字节、调制缓冲 512 字节L111-L112这与标准 14A tag 仿真路径SimulateIso14443aTag的实现一致。5.4 内存与栈优化细节代码中有两处值得注意的工程细节data[10]缓冲刻意从早期的PM3_CMD_DATA_SIZE624 字节缩小到 10 字节因为SimulateIso14443aInit()最多只从这里读 10 字节 UIDL116-L119仿真前后调用BigBuf_free_keep_EM()释放非仿真器内存避免与 trace 缓冲争抢内存池。这反映了 standalone 模式下 512KB Flash / 有限 RAM 的嵌入式约束。六、编译与烧录该模式在构建系统中的注册位置Makefile.hal 的模式清单HF_TCPRST | IKEA Rothult read/sim/dump/emul - Nick DraffenMakefile.inc 中的条件编译开关定义WITH_STANDALONE_HF_TCPRST时把hf_tcprst.c加入SRC_STANDALONE。由于 HF_TCPRST 不在STANDALONE_MODES_REQ_FLASH/REQ_BT等列表中Makefile.hal#L159-L161它不需要 RDV4 的 flash/BT 硬件即通用 Proxmark3 硬件即可编译运行Generic。官方文档给出的编译流程make clean make STANDALONEHF_TCPRST -j ./pm3-flash-fullimage其中make clean强制全量重编译避免残留其他 standalone 模式的目标文件同一固件一次只能含一个 standalone 模式除非使用 DANKARMULTI 加载器make STANDALONEHF_TCPRST等价于在 Makefile.hal#L162-L163 中追加-DWITH_STANDALONE_HF_TCPRST编译宏pm3-flash-fullimage 是仓库根目录的辅助脚本内部通过客户端执行--flash --image $FULLIMAGE完成烧录自动探测端口也支持-n N选择第 N 个设备和--list列端口。烧录后按 Standalone 模式开发指南 的通用说明连接设备、长按按钮触发 LED 提示并进入 standalone 模式若保持 USB 连接还能在客户端侧看到 standalone 模式的调试输出DbpString/Dbhexdump打印的所有 Proxmark command/Card answer/Reader sent password 内容这对验证四个阶段的流转非常有用。模式识别字符串由 ModInfo() 定义客户端执行hw status时可据此确认固件中安装的 standalone 模式。七、适用限制与相关模式仅限 Rothult 场景识别逻辑硬编码了SAK0x20 / ATQA0x42,0x00 / 7 字节 UID三重条件其他 ST25TA 配置如 ATQA 不同或 UID 长度不同的标签不会被拾取依赖门锁配合SIM 阶段的密码截获需要把 Proxmark3 贴近真实 IKEA Rothult 门锁由门锁主动发起带密码 VERIFY脱离实物门锁无法完成完整闭环DUMP 输出依赖 USB密码经DbpString/Dbhexdump走 USB 调试通道打印纯离线场景只能看 LED 与屏幕输出完整流水线在 EMUL 成功后循环等待长按按钮即可退出 standalone 周期L160-L164。与本文相关的其他 Standalone 模式ST25TB Tear-Off — 同属 NXP ST25 系列的标签操作ST25TB 存储/恢复MIFARE Classic Simulator — 另一个 HF 标签仿真器可对比其从 flash 槽位加载仿真的实现思路Standalone 模式总索引与开发指南 — 全部模式的汇总表HF_TCPRST 位于 HF 分类第 24 行标注 Hardware 为 Generic及新模式的开发流程。【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考