起因
由于某设备需要刷卡,并且每个月下来要刷不少次,为了方便,所以开始了折腾,考虑到物理破解存在不少不确定因素,而且发现该设备是离线且独立的,最终选择了从软件入手,所以盯上了刷卡用的卡,但是在开始折腾之前,还得要先了解一下一些基础的前置知识
NFC卡片类型
常用的NFC卡分为ID卡和IC卡
ID 卡只读,而且只记录了卡号,没有存储数据
IC 卡可读写可加密,常见有M1/S50K卡、S70卡、CPU卡、模拟CPU卡
咱手上的这张卡就是 IC卡(一般来说也是IC卡,不过重要的是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卡的,主流的复制卡特点如下
| 卡类型 | UID 可擦写 | 后门指令 | 防火墙兼容性 | 特点总结 | 缺点 |
|---|---|---|---|---|---|
| UID卡 | 是 | 有 | 易被检测 | 可无限次擦写,包括UID,操作方便 | 易被识别并拦截(UID防火墙) |
| CUID卡 | 是 | 无 | 较强 | 无后门,不会被检测,稳定兼容大部分系统 | 写入需密钥,兼容性有限 |
| FUID卡 | 否(写一次) | 无 | 最高(几乎通杀) | 写入UID后自动锁卡,模拟真实M1/S50,防火墙无法识别 | 写错一次就报废,成本较高 |
| UFUID卡 | 是 | 有 | 最高(可定制) | 写入前可擦写验证,确认无误后手动锁卡,结合UID和FUID优点 | 成本较高,需手动锁卡 |
检测IC卡类型
这一步很简单,也是开始折腾 IC卡的第一步
确定手中的IC卡片类型,主要是看SAK值,如果没有基本是ID卡
只需要一台有NFC功能的手机就能做到,使用MIFARE Classic Tool这个APP的显示标签工具就能做到
| SAK值 | 芯片类型 | 重复擦写 | 功能特性 | 用户群体 |
|---|---|---|---|---|
| 08 | M1卡(又叫S50卡、1K卡) | 0扇区不可写 | 天生可过防火墙 | 物业发卡授权 |
| 08 | UID卡 | 全扇区可读写 | 响应magic指令,遇防火墙失效 | 个人读写设备复制 |
| 08 | CUID卡 | 全扇区可读写 | 不响座magic指令,遇高級防火墙失效 | 个人读写设备复制 |
| 08 | FUID卡 | 0扇区写入自动固化 | 自动固化后变成M1卡,可过防火墙 | 个人读写设备复制 |
| 08 | UFUID卡 | 0扇区写入需手动锁定固化 | 手动固化后变成M1卡,可过防火墙 | 个人读写设备复制 |
| 18 | M4卡(又叫S70卡、4K卡) | / | 内存是4K,平时很少碰到 | 物业发卡授权 |
| 20 | CPU卡 | / | 安全系最高,密码错误最大16次,超过后就锁死卡片,除非知道其cos系统指令,知道卡密码,否则将无解。 | / |
| 28 | MF1卡,又叫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的第0块和第1块位置,但目前仅仅只是知道了位置,还不清楚是怎么存储的
确定数据存储的方式
首先虽然咱不清楚它是怎么存储的,但是咱至少知道当前卡是多少和刷卡前是多少,在前面的图片里面,左边的扇区5数据当前是12.75,右边当前是12.5的,每次刷卡-0.25
通过观察,可以得知是通过了特定的换算,从十进制转换成了十六进制存储起来的,而且第0块存储的是当前的,第1块存储的是刷卡前的数据
但是仅此不够,咱发现就算改成了其他数字,仍然是无法刷卡的,甚至无效了(设备不认了),后面发现是因为校验码
逆向校验码算法
其实以咱的这种情况,设备离线且独立,当然啦,咱也还考虑了其他安全措施存在的可能,但不管怎么样,其实在破解后直接用CUID全卡复制,也已经算是达到目标了,但咱觉得还能再进一步,所以开始了对校验码的研究

从这两个数据观察可以发现,第0块和第1块数据是这样存储的
[金额]0000[校验码]ffff[金额]000077887788
也就是说,以这两个dump为例,校验码分别是
fb04 → 04fb,1405 → ebfa,e204 → 1dfb
最后通过换算,观察,然后找出规律,最终咱研究出了校验码和存储的数据的关系
但很遗憾,咱不能告诉你校验码是怎么算的~
最后
后面还用python根据逆向出来校验码算法,写了个简单的换算脚本,顺便就当复习了一下python吧233

请不要向我询问具体的算法逻辑,本人不会提供任何工具和帮助,也不提倡各位去随意复制和修改手中的NFC卡,尤其是存储了金额的,本文已对相关数据脱敏,仅分享思路和供参考学习
以上内容仅供爱好者作学习交流,严禁用于任何非法用途。