Proxmark3 LF_HIDBRUTE 独立模式HID Corporate 100035-bit卡号暴力枚举与克隆实战解析【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3本文以 Proxmark3 独立模式LF_HIDBRUTE的官方文档doc/standalone/lf_hidbrute.md为主体结合源码 armsrc/Standalone/lf_hidbrute.c 逐层解析该模式的工作原理如何读取一张 HID Corporate 100035-bit卡、保留其设施码Facility Code对卡号进行递增/递减枚举、把捕获的凭据克隆到 T55x7 可编程标签。读完本文你将完整掌握该模式的按钮操作、LED 状态指示、状态机流转、校验位计算实现与固件编译烧录流程。一、模式定位什么是 LF_HIDBRUTELF_HIDBRUTE别名 Corporatebrute是 Proxmark3 的 LF125 kHz独立运行模式由 Federico Dotta 与 Maurizio Agazzini 开发。所谓“独立模式”Standalone Mode指固件不依赖上位机客户端即可在设备上自主运行仅通过按键与 LED 交互。它的工作目标按文档与源码头部注释的完整描述是读取一张 HID Corporate 100035-bit卡片捕获其设施码Facility Code与卡号Card Number克隆捕获的凭据到 T55x7 系列可编程标签T5557/T5567暴力枚举卡号部分递增/递减同时保持设施码不变向读卡器连续发送伪造的 FSK2 信号。源码文件头部armsrc/Standalone/lf_hidbrute.c#L17-L29说明了它的设计渊源该模式的思想源自 Brad AntoniewiczMcAfee Foundstone 专业安全服务提出的 ProxBrute——先读取一张合法标签然后在保留合法前缀的前提下枚举卡号。LF_HIDBRUTE是对 ProxBrute 的重写核心改进在于正确处理了奇偶校验位parity bits克服了原版 ProxBrute 固件不考虑 parity 位的局限。这一点在后面的校验位计算小节中会看到具体实现。1.1 为什么枚举卡号是有意义的HID Corporate 1000 使用 35-bit 格式由设施码和卡号两部分组成。如果你能读取一张卡通常也就知道了该场地的设施码。在此基础上对卡号做连续枚举可以用来权限探测在同设施码下寻找更高权限的卡号邻近徽章发现围绕一张已知合法卡号向两侧遍历相邻编号门禁系统测试验证读卡器/控制器是否放行了连号但未实际下发的卡号。这是渗透测试中对“发卡策略是否只校验格式与范围、而不校验是否已发放”的典型验证手段。适用前提是你已能合法读取目标场地的一张 Corporate 1000 卡且对系统拥有测试授权。二、运行流程总览文档给出的三步操作法为Record记录将 HID Corporate 1000 卡靠近天线读入设施码 卡号Clone克隆把捕获的凭据写入 T55x7 标签Brute枚举以相同设施码连续模拟发送递增/递减后的卡号。整个过程中设施码保持为首次记录卡片的值只迭代卡号部分。下面逐一对应到源码。三、主循环三插槽、按键与 USB 退出模式主入口是 RunMod()其关键结构如下节选自 armsrc/Standalone/lf_hidbrute.c#L52-L72void RunMod(void) { StandAloneMode(); Dbprintf( LF HID corporate bruteforce a.k.a CorporateBrute Started ); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); // 加载 LF 位流 uint32_t high[OPTS], low[OPTS]; // OPTS 3三个存储插槽 int selected 0; // 当前选中插槽 ... for (;;) { WDT_HIT(); // 喂看门狗 // 收到 USB 数据即退出独立模式客户端可接管设备 if (data_available()) break; int button_pressed BUTTON_HELD(280); // 按钮按下并持有 280ms if (button_pressed ! BUTTON_HOLD) continue; ...几个与文档直接对应的实现事实三个插槽#define OPTS 3armsrc/Standalone/lf_hidbrute.c#L43high[3]/low[3]数组分别存放各插槽捕获的 32 位高字与低字。这就是文档 LED 表中 “Slot 0/1/2” 的来源——LED A/B/C 分别表示插槽 0/1/2 被选中LED(selected 1, 0)。280ms 长按判定BUTTON_HELD(280)与文档 “Hold 280ms — Advance state” 完全一致。USB 命令退出if (data_available()) break;对应文档的 “USB command — Exit standalone mode”这也是独立模式开发规范armsrc/Standalone/readme.md要求每个RunMod必须检查 USB 命令的原因保证 pm3 客户端随时能打断独立模式。FPGA 位流启动时FpgaDownloadAndGo(FPGA_BITSTREAM_LF)切到 125 kHz 低频位流与文档 “Frequency: LF (125 kHz)” 相符。ModInfo()则输出模式识别字符串客户端执行hw status时可据此确认设备上烧录的是 Corporatebrute 模式armsrc/Standalone/lf_hidbrute.c#L47-L49void ModInfo(void) { DbpString( LF HID corporate 1000 bruteforce - aka Corporatebrute (Federico dotta Maurizio Agazzini)); }四、记录与克隆lf_hid_watch 和 CopyHIDtoT55x74.1 读取卡片当尚未捕获卡片cardRead 0且检测到长按时主循环调用lf_hid_watcharmsrc/Standalone/lf_hidbrute.c#L85lf_hid_watch(1, high[selected], low[selected], true); Dbprintf([] recorded %x %x %08x, selected, high[selected], low[selected]);lf_hid_watch定义于 armsrc/lfops.c#L1296是 LF HID 实时监听/解调例程它通过LFSetupFPGAForADC(LF_DIVISOR_125, true)把 FPGA 配置为 125 kHz 监听模式在BigBuf中采集并解调 FSK2 信号把识别出的标签 ID 按high/low两个 32 位字返回期间若收到 USB 命令或按键则中止。对 35-bit 标签前 3 位存入high低三位后 32 位存入low。读取成功后cardRead置 1LED 显示 “当前插槽 D 灯” 的组合状态见下一节。4.2 克隆到 T55x7再次长按cardRead 1分支armsrc/Standalone/lf_hidbrute.c#L95-L116触发克隆Dbprintf([] cloning %x %x %08x, selected, high[selected], low[selected]); WAIT_BUTTON_RELEASED(); CopyHIDtoT55x7(0, high[selected], low[selected], 0, false, false, true);CopyHIDtoT55x7定义于 armsrc/lfops.c#L2313声明见 armsrc/lfops.h#L56它根据hi2/hi/lo三个 ID 字与longFMT标志构建 T55x7 数据块对非长格式取hi的高 12 位 lo的 32 位共 44 位上限HID 35-bit 卡落在这一分支写入曼彻斯特编码后的波形数据从而让 T5557/T5567 标签以 FSK2 方式回放与源卡相同的信号。这里longFMT 0q5/em均为false与 35-bit Corporate 1000 的编码参数相符。五、暴力枚举卡号/设施码拆分、双向往程与发送5.1 进入枚举分支的前置校验主循环中“播放playing”逻辑对插槽 0/1 执行直接模拟而插槽 2 被专门留作暴力枚举armsrc/Standalone/lf_hidbrute.c#L130-L152。进入枚举前先做格式校验armsrc/Standalone/lf_hidbrute.c#L158-L161// Check if the badge is an HID Corporate 1000 if ((high[selected] 0xFFFFFFF8) ! 0x28) { DbpString([-] Card is not a HID Corporate 1000. Skipping bruteforce.); continue; }只有符合 35-bit Corporate 1000 特征的记录才进入枚举否则直接跳过并打印提示——这解释了源码注释 “It is necessary only to calculate the correct parity”对其它格式需另行计算正确的 parity。5.2 从 high/low 拆出设施码与卡号枚举开始前从捕获的high/low中还原出两个字段armsrc/Standalone/lf_hidbrute.c#L168-L171uint32_t cardnum (low[selected] 1) 0xFFFFF; // 20-bit 卡号 uint32_t fc ((high[selected] 1) 11) | (low[selected] 21); // 12-bit 设施码 uint32_t original_cardnum cardnum;卡号Card Number取low字第 1~20 位共20 位即0x00000~0xFFFFF的取值空间设施码Facility Code12 位由low字第 21~32 位low 21与high字最低位high 1左移到第 11 位拼合而成。这正是文档所述 “brute forcing the card number up/down while preserving the facility code” 的实现基础fc全程不变只有cardnum迭代。5.3 先递减后递增的两个 while 循环枚举分两段armsrc/Standalone/lf_hidbrute.c#L173-L229第一段从原始卡号向下递减到 0Dbprintf([] HID brute - starting decrementing card number); while (cardnum 0) { if (BUTTON_PRESS()) { if (BUTTON_HELD(1000) BUTTON_HOLD) goto out; // 长按 1s 退出模式 else { while (BUTTON_PRESS()) WDT_HIT(); break; } // 短按停止枚举 } cardnum--; hid_corporate_1000_calculate_checksum_and_set(high[selected], low[selected], cardnum, fc); Dbprintf([] TAG ID: %x%08x (%d) - FC: %u - Card: %u, ...); CmdHIDsimTAGEx(0, high[selected], low[selected], 0, 1, 50000); }第二段从原始卡号向上递增到 0xFFFFFcardnum original_cardnum; Dbprintf([] HID brute - starting incrementing card number); while (cardnum 0xFFFFF) { ... // 同样的按键退出/中止逻辑 cardnum; hid_corporate_1000_calculate_checksum_and_set(high[selected], low[selected], cardnum, fc); ... CmdHIDsimTAGEx(0, high[selected], low[selected], 0, 1, 50000); }关键实现细节行为源码依据说明每个候选卡号发送 50000 个周期CmdHIDsimTAGEx(..., 1, 50000)固定时窗内持续模拟覆盖读卡器单次感应时窗过后自动换下一个卡号短按按键中止当前枚举BUTTON_PRESS()break提前退出 while 循环返回插槽轮转逻辑长按 1 秒退出整个模式BUTTON_HELD(1000) BUTTON_HOLD→goto outout标签处闪烁 A/B/C/D 四灯并打印 “exiting”每步打印 TAG ID / FC / CardDbprintf([] TAG ID: ...)调试串口可实时观察枚举进度每步重算校验位hid_corporate_1000_calculate_checksum_and_set(...)见下一节发送底层为CmdHIDsimTAGExarmsrc/lfops.c#L996-L1033。其头部注释完整描述了 HID 标签的位流格式标签以 FSK2a 方式发送曼彻斯特编码的 IDbit 1 fc10、bit 0 fc8即两个时钟频率 125 kHz/100 kHz 交替每 4 位前插入一个 fc8 分隔符帧首使用 8 个特殊前导位0,0,0,1,1,1,0,1。对非长格式标签hi只取高 12 位 lo的 32 位共 44 位上限35-bit Corporate 1000 恰好在此范围内。枚举模式下numcycles 50000即每次模拟固定 50000 个波形周期后返回实现“定时探测”效果。5.4 枚举空间与速度的量级感知20-bit 卡号空间意味着理论上限约 104 万2²⁰个候选值向 0 递减与向0xFFFFF递增两个方向合计最多约 2×N 次N 为原始卡号到边界的距离。每次候选发送 50000 周期且源码在两个方向间没有额外插入SpinDelay对比 lf_prox2brute.c 中用 LED 翻转指示进度的 64 次循环设计从源码结构看枚举节奏完全由 50000 周期的发送时窗决定。如果目标不在连号区间内完整双向枚举将耗时相当长因此实战中更常见的用法是贴近已知合法卡号的小范围试探或依赖短按随时中止。六、校验位计算Corporate 1000 格式的核心LF_HIDBRUTE相对原版 ProxBrute 的核心增量是 hid_corporate_1000_calculate_checksum_and_set() 函数。它把给定的cardnumfc重新组装为high/low两个 32 位字并正确填入 Corporate 1000 的三个 parity 位// 1) 无 parity 的基值 new_low (fc 21) | (cardnum 1); new_high (fc 11) 1; // 2) parity bit 34偶校验统计 0xB6DB6DB6 掩码下 low 的 1 的个数 high 最低位 uint32_t parity_bit_34_low new_low 0xB6DB6DB6; // 101101101101...0110 ... if (n_ones % 2) new_high new_high | 0x2; // bit 34 置 1使参与位总 1 数为偶数 // 3) parity bit 1奇校验统计 0x6DB6DB6C 掩码下的 1 的个数 uint32_t parity_bit_1_low new_low 0x6DB6DB6C; // 011011011011...01100 ... if (!(n_ones % 2)) new_low new_low | 0x1; // bit 1 置 1使参与位总 1 数为奇数 // 4) parity bit 35奇校验统计 low 全部位 high 已置位的 1 的个数 ... if (!(n_ones % 2)) new_high new_high | 0x4; // bit 35 置 1 // 5) 追加 HID 前导码 add_HID_preamble(0, new_high, new_low, 35);实现要点字段打包new_low (fc 21) | (cardnum 1)与提取式fc ((high1)11) | (low21)、cardnum (low1)0xFFFFF互为逆运算new_high的最低位承载fc的第 12 位第 1、2 位0x2、0x4分别存放 parity bit 34 与 bit 35。三个 parity 位bit 34 采用偶校验参与位 1 的个数为奇时置 1bit 1 与 bit 35 采用奇校验参与位 1 的个数为偶时置 1参与位由两个交错掩码0xB6DB6DB6与0x6DB6DB6C选取——这两个互补的 0101 交替掩码正是 HID 格式“按位置奇偶分组”的体现。1 的个数统计采用逐位左移计数for (i 1; i ! 0; i 1)而非__builtin_popcount保证不依赖编译器内置函数贴合嵌入式移植习惯。前导码最后调用add_HID_preamble(0, new_high, new_low, 35)按 35 位长度追加 HID 帧前导输出的high/low即可直接交给CmdHIDsimTAGEx发送。正因为每换一个卡号都重算 parity 位模拟出的每个候选信号对读卡器而言都是格式合法的 HID Corporate 1000 帧这正是文件头注释强调的“overcome some limitations of ProxBrute firmware, that does not consider parity bits”。七、LED 指示与按键操作文档原表LED 指示LED含义A常亮Slot 0 选中 / 克隆进行中B常亮Slot 1 选中 / 模拟进行中C常亮Slot 2 选中D常亮状态指示LED(slot1)表示记录期间当前激活的插槽对应源码选中插槽用LED(selected 1, 0)点亮克隆阶段点LED(LED_A, 0)模拟/枚举阶段点LED(LED_B, 0)读取后追加LED(LED_D, 0)。按键操作动作效果长按 280ms推进状态select → record → clone/brute → repeatUSB 命令退出独立模式源码中还包含文档未逐字列出、但操作时值得知道的按键细节枚举进行中短按会中止当前方向的枚举回到插槽轮转长按 1 秒则直接退出整个模式goto out后 A/B/C/D 四灯闪烁 5 次见 armsrc/Standalone/lf_hidbrute.c#L248-L252。八、状态机文档给出的状态流转如下与源码主循环分支一一对应用源码分支映射各状态cardRead 0分支即 RecordcardRead 1分支即 Cloneplaying selected ! 2分支为 Slot 0/1 的直接模拟playing selected 2分支即 BruteForceUSB 数据到达在任何状态都会break主循环退出模式。九、编译与烧录LF_HIDBRUTE位于STANDALONE_MODES列表中armsrc/Standalone/Makefile.hal#L44-L46 有模式说明表项armsrc/Standalone/Makefile.hal#L155-L158 有编译列表条件编译开关为WITH_STANDALONE_LF_HIDBRUTE对应源文件在 armsrc/Standalone/Makefile.inc#L40-L43# WITH_STANDALONE_LF_HIDBRUTE ifneq (,$(findstring WITH_STANDALONE_LF_HIDBRUTE,$(APP_CFLAGS))) SRC_STANDALONE lf_hidbrute.c endif按文档给出的命令构建并烧录make clean make STANDALONELF_HIDBRUTE -j ./pm3-flash-fullimage构建注意事项来自 armsrc/Standalone/readme.md 的开发规范同一固件只能编译一个独立模式。需要同时保留多个模式时应使用 DANKARMULTI 多模式加载器将多个模式打包进同一个固件镜像LF_HIDBRUTE在 tools/build_all_firmwares.sh 的批量构建列表中被标记为Generic硬件模式不依赖 RDV4 的 flash/蓝牙等特有功能普通 Proxmark3 硬件即可运行该模式文档位于“AI-generated 个体模式文档”区块readme 提示其中信息可能与源码存在出入——本文所有关键结论280ms 长按、50000 周期发送、0x28 格式校验、parity 掩码等均已与 lf_hidbrute.c 源码逐项核对一致。十、相关模式与延伸阅读同一生态下的相邻能力可对照使用SamyRunlf_samyrun.cHID 26-bit 的读/克隆/模拟共用lf_hid_watch/CopyHIDtoT55x7基础设施HID FC Brutelf_hidfcbrute.c方向相反——固定卡号枚举设施码0~255需要 RDV4 flash 硬件ProxBrutelf_proxbrute.c与 Prox2Brutelf_prox2brute.cHID ProxII26-bit卡号枚举Prox2 版本带 LED 进度指示HID Downgrade Attacks读卡器降级方法常与 LF 枚举类攻击组合用于门禁评估。全部独立模式一览及开发指南见 armsrc/Standalone/readme.md模式总索引中LF_HIDBRUTE的条目为“HID Corporate 1000 card number bruteforceGeneric 硬件”。十一、小结LF_HIDBRUTE是一个“读一张卡、测一片号段”的垂直工具它把 35-bit Corporate 1000 的字段结构12-bit 设施码 20-bit 卡号 3 个 parity 位在 hid_corporate_1000_calculate_checksum_and_set() 中完整建模配合 CmdHIDsimTAGEx() 的固定周期发送窗口实现了对同设施码下连号卡号的合法格式枚举同时复用 lf_hid_watch() 与 CopyHIDtoT55x7() 完成记录与 T55x7 克隆三者构成了独立的 3 插槽操作闭环。理解这套实现后阅读仓库中其它 LF 枚举模式ProxBrute、HID FC Brute 等的源码将基本无障碍。【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
