最近笔者在折腾nfc相关的应用,为此购入了一个型号为ACR122U的NFC读写卡器,但是在mac上使用libnfc进行nfc写操作时遇到了问题,具体表现为:当某个扇区的密码和原密码不同时,该扇区实际写入失败,但是nfc-mfclassic指令并没有报错。
具体而言,使用mfoc指令读入一张nfc白卡的数据为old.dump,其中某个扇区的key默认是FFFFFFFFFFFF,如果我们把这个key改成0A1B2C3D4E5F,存储为new.dump,然后使用nfc-mfclassic w a old.dump new.dump写入,指令没有报错。但是如果这时候再使用mfoc去尝试读取卡片,就会发现那个扇区的key并没有发生变化,也就是说,可以直接使用FFFFFFFFFFFF解密,这就说明写入操作实际是失败的。如果是复制门禁卡等场景,这一点还可以通过实际去刷这张写入后的卡来验证。
解决方案
首先把需要复制的NFC卡放在读卡器上,执行mfoc -O target.dump,把旧卡数据dump下来。如果原卡是有加密的,则还需要进行密码破解的步骤,这里的具体原理不再赘述。
然后把新卡放在读卡器上,执行mfoc -O white.dump,这一步是为了获取包含白卡密码的dump,用于后续写入。
最后执行nfc-mfclassic w a target.dump white.dump即可把原卡的数据写入新卡中,完成复制。如果是需要保留原卡ID的场景,则需要使用nfc-mfclassic W a u target.dump white.dump来覆写第0扇区里的ID部分(仅部分NFC卡片支持此功能)。
如果需要修改卡内容,只需要使用vim -b target.dump打开dump文件(注意,一定要使用-b参数,如果只是用vim打开二进制文件会导致vim对换行符进行特殊处理,会影响后面转文本和转回二进制)
然后输入:%!xxd,将二进制文件转为文本文件,编辑中间的十六进制数字区域,编辑完成后再使用:%!xxd -r将文本文件转回二进制,最后:wq保存。然后使用nfc-mfclassic w a target.dump key.dump写入即可,这里的key.dump就是即将写入的NFC卡的dump,里面包含的密码会用于解锁当前要写入的NFC卡。