ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

NFC模拟校园卡门禁全流程:卡型判断、读卡与手环写入实战

2026/10/7 7:23:40 拓冰建站 浏览量
NFC模拟校园卡门禁全流程:卡型判断、读卡与手环写入实战 开学第二周把卡丢在食堂补办要跑两趟行政楼这事我干过不止一次。后来我把实体卡的数据读出来写进一台闲置的安卓机又同步到 NFC 手环上出门跑步不带卡也能进宿舍楼和图书馆。这套流程横跨安卓、Windows 和 Mac 三个平台硬件成本从几十块到几百块不等剥开来看核心只有三件事判断卡型、读卡取数据、把数据写进能被门禁读头识别的载体。NFC 模拟校园卡门禁功能听着玄乎但只要卡型对得上安卓手机和 NFC 手环是最省事的两个出口Mac 和 Windows 更多承担读数据、做备份、批量比对的角色是折腾过程中的实验室而不是最终产品。下面这些内容全部基于我自己和身边同学的实操适用对象是想把自己名下那张卡搬到手机或手环上的人不是让你去动别人的东西。这个前提很重要后面我会单独说。1. 先搞清手里这张卡属于哪一类13.56MHz 与 125kHz 的分水岭动手之前最省时间的动作不是买读卡器而是判断卡型。校园卡粗略分两大类工作在 13.56MHz 的高频卡NFC 就工作在这个频段和工作在 125kHz 的低频卡常说的 ID 卡、EM4100 那一类。只有 13.56MHz 的卡才有被手机、手环模拟的可能125kHz 卡连你的手机 NFC 都感应不到任何手机方案直接出局只能靠专门的 125kHz 读写器和空白 T5577 卡去处理。这一步的误判成本极高。我见过同学花了三百多买 Proxmark3结果发现卡是低频 ID 卡白折腾一周。1.1 用手机当频率探测器十秒钟出结论最土但最有效的判定方法打开安卓手机的 NFC 开关把卡贴到手机背面上半部分NFC 天线位置不同机型差异挺大小米通常在摄像头附近华为偏中上看有没有震动或者弹提示。有反应 → 13.56MHz进入下一步完全没反应换几个位置贴也没反应 → 大概率 125kHz 低频卡或者卡已经损坏。iPhone 也能测但 iOS 的 NFC 读取入口比较克制需要用快捷指令里的 NFC 触发或者支持读卡的应用不如安卓直观。我一般先拿安卓机测一遍省事。这个方法有个坑部分手机壳带金属防磁片或者磁吸环会屏蔽 NFC。测的时候先把壳摘了我就因为这个问题误判过一次白高兴一场。1.2 ATQA/SAK 对照卡型号决定了能不能模拟确认是高频卡之后用读卡工具安卓端的 MIFARE Classic Tool或者桌面端软件读一次看它返回的 ATQA 和 SAK 两个值。这两串数字基本就是卡型的身份证。SAK 值常见卡型能否用手机/手环模拟0x08MIFARE Classic 1K可以最理想的类型0x18MIFARE Classic 4K可以数据量更大0x00MIFARE Ultralight / NTAG 系列部分可以取决于门禁逻辑0x20支持 ISO14443-4 的 CPU 卡基本不行0x28智能卡 / 部分 CPU 卡基本不行MIFARE Classic 1K 是校园里最常见的一类尤其十年前建的门禁系统几乎清一色用这个。它的数据结构非常规整16 个扇区每个扇区 4 个块每块 16 字节最后一个块是密钥和权限位Trailer Block。这个结构后面会反复用到。1.3 CPU 卡和一卡一密为什么这类卡基本没戏近几年新建的校园卡系统普遍换成 CPU 卡常见的有 FM1208 系列、DESFire 系列。这类卡有两个致命特点第一卡里跑的是真加密算法密钥存在卡内读不出来也不存在什么密钥字典能爆破这种说法。第二很多学校采用一卡一密每张卡的密钥都不一样而且门禁读头会和后台服务器做核对。这意味着什么即便你用专业设备嗅探出了通信过程也无法把卡片数据整体复制到另一个载体上。这类卡不是技术难度高而是结构上就不支持随意复制。遇到这种情况唯一的正规路径是走学校的一卡通中心问能不能开通手机 NFC 虚拟卡服务——现在不少高校确实提供了这个入口。我个人的判断标准很简单如果安卓端 MCT 能读出扇区数据就有戏如果连一个扇区都读不出来直接放弃物理复制这条路。2. 安卓端MIFARE Classic Tool 从读卡到写卡的完整链确认卡型是 MIFARE Classic 之后安卓手机就是最顺手的工具。我常用的两个应用**MIFARE Classic ToolMCT**负责读、解密、写NFC Tools负责快速看卡的基本信息UID、容量、技术类型。两个都免费应用商店基本都能搜到。2.1 密钥字典怎么跑跑多久算正常MCT 里最重要的功能是密钥文件和读卡。默认自带的密钥字典里包含了几十组常见密钥出厂默认的FFFFFFFFFFFF、A0A1A2A3A4A5、D3F7D3F7D3F7这些基本都在里面。操作顺序是打开 MCT → 选择读标签 → 勾选使用密钥文件 → 选默认密钥 → 把卡贴上去。跑字典的时间差异很大卡片用的是出厂默认密钥1 到 3 秒全绿卡片改过密钥但用的是常见变体10 秒到 2 分钟卡片用了自定义密钥字典跑完也读不出来会显示一堆红色的扇区。这里有个经验先只跑扇区 0。绝大多数门禁系统只读扇区 0 的 UID 和少量厂商数据把扇区 0 的密钥试出来往往就已经够用了没必要一次把 16 个扇区全啃下来。我第一张卡就是全扇区硬啃跑了两分半其实第一秒扇区 0 就绿了。注意MCT 默认会尝试写卡操作前务必确认自己点的是读取而不是写入。我有一次手滑把空密钥写进了自己的卡虽然最后靠备份救回来但门禁当场刷不开折腾了半小时。2.2 dump 文件的结构与哪些块能动、哪些块别碰读卡成功后 MCT 会生成一个.mfd或者.dump文件本质就是 1024 字节1K 卡或 4096 字节4K 卡的原始数据镜像。用十六进制看结构是这样的每个扇区的第 0 块通常是厂商数据建议保留原样第 1、2 块一般存卡号、余额、有效期等业务数据第 3 块Trailer密钥 A6 字节 存取控制位4 字节 密钥 B6 字节。Trailer 块是最容易出事的。存取控制位配错了整个扇区会变成只读甚至永久锁死这张卡就废了。所以修改 dump 时我的原则是除了明确的卡号字段和业务字段其余一律不动。备份这件事必须做两遍一份存在手机本地一份发到电脑或云盘。读卡成功那一刻的原始 dump 是最有价值的后面所有修改都应该基于它重新开始。2.3 手机钱包与手环的门禁卡模拟入口在哪拿到 dump 之后有两条路第一条直接用手机模拟。部分安卓机系统层面支持虚拟门禁卡不同厂商叫法不一样一般在钱包应用里的门禁卡板块。这条路的好处是手机就是卡坏处是系统通常只让你录入门禁卡实物也就是把实体卡贴到手机背面让它复制它接受的是实体卡而不是你的 dump 文件。所以如果你的卡密钥被改过系统复制会失败反而 MCT 能读出来。第二条写进空白卡再转手环。买几张 MIFARE Classic 1K 的空白 UID 卡俗称魔术卡或可改 UID 卡几块钱一张用 MCT 把 dump 写进去然后用手机钱包把这个新实体卡录入再同步到手环。这条路绕了一下但成功率最高我最后用的就是这个方案。关于手机能不能直接被门禁读头认到这里有个常被忽略的点手机自带的模拟功能发出的卡片信息UID 是固定的还是随机的取决于厂商实现。有些系统会做隐私保护每次用随机 UID那对只认固定卡号的老门禁就完全无效。3. Windows 桌面端读卡器选型和 NFC Reader Tool 的实际边界安卓手机能覆盖大部分场景但当你要处理大量数据、做批量备份、或者卡片涉及 4K 这种大容量时桌面端的优势就出来了屏幕大、能导出结构化的文件、方便比对。3.1 ACR122U、PN532、Proxmark3 该怎么挑这三样东西经常被混为一谈其实定位完全不同设备价格区间优势局限ACR122U一百多即插即用驱动成熟Windows 下 GUI 工具多只能读 13.56MHz天线小贴卡位置讲究PN532 模块三四十便宜可接串口Mac/Linux 下用 libnfc 很顺需要自己接线无外壳容易接触不良Proxmark3三百起能力最强高频低频通吃能看通信细节学习曲线陡命令行操作新手劝退我自己的配置是一台 ACR122U 做日常读写一个 PN532 接在 Mac 上跑命令行。Proxmark3 借同学的用过一次功能确实强但对我就想把自己那张卡搬到手机上这个需求来说属于杀鸡用牛刀。3.2 驱动认不到设备的排查顺序Windows 上最烦的就是设备管理器里出现一个黄色感叹号或者插上了但软件里找不到读卡器。我的排查顺序固定是这一套换个 USB 口优先插主板后置的 USB 2.0 口前置面板和扩展坞经常供电不足到设备管理器里看有没有未知设备或带感叹号的条目有的话手动指定驱动目录安装确认装的是读卡器厂商提供的驱动而不是 Windows 自动匹配的通用智能卡驱动关掉可能抢占智能卡服务的软件某些银行的 U 盾管理程序会占用智能卡资源这个坑我踩过全部失败就换一台电脑验证把问题锁定在设备还是环境上。第 4 条特别隐蔽。当时我插上 ACR122U 死活认不到重装了三次驱动最后发现是某网银客户端在后台跑着占用了系统的智能卡服务退掉它就正常了。3.3 桌面端真正的价值备份、比对和批量整理抛开读写本身桌面端最有价值的场景其实是数据比对。举个实际例子我们宿舍楼的门禁半年后升级过一次我把新读的 dump 和半年前的对比发现扇区 1 的第 2 块多了一个字节从00变成了01。这个字段大概率是有效期限标记那次升级就是把它刷新了。这种对比在手机上做很痛苦在电脑上用十六进制编辑器打开两个文件并排看两分钟搞定。所以我建议每次顺利刷开门禁之后都重新读一次卡做一次快照时间久了你会摸清门禁系统到底在写哪些字段。4. Mac 上把工具链跑通Homebrew、libnfc 与串口权限Mac 用户折腾 NFC 有个天然优势系统本身就是 Unixlibnfc 系列工具编译和使用都很顺。劣势是 Homebrew 的下载速度以及 Mac 的串口设备命名方式和 Windows 完全不同。顺便说一个小插曲很多人搜mac 地址怎么查本意是查网卡物理地址结果搜到一堆跟 Apple Mac 有关的教程这个歧义我踩过。做 NFC 的时候我们说的是苹果电脑跟 MAC 地址Media Access Control没关系。4.1 brew 下载慢、报错的几种绕法Homebrew 安装卡住是高频问题报错内容五花八门Failed to connect to raw.githubusercontent.com、Error: Failure while executing这些都见过。我的处理思路先确认 Xcode Command Line Tools 装好了xcode-select --install这一步没做后面全是白搭配置 Homebrew 的镜像源把公式仓库指向国内可访问的镜像这一步能解决九成的卡顿如果卡在某个具体公式上可以试试HOMEBREW_NO_AUTO_UPDATE1跳过自动更新再装。# 检查命令行工具 xcode-select -p # 跳过自动更新直接安装目标工具 HOMEBREW_NO_AUTO_UPDATE1 brew install libnfc # 确认安装位置 brew --prefix libnfc镜像源配置的具体地址会变我不在这里贴死思路是把brew.git、homebrew-core.git指向一个你能稳定访问的镜像然后brew update。配置完记得检查brew doctor的输出它会提示你哪些路径没配好。4.2 libnfc 配置文件与 mfoc 跑通的最小路径装完 libnfc 之后默认配置文件在$(brew --prefix)/etc/nfc/libnfc.conf。用 PN532 串口模块的话需要显式指定设备节点device.name PN532 device.connstring pn532_uart:/dev/tty.usbserial-XXXX那个XXXX是串口芯片的序列号插拔不同 USB 口可能变化。最稳的做法是插好设备后执行ls /dev/tty.*看当前名字别照抄别人的。验证是否通了nfc-list输出里能看到读卡器型号和固件版本就说明链路通了。这时候贴上卡片再跑一次nfc-list应该能看到 UID。读 MIFARE Classic 用 mfocmfoc -O campus_dump.mfdmfoc 会先尝试默认密钥失败再进嵌套认证攻击流程。跑完会打印每个扇区是否成功以及一个累计耗时。4.3 /dev/tty.usbserial 权限与设备名漂移Mac 上偶发的两个坑权限问题正常登录用户对/dev/tty.usbserial*有读写权限但如果之前用过系统自带的驱动或者装过厂商驱动可能被占用了。可以先ls -l /dev/tty.*看权限位再决定要不要调整。不建议上来就sudo跑所有命令先确认是不是权限导致的。设备名漂移同一块 PN532换到不同的 USB 口串口名里的序列号可能变。写脚本的时候尽量用通配符匹配或者每次都先ls确认。我就因为写死了设备名换了个口之后脚本报错找了十分钟。5. 一次完整复制实验的时间线与失败复盘前面都是零件这一节把整个流程串起来。下面是我最近一次帮室友处理他校园卡的真实时间线。5.1 从读卡到写卡的十七分钟里发生了什么第 0 到 2 分钟卡型判定。安卓机贴卡有反应13.56MHz 确认。MCT 读扇区 0SAK 返回 0x08MIFARE Classic 1K。第 2 到 4 分钟密钥尝试。默认字典跑完扇区 0 到 5 全绿扇区 6 到 15 全红。判断门禁只用前 6 个扇区。第 4 到 6 分钟dump 导出与备份。导出.mfd重命名成带日期的文件名一份留在手机一份 AirDrop 到 Mac。第 6 到 9 分钟桌面端核对。Mac 上用十六进制编辑器打开确认扇区 0 的 UID 字段位置记下字节偏移。这一步是为了后面如果要改 UID 有据可依。第 9 到 12 分钟写空白卡。拿出事先买的 UID 魔术卡MCT 里选写标签选中 dump 文件写入。第一次写失败看日志是某个 Trailer 块的密钥不匹配改成只写数据块重写成功。第 12 到 17 分钟实测。先贴手机钱包录入这张新卡再拿着手机去宿舍门禁刷红灯。回到电脑前把 dump 又刷了一遍这次把 UID 也一起写成和原卡一致再去刷绿灯。这五分钟的反复说明了什么门禁系统校验的是 UID不只是数据块内容。魔术卡的默认 UID 是出厂值写数据不改 UID 等于换了个身份门禁自然不认。5.2 写完之后先别急着刷门禁我现在的固定验证顺序是用 NFC Tools 读一遍新写的卡确认 UID 和数据块都正确用 MCT 逐扇区对比确认没有意外的红色扇区先在手机上做一次模拟看系统能不能正常识别最后才去刷卡。第 3 步是保险丝。如果手机模拟都识别不了直接去门禁刷十有八九是白跑。我在宿舍住六楼没电梯跑一趟门禁再跑回来是很实在的成本。5.3 复制成功却刷不开六种常见根因这是踩坑最多的地方整理成表现象可能原因处理方向数据完全一致但刷不开UID 没一起写用支持改 UID 的魔术卡写入 0 扇区 0 块今天能刷明天不行门禁系统写回滚动码需要真实卡片重新同步手机模拟容易掉队能进宿舍不能进图书馆不同子系统校验不同字段分别读卡比对确认各自依赖哪些块刷两次就失效卡里有递增计数器或余额字段检查数据块是否被读写回写慎重模拟读卡器响但不开门门禁做了卡号与人员绑定后台没有你的卡号物理复制无效完全无反应门禁是低频读头只能走低频方案或直接放弃滚动码这一项要重点说。有些系统设计成每次刷卡后往卡里写一个新值下次刷卡时读头校验这个值是否延续上一次。这种情况下你的手机或手环模拟的是一份静态快照第一次刷可能成功之后就会因为链条断了而失效。遇到这种卡老实说物理复制这条路基本走不通只能走学校官方的虚拟卡方案。6. 手环方案的现实边界能替代什么替代不了什么把卡放进手环是这套流程里体验最好的一环抬手就刷跑步和游泳不用带卡手腕上也不会多一个东西。6.1 手环模拟的本质是报一个卡号手环的 NFC 门禁功能本质上是让手环在靠近读头时发出一个固定的卡号UID和对应的数据。厂商的实现路径基本是你在官方 App 里选择门禁卡功能把实体卡贴到手环或手机上让它复制复制成功后手环内部存一份数据刷卡时按需发送。关键限制在这里大多数手环只接受能被它自己复制成功的实体卡。如果你的卡是加密卡、改过密钥的卡手环的复制流程会直接失败报卡片不支持。这就是为什么前面要走先写一张空白卡再拿空白卡去录入手环这条路——因为对原卡的密钥情况手环一无所知它只认自己能不能复制。另一个现实限制是容量和卡位数量。一般手环能存的门禁卡就两三张存满了得删旧的。而且不同厂商对模拟出来的卡能不能被门禁识别这件事态度差异很大有的做得很开放有的只支持自己生态内的门禁。6.2 电量、断连与刷卡姿势这些细枝末节这些都是实际用起来才会遇到的问题手环 NFC 模块在低电量时会关闭。省电模式下不响应这个不是故障充上电就好。我有一次晨跑回来刷不开门以为卡废了结果是电量掉到 5%。手环的天线方向很关键。跟手机一样手环的 NFC 天线在表盘背面偏一侧刷卡时不能平贴要稍微侧一点让天线正对读头。不同型号位置不同摸清需要几次试。手环和手机同时带着的时候会抢读。手机上模拟了同一张卡两个设备叠在一起靠近读头反而可能都不响应。刷卡时把手环那只手单独伸出去就行。部分读头对非卡片载体的功率要求更高。老式门禁读头功率低贴手机贴手环都没反应贴实体卡就正常。这种情况不是数据问题是物理层面读不出来只能继续带实体卡。7. 合规底线和几个容易被忽略的小细节技术流程讲完了最后说几件必须说清楚的事。7.1 只对自己的卡动手这条线不能越复制门禁卡这件事边界非常清晰只处理你自己名下、学校或单位配发给你的那张卡。读别人的卡、复制别人的卡、帮别人弄一张能进你宿舍楼的卡这些都不在讨论范围内法律上和校规上都站不住。还有一个容易被忽略的点即便卡是你自己的部分学校的一卡通管理规定里明确写了不得私自复制理由通常涉及财务安全和系统稳定校园卡往往还绑着食堂消费、图书借阅。所以在动手之前比较稳妥的做法是先问一句学校一卡通中心有没有官方的手机虚拟卡服务现在不少高校已经上线了走官方渠道又稳又不违规。我个人的做法是如果学校有官方方案优先用官方的没有的话把卡复制到自己的手环上仅仅用于个人通行不涉及任何资金数据也不外借。7.2 备份习惯与卡数据版本管理最后分享一个我觉得最值钱的经验给卡数据做版本管理。具体做法是建立一个文件夹每次读卡导出的 dump 都按日期_用途.mfd命名比如20250312_original.mfd、20250315_after_writing.mfd。时间久了你能看出来门禁系统到底在什么时候写了什么。这个习惯救过我一次某次门禁升级后刷不开我把三个月前的原始 dump 写回空白卡先恢复了通行再慢慢分析新版数据的变化。如果没有那份原始备份我就只能去补办卡了。另外读卡导出的文件里含有卡号和密钥信息不要随手发到群里或者公开网盘。这东西泄漏出去理论上别人可以据此做出能进你宿舍楼的卡。本地存好云备份的话选带访问控制的私有空间。把这些都做完你会发现整个流程真正的难点不在技术而在于事先判断卡型、想清楚边界、以及养成备份的习惯。工具链只是把这几件事串起来的那根线。