起因
学校强制要求出入寝室需要刷校园卡,但是很多时候本来就只是临时上下楼,却不得不多带一张卡在身上。于是我想到了我常年佩戴的小米手环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
感谢文中所使用的所有软件和硬件的设计者,开发者。
发表回复