资讯动态

Proxmark3 深度解析 HF_MFCSIM:MIFARE Classic 1K 多槽位独立仿真模式

发布时间:2026/9/17 14:30:11 来源:尧图企业网站定制
Proxmark3 深度解析 HF_MFCSIMMIFARE Classic 1K 多槽位独立仿真模式【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3本篇指南围绕 Proxmark3Iceman Fork的HF_MFCSIM独立模式Standalone Mode展开讲解如何把最多 15 份 MIFARE Classic 1K dump 文件写入 RDV4 设备的 SPIFFS 闪存、脱离电脑在现场直接仿真卡片以及读卡器写入的数据如何回存到 dump 文件。读完本文你可以独立完成「dump 上传 → 独立仿真 → 槽位切换 → 写回持久化」的全套现场操作并理解底层Mifare1ksim仿真器的工作机制。一、模式定位无电脑的多卡 MIFARE Classic 仿真器HF_MFCSIM 由 Ray Lee 编写工作于 HF 频段13.56 MHz要求 RDV4 硬件必须带闪存。它的核心能力从闪存中的 dump 文件仿真 MIFARE Classic 1K 卡片最多支持15 个 dump 槽位slot 01–15写回特性仿真期间读卡器对卡片内存的任何写入都会持久化保存回对应的 dump 文件。典型场景是你手头有多份 MIFARE Classic 卡片 dump来自hf mf dump或同类工具需要在没有笔记本电脑的现场逐张仿真。15 个槽位可以覆盖多张门禁卡而写回功能能保留读卡器诱导产生的一切数据变更例如值块计数、被写入的数据块。源码入口是 hf_mfcsim.c文档位于 hf_mfcsim.md。文件头注释明确说明了运行前提It requires RDV4 hardware (for flash and battery).Only support mifare classic 1k二、准备工作上传 dump 文件到闪存2.1 文件命名与规格仿真器按固定命名规则查找槽位文件格式定义在源码中// armsrc/Standalone/hf_mfcsim.c #define HF_MFCSIM_DUMPFILE_SIM hf_mfcsim_dump_%02d.bin #define DUMP_SIZE 1024即槽位 1–15 依次对应hf_mfcsim_dump_01.bin…hf_mfcsim_dump_15.bin。每个文件必须恰好 1024 字节MIFARE Classic 1K 完整 dump含全部扇区密钥大小不符会直接加载失败。2.2 上传命令官方文档给出的上传命令为mem spiffs load -s hf_mfcsim_dump_01.bin -d hf_mfcsim_dump_01.bin mem spiffs load -s hf_mfcsim_dump_02.bin -d hf_mfcsim_dump_02.bin ...需要指出的是当前仓库客户端中 SPIFFS 子命令集合里对应的子命令名是upload参数为-s 本地文件 -d 设备内目标名实现见 cmdflashmemspiffs.chf_mfcsim.c 头部注释使用的也是mem spiffs upload。因此实际操作时请以当前固件客户端help mem spiffs输出的子命令名为准upload与文档中的load语义相同-s为源文件、-d为目标名。设备端可用的配套管理子命令包括tree查看文件列表、remove -f 文件名删除、dump、copy、rename等方便核对 15 个槽位文件是否齐全。2.3 文件内容的来源dump 文件是完整的 1K 卡片内存镜像其第 0 块块 0前 4 字节即卡片 UID。这一点决定了仿真时 UID 从哪来——下文源码分析会印证。三、运行行为LED、按钮与状态机3.1 LED 指示LED含义1–15 号 LED表示当前正在仿真的 dump 槽位号3.2 按钮控制操作效果短按切换到下一个 dump 槽位长按 500ms退出独立模式3.3 状态流转启动 → LoadSlot加载槽位 dump → Simulate进入仿真 → WriteBack仿真停止写回闪存 → LoadNext短按触发保存并前进到下一槽位 → LoadSlot ... 长按 500ms → 退出槽位 01–15 循环文件名hf_mfcsim_dump_XX.bin每个文件 1024 字节。四、源码剖析RunMod 主循环如何组织仿真RunMod 是独立模式被设备触发后的入口整体流程与文档描述一一对应初始化StandAloneMode()进入独立模式并做 LED 展示随后FpgaDownloadAndGo(FPGA_BITSTREAM_HF)下载 HF FPGA 比特流再rdv40_spiffs_lazy_mount()惰性挂载 SPIFFS 文件系统槽位扫描循环for (int i 1;; i)每轮先检查data_available()——一旦 USB 上有主机命令例如 pm3 客户端发来指令立即break退出独立模式这是 Proxmark3 所有独立模式的标准退出机制之一循环计数器i 15时回绕到 1 实现 15 槽位无限轮转若一整轮下来从未发现任何 dump 文件flag_has_dumpfile false则打印No dump file found!并退出LED(i, 0)点亮第 i 个 LED 指示当前槽位用sprintf(cur_dump_file, HF_MFCSIM_DUMPFILE_SIM, i)拼出槽位文件名并尝试加载加载成功后先做BUTTON_HELD(500)检查此时长按 500ms 可直接退出对应文档「Hold 500ms 退出」SpinDelay(500)留出观察 LED 的间隔然后进入仿真。4.1 加载fill_eml_from_filefill_eml_from_file 做了三重校验后加载数据exists_in_spiffs(dumpfile)检查文件存在否则打印红色错误Dump file %s not found!并返回 false主循环随即跳过该槽位即「槽位可以空着」size_in_spiffs(dumpfile)校验大小必须等于DUMP_SIZE1024否则报The dump file size is incorrect! Only support Mifare Classic 1K!emlClearMem()清空仿真器内存Emulator Memory再用rdv40_spiffs_read_as_filetype(..., RDV40_SPIFFS_SAFETY_SAFE)把文件读入BigBuf_get_EM_addr()指向的 EMUL 区。加载失败的槽位在循环中被continue跳过这解释了文档中「15 个槽位」不必全部占用的行为。4.2 仿真Mifare1ksim 的调用参数进入仿真的关键调用hf_mfcsim.cuint16_t simflags 0; FLAG_SET_MF_SIZE(simflags, MIFARE_1K_MAX_BYTES); FLAG_SET_UID_IN_EMUL(simflags); Mifare1ksim(simflags, 0, NULL, 0, 0);FLAG_SET_MF_SIZE(..., MIFARE_1K_MAX_BYTES)强制按 1K 卡仿真决定最大扇区数与 ATQA/SAK1K 对应ATQA0x0400, SAK0x08见 MifareSimInit 中的强制设置FLAG_SET_UID_IN_EMULUID 取自仿真器内存即 dump 文件第 0 块而非外部传入。MifareSimInit 中会读取块 0 并用 BCC 校验判断是 4 字节还是 7 字节 UID——这就是 dump 文件必须完整、UID 必须有效的原因exitAfterNReads 0不限制读取次数仿真持续进行直到按钮被按下或主机命令打断。Mifare1ksim 实现了一个完整的 MIFARE Classic 卡侧状态机反碰撞/选择阶段MifareSimInit预编译 18 组响应ATQA、SAK、SAKuid、三级 UID 级联各 BCC 及其尾部切片并占用 571 字节调制缓冲确保 REQA/SELECT 到来时能即时应答AUTH1校验读卡器 AR/NR验证失败则回到 IDLE真实卡也不回 NACK仅停止响应READ / WRITE / INC / DEC / RESTORE / TRANSFER全部命令需先通过 Crypto1 认证块号与已认证扇区不符、或访问控制位AC bits不允许时按 IsAccessAllowed 的规则拒绝或「清零回读」。注意一个真实细节读受保护数据块时并非报错而是把数据清零后返回密钥 A 永远不可读、密钥 B/AC 按 AC 位决定这模仿了 MIFARE Classic EV1 的真实行为写块路径MFEMUL_WRITEBL2写前按 AC 位判断 KeyA/KeyB/AC 是否可写不允许的部分保留原值最终经emlSetMem_xt写回仿真器内存——这些内存变更正是写回机制的数据来源仿真主循环中button_pushed BUTTON_PRESS()每轮检测一次按钮短按即break结束仿真。4.3 写回write_file_from_eml仿真返回后write_file_from_eml 执行持久化static bool write_file_from_eml(char *dumpfile) { if (exists_in_spiffs(dumpfile) false) { ... return false; } uint8_t *emCARD BigBuf_get_EM_addr(); rdv40_spiffs_write(dumpfile, emCARD, DUMP_SIZE, RDV40_SPIFFS_SAFETY_SAFE); return true; }它把整个 EMUL 内存1024 字节覆盖写回同一个槽位文件。也就是说每一次「仿真结束 → 切槽」之间发生的读卡器写入数据块、值块、密钥/AC 变更等受 AC 位限制都会落盘下次仿真同一槽位时继承这些变更。写失败也不中断流程仅打印错误并切换到下一槽位。五、编译与烧录按文档给出的编译流程一次只能编译一个独立模式make clean make STANDALONEHF_MFCSIM -j ./pm3-flash-fullimage编译产物是 fullimage通过 pm3-flash-fullimage 脚本烧录。设备端触发方式连接 USB 后长按设备按钮触发 LED 展示并进入独立模式见独立模式开发指南 readme.md 中「press button long time to trigger ledshow and enter your new standalone mode」的说明若保持 USB 连接还能在 pm3 客户端中看到仿真过程的调试输出便于确认当前槽位与加载状态。也可以把STANDALONEHF_MFCSIM写进Makefile.platform作为固定构建配置。六、限制与适用前提仅 MIFARE Classic 1K文件大小硬校验为 1024 字节2K/4K/Mini 卡 dump 不适用Mifare1ksim本身支持更大容量但本模式只用 1K 配置必须 RDV4 且带闪存依赖 SPIFFS 文件系统与电池槽位文件缺失会被静默跳过一个槽位都没有则直接退出15 个槽位循环期间短按会「保存当前槽位并前进」退出独立模式前最后一个槽位的变更同样会先写回仿真返回后立即执行write_file_from_eml独立模式一次只能编译一个如需多模式请改用 DANKARMULTI 加载器见 armsrc/Standalone/readme.md。七、相关模式与延伸阅读HF_MATTYRUN — MFC 攻击链完整的 MIFARE Classic 自动化流程发现 → 查密钥 → ecfill dump → 仿真与 MFCSIM 的「只仿真已有 dump」形成互补HF_COLIN — VIGIKPWN面向 VIGIK 场景的 MIFARE Classic 高速 sniff/sim/cloneMIFARE Classic Notes密钥恢复技术参考独立模式总索引与开发指南所有 standalone 模式列表、RunMod/ModInfo接口规范与新增模式流程mifaresim.c / mifaresim.hMIFARE Classic 仿真的完整卡侧状态机实现也是本模式的能力底座。【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价