COVID-19期间,我们学校实行通行证制度,只有具有通行证的同学的卡才可以自由进出校园,他而没有通行证的人下人出校只能是一种奢望。在这种无理取闹的制度之下,我试想通过NFC模拟出那些可以自由进出的同学的校园卡,从而实现自由进出校园。其实这个想法已经有人做了,使用手机自带的nfc模拟校园卡,是可以实现门禁进出功能的。经过实际测试,一下方案是可行的:

  • 使用带NFC功能手机模拟
  • NFC读卡器 + 白卡
  • 带NFC功能手机+手环 or NFC 读卡器+白卡+手环

首先第一种,使用带nfc功能的手机模拟,这个是最简单的,只需要打开手机的钱包/卡包app然后模拟门禁卡读取需要复制的卡即可,这样每次进学校大门的时候直接刷手机进来就行。
然而对于手机不带NFC功能的手机,譬如我的就是,就比较难搞了。此外,使用手机NFC模拟不具有可拓展性,一台手机只能当作一张卡片使用,如果需要多张卡片就需要多个手机了。因此我们的解决方案是通过复制白卡来实现制作门禁卡,白卡复制不存在可拓展性这个问题。首先自己购买白卡,然后先读校园卡,再将其写入白卡。我们知道每一张卡都有唯一的ID,这个ID在门禁识别的时候用到。接下里本文的所有操作遵循1.读卡获取卡片ID ;2.将ID写入白卡。通过这两步,就得到了和原来的卡ID一模一样的卡,这个卡就可以拿来刷进校门了。
根据读卡,写卡的媒介不同,可以分为三种平台,win,mac,和手机&手环这些。根据卡片的类型不同,可以分为UID,CUID,M1,CPU卡。
卡片类型介绍:

  • M1卡:全称Mifare classic 1K,普通IC卡,0扇区不可修改,其他扇区可以反复擦写。通常我们使用的门禁卡、电梯卡都是M1卡。M1卡是NXP(恩智浦半导体)公司研发的IC卡,执行标准是ISO/IEC14443 Type A,读写频率是13.56MHz。目前大多数手机厂商使用的NFC芯片都是NXP,另一部分则是BRCM(博通)方案,均执行同一标准,这是手机读写M1卡的技术基础。
  • UID卡:普通复制卡,可以反复擦写所有扇区,门禁有防火墙则失效。
  • CUID:升级复制卡,可以反复擦写所有扇区,可以穿透大部分防火墙。【我们的白卡是购买此种类型的卡
  • CPU卡:有操作系统,可存储数据,也有自己的ID号,CPU卡发一串数据给设备,设备与SAM卡进行运算,设备再发一串数据回CPU卡确认,然后进行交易或身份认证;跟M1卡的区别在于一个算法在空中,一个算法在设备里面;无论是卡商,设备商,运营商,都不知道其中的算法,所以这个系统的安全性会高很多。【校园卡等大多数具有金融功能的卡属于此种类型】

目前,大多数校园卡为CPU卡,也就是加密级别最高的卡。好在,金融扇区和门禁ID扇区是分开的,这使得我们可以通过复制卡片的ID来实现门禁功能。
根据不同平台,其复制校园卡的难度排序是
Mac > Win > 手机写卡> 手机模拟,手环模拟

  • 平台

    • Win
    • Mac OS X
    • Android&手环
  • 卡片类型

    • UID
    • CUID
    • M1
    • CPU
  • 读卡器

    • PN532 【for mac and windows】
      该读卡器从某宝购入,附赠两个这种白卡,一共花费¥63。又额外买了10张CUID白卡,长下面这个样子,约¥1/张。

1. 使用Mac进行NFC读写

  • GUI 工具
    现存的针对Mac平台的NFC读写软件较少,我只找到了这两个GUI程序,但是这两个软件都连接不上我的PN532读卡器,遂作罢。查看App Store上的说明看到,这两个工具均不支持PN532,但是支持另一个非常常用的读卡器ACR122U。我手头上没有对应的读卡器,所以这条路走不通了。(以后可以考虑再买一个ACR122U)

  • Command Line Tools or 读写API
    考虑使用命令行工具,或者是用对应的API来读写NFC。
    在网上搜索,使用关键词Mac NFC百度搜索,得到的结果都是用iPhone来做的??难道Mac == IPhone了??后来找到了一篇记录: 记Macbook Pro配合FT232使用PN532模块,算是中文互联网上位数不多的经验贴了,跟着这位兄弟一点点搭建好了需要的依赖库。

  • 硬件连接:MBP2019 雷电3 接口-> type-c 转USB3.0拓展坞->USB连接PN532

  • 驱动Driver ?

  • 软件需求: libusb -> libnfc ,mfoc ,mfcuk

    • 安装Libusb

      • 官网 https://libusb.info/,GitHub:https://github.com/libusb/libusb
      • 安装方法一: 从官网或者是GitHub下载源代码->解压->进入包目录 ->依次执行$ ./configure ->$ make ->$ make install
        • $ ./configure&&make&&make install
      • 安装方法二:Homebrew安装
        • 直接$ brew install libusb
        • 刚开始的时候执行这个命令报错:Error: libusb: undefined method `license' brew install 在这里找到了解决方案,出现这个原因说明当前brew版本太老了,只需要更新一下,brew update -v,执行两次这个命令,然后再 brew install libusb就成功了。
      • 注1: 这里推荐使用homebrew安装,接下来的几个也是推荐brew。
      • 注二:一个问题,我第一次使用的是源代码编译安装,最后$ make install也都成功了。但是执行下一步的时候提示libusb.h头文件找不到,header not found.第二遍安装使用的是$ brew install libusb安装,就没有这个问题出现,可见,使用brew可以轻松的安装配置各种包,不需要自己对各种环境配置揪心。所以强烈建议使用homebrew安装。
    • 安装Libnfc
      • 官网 http://www.libnfc.org/,GitHub :https://github.com/nfc-tools/libnfc
      • 安装方法同样两种,一样的操作
      • 安装方法一:官网或者GitHub下载源代码,解压,进入目录,依次执行$ ./configure ->$ make ->$ make install
      • 安装方法二:$ brew install libnfc
    • 安装mfoc
      • GitHub:https://github.com/nfc-tools/mfoc
      • 安装方法一:参见GitHub readme,
        $ autoreconf -is [注:这里需要安装autoreconf,方法$brew install automake]
        $./configure
        $ make && sudo make install
      • 执行$./configure时报错如下:PKG_CHECK_MODULES(libnfc, libnfc >= $LIBNFC_REQUIRED_VERSION, , AC_MSG_ERROR([libnfc >= $LIBNFC_REQUIRED_VERSION is mandatory.])),没有找到解决办法,这里有一个解释。最后采用了homebrew安装。
      • 安装方法二:homebrew安装
        • $ brew install mfoc
    • 安装mfcuk
      • 放弃源代码安装,直接homebrew安装$ brew install mfcuk

至此,所有软件已经安装完毕,此时进入终端输入nfc-list,即可查看当前的卡片信息

可以看到这张卡的SAK是20,这意味着我这张卡是一张CPU卡,我们需要的东西即是这个UID。

使用nfc-mfcassic 命令可以读写卡。但是在后续的写卡过程中遇到两个严重的问题:

  • nfc写入不进去
    不知怎么地,写入命令可以正常执行,没有报错,但是却没有写入。卡片的ID还是之前的。不知为何。
  • 大端小端问题
    可以后续对dump文件进行编辑的过程中,可能由于大小端问题,编辑的文件总是不对。这个dump文件就是这张卡的1K字节的二进制文件,前4个字节是UID,第5个字节是校验字节,其值是UID四个字节的异或值。我们只需要修改这5个字节,其他的不需要改动。

2.使用Windows进行读写

使用Windows相对较为简单,相关的经验贴也有很多,出现问题大多数也都能找得到解决方案。首先是软件,读卡器软件链接 :https://pan.baidu.com/s/1DQVDdLNUirx33kr18j7EEw 提取码:0rkw,这个是我在淘宝店买读卡器赠送的。这个文件里面包含了很多细节,里面描述的很清楚,在这里就不再赘述了,按照里面的来一般不会有问题。
使用步骤: