今天在学习M1卡的自动加减处理时,中间有段时间想看看第4、5、6、7块的数据,代码如下:
// 读取块数据
for (block=4; block <= 7; block++) {
Serial.println(F("目标块:"));
Serial.println(block);
status = mfrc522.MIFARE_Read(block, buffer, &bufferSize);
if (status == 0) {
// 在串口监视器中打印数据(16字节)
Serial.print(F(" 原始数据 "));
printBlockData(); // 输出数据到串口
// // 修改12 - 15的数据为 : 块地址,块地址取反,块地址,块地址取反
// valueblock[12] = block;
// valueblock[14] = block;
// valueblock[13] = ~block;
// valueblock[15] = ~block;
// // 写入值块数据
// status = mfrc522.MIFARE_Write(block, valueblock, 16);
// if (status == 0) {
// Serial.println(F(" 数据更新成功。"));
// } else {
// Serial.println(F(" 数据更新失败"));
// }
// // 再读
// status = mfrc522.MIFARE_Read(block, buffer, &bufferSize);
// if (status == 0) {
// Serial.print(F(" 更新后数据 "));
// printBlockData(); // 输出数据到串口
// }
}
Serial.println(F("==============================================================="));
}然后想着按照值块的方式重新更新块的数据,结果块地址的循环值范围也没改,将设置值块的代码(绿色部分)放开,烧录程序执行了。然后就悲剧了,原来还能用的卡,出现为认证过程失败。
这一瞬间就明白了,将第7块数据改掉了,向扇区尾部(Sector Trailer)写入了无效数据,导致该扇区的访问权限被破坏,从而使整个扇区(包括第4块)永久无法访问。
第7块的原始数据应该是这个样子:
00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF
被我改写成
0F 0F 0F 0F F0 F0 F0 F0 0F 0F 0F 0F, 7, 238, 7, 238
这就意味着,第1扇区不能用了。惨痛的教训啊!好消息是,这个严重的问题,不影响使用其他扇区。
我要赚赏金
