ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Proxmark3 LF_NEDAP_SIM:Nedap 125 kHz 门禁标签独立模拟模式实战解析

Proxmark3 LF_NEDAP_SIM:Nedap 125 kHz 门禁标签独立模拟模式实战解析 Proxmark3 LF_NEDAP_SIMNedap 125 kHz 门禁标签独立模拟模式实战解析【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3本文基于 doc/standalone/lf_nedap_sim.md 与 armsrc/Standalone/lf_nedap_sim.c 的完整源码讲解 Proxmark3Iceman Fork中LF_NEDAP_SIM独立模式Standalone Mode的工作原理它如何在无 PC 的环境下编码一个带 CRC 与奇偶校验的 Nedap 标签支持 64/128 位两种格式并通过 LF 射频调制持续模拟给读卡器。读完你可以修改内置标签参数、独立编译该固件并刷入设备同时理解 Nedap 编码中数字翻译表、CRC16 XMODEM 校验与 Biphase 反相信号生成的完整调用链。模式定位What 与 WhyLF_NEDAP_SIM是一个低频125 kHz独立模拟模式运行在 Proxmark3 本体固件上不依赖上位机。它的核心能力模拟一个硬编码 ID 的 Nedap RFID 标签同时支持 64 位与 128 位long两种 Nedap 帧格式帧结构包含正确的 CRC 与成帧Nedap 是一种在欧洲仍有部署但相对小众的门禁系统。相比 HID 等协议Nedap 卡更难获取因此内置一个已知标签模拟器可以低成本地测试 Nedap 读卡器的识别行为。该模式在固件中注册为LF_NEDAP_SIM由 armsrc/Standalone/Makefile.inc 通过编译开关WITH_STANDALONE_LF_NEDAP_SIM决定是否把lf_nedap_sim.c编入镜像# WITH_STANDALONE_LF_NEDAP_SIM ifneq (,$(findstring WITH_STANDALONE_LF_NEDAP_SIM,$(APP_CFLAGS))) SRC_STANDALONE lf_nedap_sim.c endif需要遵循 Proxmark3 独立模式的基本约束一次只能编译一个 standalone 模式除非使用 DANKARMULTI 加载器详见 armsrc/Standalone/readme.md。标签数据结构与默认值模式模拟的标签用一个简单结构体描述源码中的NEDAP_TAGtypedef struct _NEDAP_TAG { uint8_t subType; // 子类型4 bit uint16_t customerCode; // 客户代码12 bit uint32_t id; // 标签 ID5 位十进制数 uint8_t bIsLong; // 1 128 位 long 格式 } NEDAP_TAG, *PNEDAP_TAG;固件中硬编码的默认标签为const NEDAP_TAG Tag {.subType 0x5, .customerCode 0x123, .id 42424, .bIsLong 1};即subType5、customerCode0x123、id42424、isLong1128 位格式。这三个字段对应上位机lf nedap命令组的--st、--cc、--id参数参见 client/src/cmdlfnedap.c取值范围与独立模式保持一致subType 0–15、customerCode 0–4095、id 0–999995 位十进制数。Nedap 编码原理数字拆分、翻译表与 CRC模式的核心函数是NedapGen()lf_nedap_sim.c#L118-L175它与上位机 client/src/cmdlfnedap.c#L304-L361 中的同名函数逐行一致保证离线生成的比特流与lf nedap sim命令完全相同。编码过程分三步1. ID 拆位与索引链5 位 ID 被拆成 5 个十进制位r1..r5再递推生成 5 个索引uint8_t idxC1 r1; uint8_t idxC2 (idxC1 1 r2) % 10; uint8_t idxC3 (idxC2 1 r3) % 10; uint8_t idxC4 (idxC3 1 r4) % 10; uint8_t idxC5 (idxC4 1 r5) % 10;每个索引再通过一张固定的 10 项非线性映射表转换成 4 bit 编码static const uint8_t translateTable[10] {8, 2, 1, 12, 4, 5, 10, 13, 0, 9};2. 首帧拼装 CRC16 XMODEM 校验buffer[0..4]依次装入0xC0 | subType帧头标志 4 位子类型、12 位 customerCode分两个 nibble、以及翻译后的 5 个 ID 位随后对前 5 字节计算 CRCinit_table(CRC_XMODEM); uint16_t checksum crc16_xmodem(buffer, 5);CRC 的 16 个数据位被逐 nibble交叉插入buffer[3..6]的低位与原有数据按位交织——这是 Nedap 帧的加密式排列目的是让静态特征不明显。解码端demodNedap()执行的是同一过程的正向拆分并用invTranslateTable[16]非法值标记为0xFF反向还原 5 个索引再按r2 (10 idxC2 - (idxC1 1)) % 10的递推逆式恢复 ID。3. 成帧前导字节、进位与奇偶位// carry calc uint8_t carry 0; for (uint8_t i 0; i sizeof(buffer); i) { uint8_t tmp buffer[sizeof(buffer) - 1 - i]; data[7 - i] ((tmp 0x7F) 1) | carry; carry (tmp 0x80) 7; } data[0] 0xFE | carry; data[7] | isEven_64_63(data);7 字节 buffer 按低位在前反向展开成 8 字节data[]最高进位并入0xFE帧头使帧首呈现解调端识别的1111111110前导码preamble见 cmdlfnedap.c#L47 中的preamble[] {1,1,1,1,1,1,1,1,1,0,0}。isEven_64_63()对 64 位数据做偶校验位计数奇偶结果写入末字节最低位。128 位 long 格式的第二段bIsLong1时再追加 8 字节前 5 字节以位域方式平铺原始 IDid0/id1/id2的 nibble 拼接随后是固定字段0x71、0x40与两个未知保留位0x00最后同样附加偶校验位。解调端会校验固定字段0x71/0x40并打印 Second Card 的 ID与生成端一一对应。比特流生成与 Biphase 调制编码出的 8/16 字节如何变成射频上的波形NedapPrepareBigBuffer()lf_nedap_sim.c#L79-L98分两步bytes_to_bytebits()把字节按LSB 在前展开为比特序列64 或 128 bit逐比特调用biphaseSimBitInverted()把每个逻辑比特写成64 个采样点的 BiphaseASK/Diphase波形static void biphaseSimBitInverted(uint8_t c, int *n, uint8_t *phase) { uint8_t *dest BigBuf_get_addr(); if (c) { // 数据位 1半周期翻转 memset(dest (*n), c ^ 1 ^ *phase, 32); memset(dest (*n) 32, c ^ *phase, 32); *n 64; } else { // 数据位 0保持相位翻转 memset(dest (*n), c ^ *phase, 64); *phase ^ 1; *n 64; } }这正是 Biphase 数据 0 时相位翻转、数据 1 时半周期翻转 的标准实现且整体取反!bitStream[i]invert 输出。若最后一位结束于相位 1函数会再跑一遍取反序列以锁定相位——这与客户端lf nedap sim使用encoding2 (Biphase)、invert1、clock64下发 CMD_LF_ASK_SIMULATE 的参数完全一致两者是同一物理层的两种实现路径。波形写入 BigBuf 后由SimulateTagLowFrequency(n, 0, true)播放。该函数armsrc/lfops.c#L855-L938工作在 LF 边沿检测模式下先用 FPGA 检测读卡器场等待SSC_CLK拉高检测到场后逐采样点切换OPEN_COIL()/SHORT_COIL()实现线圈调制——1 打开通路、0 短路负载调制即 125 kHz 上的 ASK 负载响应。每 64 个采样点构成一个数据位因此数据速率与编码时约定一致。运行行为状态机、LED 与退出方式RunMod()lf_nedap_sim.c#L54-L77的主循环结构void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); // 加载 LF 比特流 n NedapPrepareBigBuffer(Tag); do { WDT_HIT(); if (data_available()) break; // USB 有命令 → 退出 SimulateTagLowFrequency(n, 0, true); // 持续发射检测到场才响应 } while (BUTTON_HELD(1000) BUTTON_NO_CLICK); // 长按 1 秒 → 退出 LEDsoff(); }状态机只有一个Simulate状态启动后连续发射循环等待读卡器场出现并应答直到按钮长按 1000 ms或收到 USB 数据任一条件满足才退出LED 行为极简ledcontroltrue使SimulateTagLowFrequencyEx()在读卡器场检测期间点亮 LED_D检测到场 → 亮灯并模拟离场 → 灭灯除此之外无额外指示启动时通过Dbprintf打印一行[] LF Nedap simple simulator -- started及标签参数ID / subtype / customer code若设备仍通过 USB/FPC 连接可在终端看到这些调试输出方便确认模拟的是哪个标签。对应的 mermaid 状态图摘自原文档[*] -- Simulate : Startup Simulate -- Simulate : Continuous transmission Simulate -- [*] : Button hold 1s / USB data自定义修改被模拟的标签独立模式的标签参数是编译期硬编码的这正是它与上位机lf nedap sim --st 5 --cc 307 --id 42424 -l命令的本质区别——后者无需重新编译。修改 lf_nedap_sim.c 中的常量即可static NEDAP_TAG tag { .subType 0x5, .customerCode 0x123, .id 42424, .bIsLong 1, // 0 64 位短格式1 128 位 long 格式 };修改时请遵守NedapGen()的隐含约束id必须 ≤ 999995 位十进制、customerCode≤ 0xFFF、subType≤ 0xF否则编码与解调端的校验逻辑索引表逆映射、固定字段比对将无法通过。编译与烧录按原文档给出的流程在仓库根目录执行make clean make STANDALONELF_NEDAP_SIM -j ./pm3-flash-fullimageSTANDALONELF_NEDAP_SIM会展开成编译开关WITH_STANDALONE_LF_NEDAP_SIM见 Makefile.inc 中的 findstring 逻辑。编译头信息应确认包含该模式名。刷写后在设备上长按按钮触发 LED 显示并进入 standalone 模式。注意独立模式编译时会替换常规主程序的入口行为烧录该固件后设备默认就运行此模式配合ModInfo()打印的 LF Nedap simple simulator 标识可通过客户端hw status确认当前固件装的是什么模式。与主机端命令族的交叉验证独立模式的价值需要配套验证手段仓库中完整的 Nedap 支持集中在 client/src/cmdlfnedap.c 的lf nedap命令族命令功能与独立模式的关系lf nedap reader [-]读一次或连续读真实 Nedap 卡输出 ID/subtype/customer code用真卡校准你对格式的理解lf nedap demod从已抓取的 GraphBuffer 中做 ASK/Biphase 解调clock 64、invert并解码验证模拟信号能否被正确解调lf nedap sim --st 5 --cc 307 --id 42424 -l主机端模拟参数与独立模式默认值一一对应独立模式的联机版lf nedap clone --cc n --id n [-l] [-q5|-em]把 Nedap 标签克隆到 T55x7 / Q5(T5555) / EM4305用可编程卡片固化模拟结果其中 clone 使用的 T55x7 配置块定义在 client/src/cmdlft55xx.h#L72-L73#define T55X7_NEDAP_64_CONFIG_BLOCK 0x907f0042 // BiPhase, data rate 64, 2 data blocks #define T55X7_NEDAP_128_CONFIG_BLOCK 0x907f0082 // BiPhase, data rate 64, 4 data blocks即Biphase、数据率 64、64 位 2 块 / 128 位 4 块——与独立模式biphaseSimBitInverted()按 64 采样点/位生成的波形约定吻合。推荐工作流先用lf nedap reader读取目标卡的参数 → 把参数写入lf_nedap_sim.c的Tag常量 →make STANDALONELF_NEDAP_SIM编译烧录 → 用读卡器验证独立模式下的模拟行为或直接用lf nedap sim联机模拟做快速回归。小结与延伸阅读LF_NEDAP_SIM用不到 200 行代码展示了 Proxmark3 独立模式的典型骨架ModInfo()/RunMod()双入口、FPGA 比特流加载、BigBuf 波形生成、WDT_HIT()喂狗、USB/按钮双退出通道以及编码逻辑与主机端共享NedapGen在两端逐行一致以保证帧格式一致性。理解它之后你可以低成本地搭建 Nedap 读卡器测试环境也能以此为模板扩展自己的 LF 模拟模式参考 LF_SKELETON 模板 与 EM4100 Emulator。关键文件索引模式实现armsrc/Standalone/lf_nedap_sim.c模式文档本文主体doc/standalone/lf_nedap_sim.md编译注册armsrc/Standalone/Makefile.inc独立模式开发指南armsrc/Standalone/readme.md主机端命令族demod/reader/clone/simclient/src/cmdlfnedap.cLF 模拟底层armsrc/lfops.cSimulateTagLowFrequencyEx【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表