起因
学校强制要求出入寝室需要刷校园卡,但是很多时候本来就只是临时上下楼,却不得不多带一张卡在身上。于是我想到了我常年佩戴的小米手环4NFC版
,试图使用它来模拟校园卡,但是很可惜,当前小米仅支持非加密卡的模拟,而我们学校使用的却是 IBM
制式的 JCOP41

这意味着这张卡无法被直接模拟,需要解密,但常规的解密方式并不适用于这张卡,CPU 卡的构造也注定有一部分数据无法被读取,我只能希望门禁数据没有放在 CPU 区里,万事俱备,开工!
材料准备
- 具备全功能 NFC 的安卓手机一台(这里使用
LG G7
) - PN532+PL2303HX
- 一张
CUID白卡
(理论上可以省下,但你买 PN532 一般都会送) - MifareOneTool
- MifareClassicTool
- 一颗爱折腾的心
分析
首先将 PN532,PL2303HX 连接到你的 PC 上(请遵照商家提供的教程安装),这里我们使用 MifareOneTool 和 MifareClassicTool 来完成破解。在我的环境下,可以使用默认密钥 FFFFFFFFFFFF
读取校园卡,即 std.keys
。

观察读取的数据可知门禁数据很有可能存在于 10 扇区,接下来我们使用 MifareOneTool
来尝试解出该分区的密钥。
解密

如图所示执行,注意,需要运行 HardNested
两次以分别取得 keyA
和 keyB
,如果你和我是同一所大学,keyB
应当为 AB2016CD0310
,而 keyA
,在每张卡上都应该不同,需要自行解出。
注意,
HardNested
对于 CPU 的要求很高。对我而言,Ryzen 2600
满载运行消耗了约 200 秒以求得密钥,如果你在性能更低的设备上执行此操作,消耗的时间可能更久。
将密钥导入 MifareClassicalTool
,这时就会发现,之前无法读取的 10 扇区已经可读,保存转储文件,我们接下来会用到。


复制
复制 MiFareClassicTool
读取的第一行紫色文字
,使用写标签将数据写入 CUID白卡
,使用小米运动控制小米手环对 CUID白卡
进行模拟(此步骤需要实名)。



模拟成功后,使用 MifareClassicTool
将之前保存的转储文件除 0 扇区以外的所有扇区写入小米手环。

检测
读取小米手环,并与之前保存的转储文件相比较

关于 0 扇区的不同,猜测是小米对于 0 扇区的读写做了限制,但一般情况下门禁并不会校验 0 扇区
如果你的结果和我的大致一致,恭喜你,你已经成功了!
Bug & ToDo
- 0 扇区的不同
- 支付功能无法使用,猜测是因为数据存于 CPU 区,无法被读取,暂时无解。
致谢
方方方块@coolapk
: 他在 PM3 上完成的操作为我提供了大量灵感。
filthystone@coolapk
: 他在 PN523 上进行的探索有极高的完成度,本文部分内容来自于他在酷安发表的文章
珍惜不离不弃@coolapk
: 他向我介绍了 MifareOneTool
感谢文中所使用的所有软件和硬件的设计者,开发者。
回复 小雷锋 取消回复