起因

由于某设备需要刷卡,并且每个月下来要刷不少次,为了方便,所以开始了折腾,考虑到物理破解存在不少不确定因素,而且发现该设备是离线且独立的,最终选择了从软件入手,所以盯上了刷卡用的卡,但是在开始折腾之前,还得要先了解一下一些基础的前置知识

NFC卡片类型

常用的NFC卡分为ID卡和IC卡

ID 卡只读,而且只记录了卡号,没有存储数据

IC 卡可读写可加密,常见有M1/S50K卡、S70卡、CPU卡、模拟CPU卡

咱手上的这张卡就是 IC卡(一般来说也是IC卡,不过重要的是IC卡里面的什么类型)

ID卡和IC卡对比

对比ID卡IC卡(M1/S50 等)
工作频率125KHz(常见),250KHz、375KHz等偏频13.56MHz
结构仅一个卡号多扇区(如M1/S50为16个扇区,每扇区4块,共1K字节)
是否可加密不可加密可加密(扇区加密、数据加密)
UID是否可改不可改不可改(M1/S50卡中00块的UID默认固化)
是否可复制易复制(无需解密)有条件复制(需扇区解密,UID不可改)
安全性中(M1/S50)到高(CPU卡)
应用示例停车卡、考勤卡、老式门禁电梯卡、门禁卡、公交卡、校园卡、银行卡等

IC复制卡类型

看名字就知道,复制卡就是复制用的,既然是复制,那么复制卡的性质就会和被复制卡的性质一样才行,因市场上的智能卡系统使用M1/S50卡类型最多,所以现在的复制卡基本都是用来复制M1/S50卡的,主流的复制卡特点如下

常见IC复制卡片

卡类型UID 可擦写后门指令防火墙兼容性特点总结缺点
UID卡易被检测可无限次擦写,包括UID,操作方便易被识别并拦截(UID防火墙)
CUID卡较强无后门,不会被检测,稳定兼容大部分系统写入需密钥,兼容性有限
FUID卡否(写一次)最高(几乎通杀)写入UID后自动锁卡,模拟真实M1/S50,防火墙无法识别写错一次就报废,成本较高
UFUID卡最高(可定制)写入前可擦写验证,确认无误后手动锁卡,结合UID和FUID优点成本较高,需手动锁卡

检测IC卡类型

这一步很简单,也是开始折腾 IC卡的第一步

确定手中的IC卡片类型,主要是看SAK值,如果没有基本是ID卡

只需要一台有NFC功能的手机就能做到,使用MIFARE Classic Tool这个APP的显示标签工具就能做到

提示
提示
标签检测
标签检测

不同SAK值对应的卡片类型

SAK值芯片类型重复擦写功能特性用户群体
08M1卡(又叫S50卡、1K卡)0扇区不可写天生可过防火墙物业发卡授权
08UID卡全扇区可读写响应magic指令,遇防火墙失效个人读写设备复制
08CUID卡全扇区可读写不响座magic指令,遇高級防火墙失效个人读写设备复制
08FUID卡0扇区写入自动固化自动固化后变成M1卡,可过防火墙个人读写设备复制
08UFUID卡0扇区写入需手动锁定固化手动固化后变成M1卡,可过防火墙个人读写设备复制
18M4卡(又叫S70卡、4K卡)/内存是4K,平时很少碰到物业发卡授权
20CPU卡/安全系最高,密码错误最大16次,超过后就锁死卡片,除非知道其cos系统指令,知道卡密码,否则将无解。/
28MF1卡,又叫CPU模拟M1卡/CPU卡加M1卡的复合体/
GTU卡可反复擦写可以自动复位数据,用于滚动码防复制
GDMIC卡可反复擦写和GTC功能一致,生产厂商不同

SAK如果数值是08就可以进一步,但是如果是其他数值便可以止步了,当然还有无法发现的卡,可能是ID卡,这些都不重要因为除了08是M1卡支持,其他的都不行或者是很难,当然,如果是28也就是CPU模拟卡,其实也并非安全,有机会接触到再说吧~

试图破解密钥

还有一点要补充一下,M1加密卡又分为了3种类型

  • 非加密卡,所有的16个扇区都是默认密钥,或者弱口令
  • 半加密卡,有一部分扇区不使用默认密钥
  • 全加密卡,16个扇区都被加密了

非加密和半加密通常非常简单就能破解,但是全加密就不一样了,由于全部扇区用的密钥都并非默认密钥/弱口令,因此只能通过跑密码/嗅探的方式破解

注意,手机NFC在没有密钥的前提下是无法直接读取加密扇区的,但是可以读取UID(卡号),如果需要刷卡的设备只读取卡号,那么这就足以,否则则需要PN532/PCR532等设备执行更高级的操作

咱手上的卡片信息

可以看得到,咱手上的卡SAK为08,属于M1卡,但经过检测后发现,属于全加密卡,因此也只能通过PCR532等设备来进行破解,不过毕竟PCR532仍然属于最基础的入门设备,也并不是所有全加密卡都能搞定的,遇见那种情况就得要上更高级的例如PM3以及变色龙等设备了,但很幸运的是,咱用PCR532就跑出来了全扇区的密钥,具体操作就不贴出来了,这里仅分享思路

全卡复制实现目标

在获取到了全扇区/关键扇区的密钥后,其实已经可以通过全卡复制实现咱的目标了,但有意思的事情来了,直接刷后,设备虽然的确认出了卡,但是在开启设备时,设备无法正常扣费,在反复比对复制卡和原卡数据后,可以确定数据没有问题,那么问题就出在设备或卡片,不过值得一提的是,咱测试的这台设备是可以随意断电的,且离线,还并非是唯一设备,因此,可以断定,设备其实没有什么特殊的机制,所以问题应该出在卡片上

常见防复制卡手段

类别原理说明
完整性卡片中设置如计数器、流水号、时间戳等字段,每次使用后递增或变动。设备在下一次使用时会校验这些字段是否符合预期(例如必须递增),以防止复制卡重放旧数据。
加密卡片中部分数据是用密钥加密或签名的,设备在读出数据后用主密钥进行解密或验证签名。复制者即使数据复制完整,但无法伪造正确的密文或签名,设备识别出伪卡。
绑定卡片内部记录设备ID、用户ID等信息,只允许在特定设备或用户环境中使用。即便数据被复制,若在未绑定的设备上刷卡,会被判定无效。
隐藏扇区利用卡片中不常用或厂商自定义的扇区,写入用于防伪的标记或密钥。普通读卡器或复制工具不会读取这些扇区,复制后这些信息缺失,设备验证失败。

咱后面想到目前咱手上的复制卡属于是当初买PCR532的时候,商家送的最便宜的UID卡,存在后门,因此设备只需要通过发送后门指令到卡片上即可测试是否是复制卡

那么问题就很好解决了,后面我去下单了CUID和UFUID卡,最后使用CUID就成功了,大部分情况CUID的确可以解决,但由于仅仅只是把后门删掉了,仍然可以修改UID,所以不排除有些设备仍然会通过尝试修改UID的方式来检测是否是复制卡,毕竟M1卡的UID是不可修改的

确定目标数据存储位置

最简单的办法就是刷几次然后比对一下dump后数据就知道了,这方法同时也会在后面用于逆向校验码算法,但是像PCR532这种设备,厂商的软件也会提供一定的数据分析功能,使其可以直接得知数据存储的位置

利用软件的对比数据功能发现刷卡前后只有扇区5发生了变化

软件数据分析

PCR532配套软件自带的数据分析

软件自动数据分析得出的结果与咱手动刷卡对比数据后的位置相同,因此基本可以确定金额就存储在扇区5的第0块和第1块位置,但目前仅仅只是知道了位置,还不清楚是怎么存储的

确定数据存储的方式

首先虽然咱不清楚它是怎么存储的,但是咱至少知道当前卡是多少和刷卡前是多少,在前面的图片里面,左边的扇区5数据当前是12.75,右边当前是12.5的,每次刷卡-0.25

12.75
12.75
12.5
12.5

通过观察,可以得知是通过了特定的换算,从十进制转换成了十六进制存储起来的,而且第0块存储的是当前的,第1块存储的是刷卡前的数据

但是仅此不够,咱发现就算改成了其他数字,仍然是无法刷卡的,甚至无效了(设备不认了),后面发现是因为校验码

逆向校验码算法

其实以咱的这种情况,设备离线且独立,当然啦,咱也还考虑了其他安全措施存在的可能,但不管怎么样,其实在破解后直接用CUID全卡复制,也已经算是达到目标了,但咱觉得还能再进一步,所以开始了对校验码的研究

观察

从这两个数据观察可以发现,第0块和第1块数据是这样存储的

[金额]0000[校验码]ffff[金额]000077887788

也就是说,以这两个dump为例,校验码分别是

fb04 → 04fb,1405 → ebfa,e204 → 1dfb

最后通过换算,观察,然后找出规律,最终咱研究出了校验码和存储的数据的关系

但很遗憾,咱不能告诉你校验码是怎么算的~

最后

后面还用python根据逆向出来校验码算法,写了个简单的换算脚本,顺便就当复习了一下python吧233

请不要向我询问具体的算法逻辑,本人不会提供任何工具和帮助,也不提倡各位去随意复制和修改手中的NFC卡,尤其是存储了金额的,本文已对相关数据脱敏,仅分享思路和供参考学习

以上内容仅供爱好者作学习交流,严禁用于任何非法用途。

最后修改:2025 年 04 月 21 日
我很可爱,请给我钱(bushi)