FEATURED · 精选文章

Proxmark3 Standalone 模式 HF_LEGIC:Legic Prime 读卡-重放全自动模式的实现剖析

发布时间 / 2026/9/17 12:29:03
来源 / 创域科博编辑部
栏目 / 资讯中心
Proxmark3 Standalone 模式 HF_LEGIC:Legic Prime 读卡-重放全自动模式的实现剖析 Proxmark3 Standalone 模式 HF_LEGICLegic Prime 读卡-重放全自动模式的实现剖析【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3本文基于 Proxmark3Iceman Fork仓库中 doc/standalone/hf_legic.md 的说明文档结合 armsrc/Standalone/hf_legic.c、armsrc/legicrf.c、armsrc/legicrfsim.c 等源码完整剖析 HF_LEGIC 独立Standalone模式如何在脱离 PC 客户端的情况下自动搜索、读取并原样回放 Legic Prime 高频无接触卡片。读完后你将理解该模式的状态机、LED/按键交互、卡片类型自动检测0x0D/0x1D/0x3D、转储文件的 SPIFFS 闪存持久化以及从读取到模拟的完整调用链。一、模式定位为什么需要独立的 Legic Prime 读/仿模式文档首先给出了模式的基本属性作者uhei频率HF13.56 MHz硬件Generic Proxmark3通用型即可不强制要求 RDV4 闪存卡功能读取 Legic Prime 标签并模拟之自动检测卡片类型文档中记为 MIM256 / MIM512 / MIM1024Legic Prime 是一种用于欧洲门禁、考勤和自动售货系统的专有 HF 无接触技术。HF_LEGIC 模式的价值在于提供独立读-放read-and-replay能力不需要连接电脑、不需要 PC 端脚本参与PM3 自身即可完成发现卡片 → 转储内存 → 广播重放的闭环。从源码构建配置看armsrc/Standalone/Makefile.hal 中列出了三个 Legic 相关模式模式说明HF_LEGIC读/仿 Legic Prime 标签本文主角HF_LEGIC_RDV4读/仿 Legic Prime 标签RDV4 闪存版HF_LEGICSIM模拟闪存中的 Legic Prime 转储多槽位其中HF_LEGIC_RDV4与HF_LEGICSIM被列入 Makefile.hal 中的STANDALONE_MODES_REQ_FLASH要求带闪存的硬件而HF_LEGIC本身属于普通独立模式这与文档标注Hardware: Generic Proxmark3一致。各模式对应的编译宏如WITH_STANDALONE_HF_LEGIC在 armsrc/Standalone/Makefile.inc 中定义。二、工作流程Search → Read → Simulate文档给出的三步流程是Search搜索持续扫描 Legic Prime 标签Read读取检测到卡片后转储标签内存自动检测其尺寸Simulate模拟广播所捕获的标签数据。文档同时给出 LED 与按键的交互约定LED 指示LED含义C常亮正在搜索标签A B C常亮正在读取标签A D常亮正在模拟标签按键控制操作效果长按 280ms退出独立模式USB 命令退出独立模式对应的状态机继承自文档三、RunMod 主循环状态机的源码级实现独立模式的入口是 hf_legic.c 中的RunMod()其结构与上面的状态机一一对应void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); Dbprintf([] HF Legic Prime Read/Simulate Started ); DbpString([] press and HOLD button to exit standalone mode); for (;;) { WDT_HIT(); // exit from hf_legic, send usbcommand if (data_available()) break; // Was our button held down or pressed? int button_pressed BUTTON_HELD(280); if (button_pressed BUTTON_HOLD) { break; } LEDsoff(); LED_C_ON(); ...要点逐条说明StandAloneMode()FpgaDownloadAndGo(FPGA_BITSTREAM_HF)进入独立运行上下文并加载 HF 位流。后续读取/模拟阶段各自还会再次配置 FPGA 模式见下文init_reader()/init_tag()。WDT_HIT()每轮喂狗防止看门狗复位——独立模式下没有主机监管这一点是硬性要求。data_available()与BUTTON_HELD(280)这正是文档中USB 命令退出和长按 280ms 退出两条退出路径的实现。阈值 280 直接对应文档表格中的280ms。搜索阶段点亮 LED C进入找卡直到读成功或按钮按下的 do-while 循环见下节。退出收尾熄灭 LED打印从闪存取回转储文件的说明DownloadLogInstructions()仅WITH_FLASH编译时存在并以FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF)关闭 FPGA。四、搜索与读取LegicRfReaderEx 的自动类型检测文档称自动检测卡片尺寸其实现就在搜索循环里// search for legic card until reading successful or button pressed do { LED_C_ON(); SpinDelay(500); // We dont care if we read a MIM256, MIM512 or MIM1024 // we just read 1024 bytes read_success LegicRfReaderEx(0, 1024, 0x55); } while ((read_success PM3_ESOFT) (BUTTON_PRESS() false));源码注释点破了实现技巧不区分具体型号一律按 1024 字节请求读取LegicRfReaderEx内部会根据握手阶段协商出的卡型把长度钳制到实际卡容量见 legicrf.c 中的if (len offset card.cardsize) { len card.cardsize - offset; }。0x55是初始化向量IV用于与卡片建立共享伪随机序列返回PM3_ESOFT表示未检测到卡循环重试直到成功或用户按键。4.1 读端初始化与三向握手legicrf.c 的setup_phase()注释写明握手结构发送初始化向量7 bit接收卡片类型6 bit发送混淆的应答帧6 bit时序上先开载波让卡片充电约 5ms然后初始化 PRNGcommon/legic_prng.c 实现的 Legic 专用伪随机数发生器、发出 IV再接收 6 位卡型并按卡型回复不同的混淆 ACK0x0D 型回复 0x190x1D/0x3D 型回复 0x39。4.2 卡型到内存布局的映射自动检测的落点是 legicrf.c 的init_card()switch (p_card-tagtype) { case 0x0d: p_card-cmdsize 6; p_card-addrsize 5; p_card-cardsize 22; break; case 0x1d: p_card-cmdsize 9; p_card-addrsize 8; p_card-cardsize 256; break; case 0x3d: p_card-cmdsize 11; p_card-addrsize 10; p_card-cardsize 1024; break; default: ... return PM3_ESOFT; }从源码结构看三个 tag type 标识0x0D / 0x1D / 0x3D分别映射到 22 / 256 / 1024 字节的卡片内存与 6 / 9 / 11 位命令字文档中MIM256 / MIM512 / MIM1024的说法即对应这三档容量等级以代码中的cardsize数值为准确切基准。检测出的元数据存放在legic_card_select_t结构中定义见 include/legic.htypedef struct { uint8_t uid[4]; uint32_t tagtype; uint8_t cmdsize; uint8_t addrsize; uint16_t cardsize; } PACKED legic_card_select_t;读取循环还会把前 4 个字节填入card.uidLegic Prime 前导即 UID/MCD 区因此一次读取同时完成了类型检测、UID 提取与内存转储。4.3 物理层背景PRNG 与位定时legicrf.c 头部注释解释了该协议为何复杂Legic Prime 的空口数据由 PRNG 混淆PRNG 每 100us一个 TAG_BIT_PERIOD推进一次读端发送时 0 位与 1 位时长不同约 60us / 100usPRNG 需按接收到的每一位推进代码用共享时间戳last_frame_end协调收发时隙。这些常量如TAG_FRAME_WAIT 495即 330us 回读间隔是独立模式能稳定读卡的地基也是该模式只能在真实硬件上可靠调试的原因——源码注释明确建议先在实验室连着 PM3 客户端试跑再带出去现场。五、转储持久化SPIFFS 闪存中的 hf-legic-UID-dump.bin文档的读取阶段隐含一个关键产物转储文件。hf_legic.c 的save_dump_to_file()说明读取结果被 Legic 读函数放入 BigBuf 的仿真器保留内存BigBuf_get_EM_addr()文件名由 UID 生成hf-legic-%02X%02X%02X%02X-dump.bin取p_card-uid[0..3]若同名文件已存在则追加序号-1.bin、-2.bin……避免覆盖通过rdv40_spiffs_write()写入 SPIFFS 闪存。文件头部注释hf_legic.c还给出了配套运维命令# 列出闪存中所有转储文件 mem spiffs tree # 把闪存中的转储文件拷回 PC 客户端 mem spiffs dump -s hf-legic-XXYYZZWW-dump.bin -d hf-legic-XXYYZZWW-dump.bin # 删除闪存中的转储文件 mem spiffs remove -f hf-legic-XXYYZZWW-dump.bin需要注意整段闪存逻辑包裹在#ifdef WITH_FLASH中——未启用闪存编译时读取仍可进行但不会落盘。这也是HF_LEGIC与HF_LEGIC_RDV4两个构建变体并存的原因。六、模拟阶段把捕获的卡片搬上 MIM1024 重放读取成功后主循环取出卡片信息并调用模拟hf_legic.clegic_card_select_t *p_card getLegicCardInfo(); if (p_card-cardsize 0) continue; save_dump_to_file(p_card); LED_D_ON(); uint8_t ct; switch (p_card-tagtype) { case 0x0D: ct 0; break; case 0x1D: ct 1; break; case 0x3D: ct 2; break; default: continue; } // The read data is migrated to a MIM1024 card LegicRfSimulate(ct, false);这里做了两件事把读端识别出的 tag type0x0D/0x1D/0x3D换算成模拟端使用的档位索引 0/1/2然后调用 legicrfsim.c 的LegicRfSimulate(ct, false)。模拟端的init_card()按同一档位索引还原出完全一致的内存布局见 legicrfsim.c档位 0/1/2 对应 22/256/1024 字节并点亮 LED AD——与文档 LED 表中A D 正在模拟吻合。模拟端的工作循环LegicRfSimulateinit_tag()配置 FPGA 为FPGA_MAJOR_MODE_HF_SIMULATOR212kHz 调制并刻意保留 EM 内存FpgaDownloadAndGo_keep_EM因为转储数据就存放在BigBuf_get_EM_addr()中等待读端载波RWD_PULSE随后执行与读端镜像的setup_phase()接收 7 位 IV → 发送 6 位卡型 → 校验 6 位 ACK档位 0 期望 0x19档位 1/2 期望 0x39见 legicrfsim.c连接建立后进入connected_phase()处理读端的读/写命令直到失败、按键或超时源码注释The read data is migrated to a MIM1024 card表明实现策略把读到的数据按统一的大卡视图迁移后重放从而用一个模拟路径覆盖三种卡型。LegicRfSimulate的第二参数send_reply在独立模式传false——重放的是卡片侧行为不附带主机侧回复。七、编译、刷写与相关模式继承文档的编译步骤以仓库根目录为工作目录make clean make STANDALONEHF_LEGIC -j ./pm3-flash-fullimage其中STANDALONEHF_LEGIC会经 Makefile.hal 映射为独立模式宏WITH_STANDALONE_HF_LEGIC见 Makefile.inc最终由 pm3-flash-fullimage 脚本烧录整镜像。若你的设备是 RDV4带外挂闪存且希望转储直接落盘可改刷STANDALONEHF_LEGIC_RDV4变体。相关模式Legic Prime 多槽模拟器hf_legicsim.mdHF_LEGICSIM从 SPIFFS 加载最多 15 个 1024 字节转储槽位短按切槽、500ms 长按退出——它与 HF_LEGIC 形成现场采集本模式→ 离线多卡重放legicsim的分工。模式索引与开发指南armsrc/Standalone/readme.md各独立模式的总入口与新增模式开发说明。八、要点速查项内容依据模式名HF_LEGIC另有无闪存差异的HF_LEGIC_RDV4、多槽HF_LEGICSIMMakefile.hal退出方式长按 280ms 或 USB 命令data_available()hf_legic.c搜索循环LegicRfReaderEx(0, 1024, 0x55)失败PM3_ESOFT则重试hf_legic.c卡型自动检测握手返回 0x0D/0x1D/0x3D → 22/256/1024 字节legicrf.c转储文件hf-legic-UID-dump.bin同名自动加序号写入 SPIFFShf_legic.c模拟档位换算0x0D→0、0x1D→1、0x3D→2 →LegicRfSimulate(ct, false)hf_legic.c刷写命令make STANDALONEHF_LEGIC -j ./pm3-flash-fullimage本文档 Compilation 一节适用前提小结HF_LEGIC 适用于通用型 Proxmark3 固件构建转储落盘与mem spiffs运维命令依赖WITH_FLASH编译及带闪存的硬件由于 Legic 空口协议强依赖微秒级 PRNG 时序建议先在实验室连接 PM3 客户端验证读卡稳定性后再部署到实际现场。【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻