在扒开 M1 卡的内部看看数据是怎么排列的之前,我们先看看 M1 卡在这个卡家族中排在什么位置。
基础知识查看:探索一下NFC
M1 卡属于高频卡,高频卡的工作频率是 13.56MHz,因此,它比低频卡传输速率高,存储容量也可以更大。
针对高频卡,有两个标准,分别是ISO14443 -TypeA和ISO14443 -TypeB。他们的区别是编码不同,TYPE A采用开关键控(On-Off keying)的Manchester编码,TYPE B采用NRZ-L的BPSK编码。
TYPEB 与 TYPEA 相比,具有传输能量不中断、速率更高、抗干扰能力强的优点。RFID的核心是防冲突技术,这也是和接触式IC卡的主要区别。ISO14443-3规定了TYPEA和TYPE B的防冲突机制。二者防冲突机制的原理不同,前者是基于位冲突检测协议,而TYPE B通信系列命令序列完成防冲突,目前的二代身份证,社保卡,护照都是基于此标准。
而我今天搞的这个 M1 卡属于ISO14443-TypeA。
上面是卡内的存储结构,分为 16 个扇区,每个扇区 4 个块,一共 64 个块。其中第0 块存储了厂家的信息。
先列出我找了张白卡读取的实际值:
M1 block0: 0xBF 0xBE 0x3B 0x83 0xB9 0x08 0x04 0x00 0x62 0x63 0x64 0x65 0x66 0x67 0x68 0x69M1 block[01]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[02]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[03]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[04]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[05]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[06]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[07]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[08]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[09]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[10]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[11]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[12]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[13]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[14]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[15]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[16]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[17]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[18]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[19]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[20]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[21]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[22]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[23]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[24]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[25]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[26]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[27]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[28]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[29]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[30]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[31]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[32]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[33]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[34]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[35]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[36]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[37]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[38]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[39]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[40]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[41]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[42]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[43]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[44]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[45]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[46]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[47]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[48]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[49]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[50]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[51]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[52]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[53]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[54]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[55]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[56]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[57]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[58]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[59]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFFM1 block[60]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[61]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[62]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00M1 block[63]:data: 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
可以看到,只有第0块有数据,其他的都是只有每个扇区的最后一个块有数据。我们先分析 第 0 块的数据:
0xBF 0xBE 0x3B 0x83 0xB9 0x08 0x04 0x00 0x62 0x63 0x64 0x65 0x66 0x67 0x68 0x69
其中前面的 4 个字节就是卡的 UID :0xBF 0xBE 0x3B 0x83
第 5 个字节其实是前面 UID 的异或值 :0xBF^0xBE^0x3B^0x83 = 0xB9,这个主要是让我们读取完 UID 后校验一下读的对不对。
其余的数据是厂商数据,并且这个段在出厂之前就会被设置了写入保护,只能读取不能修改。
凡事都有例外,有种叫UID卡的特殊卡,UID是没有设置保护的,其实就是厂家不按规范生产的卡,M1卡出厂是要求要锁死UID的,对于不规范的破解之道在此不学他。
数据读到这一步,我们已经按到了 UID 卡号,对于大多数门禁卡,也就是只用了个 UID 而已。如果我们要安全性稍高一点的,就需要研究其余的扇区,我们需要在上面存储一些密码。
既然存密码,这个密码就不能让别人轻易的拿到,我上面能达到数据,是因为白卡,也就是出厂的那些卡的密码默认都是 0xFF 0xFF 0xFF 0xFF
从哪里可以看出来呢?可以看每个扇区的最后一块数据,粘贴在下面:
0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x07 0x80 0x69 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
这个数据整体上很容易理解,我们掐头去尾各 6 个字节,他们就变成了三段
开头的Key A :0x00 0x00 0x00 0x00 0x00 0x00
结尾的 Key B:0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
中间的存取控制位:0xFF 0x07 0x80 0x69
在读取的时候,我发现无论我如何设置 KeyA,用正确的 KeyA 再去回读信息,返回的 KeyA 都是 00,这里应该是 M1 内部的规范,也就是每个扇区的最后一个块在读取时,对应的密码部分都是回复 00。KeyB 同理,也就是密码输对了,也不能返回密码。所以设置了密码后,我们一定要自己牢牢记住。
这里有两个密码,可以对两个密码配置不同的权限,KeyA 只能读取,KeyB 既能读取,也能写入,这样方面发卡机构进行独立密钥的操作。
好了,哪些位上的信息决定 KeyA 和 KeyB 的作用呢?就靠中间那几个存取控制位了(其中最后一个 0x69 暂时不知道干嘛的,忽略它)。
0xFF 0x07 0x80
控制块很复杂,看我上面引用的文章的最后面部分。
346