解析密钥 & 读取数据

使用 M1T 解析出 IC 卡的 Key B 为 A9 DE 7F 3C EB 1F
读取数据进行分析,以下是该卡的第 10 和 11 扇区以及 0 扇区的块 0,除此之外的扇区数据均为空。

Section 0
Block 0: 5E E1 6E A4 75 08 04 00 01 DD 54 AF A4 43 D6 1DSection 10
Block 0: 23 0A 01 00 09 F5 00 D6 02 00 5E 00 00 5E 00 62
Block 1: 1B F5 03 EE 04 0A AA 00 A0 01 83 1B 00 9E 00 84
Block 2: 23 0A 01 00 09 F5 00 D6 02 00 5E 00 00 5E 00 62
Block 3: 0A A1 1E 91 5B 81 7F 07 88 69 A9 DE 7F 3C EB 1FSection 11
Block 0: C1 3E 12 2C 00 C1 00 00 00 00 06 00 00 06 00 B6
Block 1: 1B F5 03 EE 04 0A AA 00 A0 01 83 1B 00 9E 00 84
Block 2: C1 3E 12 2C 00 C1 00 00 00 00 06 00 00 06 00 B6
Block 3: 0B A1 1E 91 5B 81 7F 07 88 69 A9 DE 7F 3C EB 1F

分析数据

通过观察发现,这些扇区的 Key A 并不相同,而 Key B 为固定值;并且第 10 扇区和第 11 扇区中块 0 和块 2 的数据相同。
通过多次刷卡发现,第 10 扇区会被刷卡机修改,而第 11 扇区未被使用。
接下来的分析重点将放在 Key A 和第 10 扇区上。

Key A 的分析

通过观察发现 Key A 的结构如下:

0A A1 1E 91 5B 81

数据位 作用 计算
0A 扇区号 0A
A1 1E 91 5B 取反 UID ~5E ~E1 ~6E ~A4
81 固定值 81

块 0 的分析

通过多次比对数据改动和刷卡机显示的数额,猜测出一些数据位的作用如下:

23 0A 01 00 09 F5 00 D6 02 00 5E 00 00 5E 00 62

数据位 作用 计算
23 异或校验 0A ^ 01 ^ 00 ^ 09 ^ F5 ^ 00 ^ D6 ^ 02 ^ 00 ^ 5E ^ 00 ^ 00 ^ 5E ^ 00
0A 和校验 01 + 00 + 09
01 00 剩余数额 0.01CNY * 100
F5 和取反校验 ~ (01 + 00 + 09)
D6 02 上次使用数额 7.26CNY * 100
5E 使用次数
62 和取反校验 ~ (0A + 01 + 00 + 09 + F5 + 00 + D6 + 02 + 00 + 5E + 00 + 00 + 5E + 00)

黑色标注的数据猜测为无实际作用的数据。

块 1 的分析

这里的数据是固定的,不知道用途,但可以猜测出第一位和最后一位为校验位:

1B F5 03 EE 04 0A AA 00 A0 01 83 1B 00 9E 00 84

数据位 作用 计算
1B 异或校验 F5 ^ 03 ^ EE ^ 04 ^ 0A ^ AA ^ 00 ^ A0 ^ 01 ^ 83 ^ 1B ^ 00 ^ 9E ^ 00
84 和取反校验 ~ (F5 + 03 + EE + 04 + 0A + AA + 00 + A0 + 01 + 83 + 1B + 00 + 9E + 00)

通过比对,尝试将不同的数据位置零后也可以正常使用。

利用

先构建 M1 卡的结构

// M1Card.h
#pragma once#include <stdint.h>typedef struct KEY_TAG {uint8_t KeyA[6];uint8_t AccessBits[4];uint8_t KeyB[6];
} KEY, *PKEY;typedef struct SECTOR_TAG {uint8_t Data0[16];uint8_t Data1[16];uint8_t Data2[16];KEY Key;
} SECTOR, *PSECTOR;

然后构建解析出的水卡的结构

// MyCard.h
#pragma once#include <stdint.h>
#include "M1Card.h"typedef struct CARDDATA_TAG {uint8_t OverallXorCheck;uint8_t NumberSumCheck;union {uint16_t Number;struct {uint8_t NumberByte01;uint8_t NumberByte02;};};uint8_t Padding1Byte01;uint8_t NumberSumXorCheck;uint8_t Padding5Bytes[5];uint8_t UsageCountAddNum;uint8_t Padding1Byte02;uint8_t UsageCountSumCheck;uint8_t Padding1Byte03;uint8_t OverallSumXorCheck;
} CARDDATA, *PCARDDATA;typedef struct KEYA_TAG {uint8_t Index;uint8_t UIDCheck[4];uint8_t Padding1Byte;
} KEYA, *PKEYA;void MyCard_SetCard(PSECTOR pSectorArray, uint8_t* pUIDBuffer, int number);

最后写出利用函数

// MyCard.c#include "M1Card.h"
#include "MyCard.h"#include <string.h>uint8_t gAcs[4]     = { 0x7F, 0x07, 0x88, 0x69 };
uint8_t gKeyB[6]    = { 0xA9, 0xDE, 0x7F, 0x3C, 0xEB, 0x1F };
uint8_t gIdData[16] = { 0x1D, 0xF5, 0x03, 0xEE, 0x04, 0x0A, 0xAA, 0x00,0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 };void MyCard_SetUIDFromUID(PSECTOR pSectorArray, uint8_t* pUIDBuffer) {uint8_t check = 0;for (int i = 0; i < 4; i++) {pSectorArray->Data0[i] = pUIDBuffer[i];check ^= pUIDBuffer[i];}pSectorArray->Data0[4] = check;*((uint16_t*) (pSectorArray->Data0 + 5)) = 0x0408;pSectorArray->Data0[7] = 0x00;
}void MyCard_SetKeyFromUID(PSECTOR pSectorArray, uint8_t* pUIDBuffer) {for (int i = 0; i < 16; i++) {PKEY pKey = (PKEY) &pSectorArray[i].Key;/* ACs */memcpy_s(pKey->AccessBits, 4, gAcs, 4);/* KeyB */memcpy_s(pKey->KeyB, 6, gKeyB, 6);/* KeyA */PKEYA pKeyA = (PKEYA) &pKey->KeyA;pKeyA->Index = (uint8_t) i;pKeyA->Padding1Byte = 0x81;for (int i = 0; i < 4; i++) {pKeyA->UIDCheck[i] = ~pUIDBuffer[i];}}
}void MyCard_SetDataSector(PSECTOR pSectorArray, int number) {PCARDDATA pData = (PCARDDATA)(pSectorArray + 10)->Data0;memset(pData, 0, 16);pData->Number = number;pData->NumberSumCheck = pData->NumberByte01 + pData->NumberByte02 + pData->Padding1Byte01;pData->NumberSumXorCheck = ~pData->NumberSumCheck;// pData->UsageCountAddNum = pData->UsageCountSumCheck = 0x00;int sum = 0;for (int i = 1; i < sizeof(CARDDATA) / sizeof(uint8_t) - 2; i++) {pData->OverallXorCheck ^= ((uint8_t*) pData)[i];sum += ((uint8_t*) pData)[i];}pData->OverallSumXorCheck = (uint8_t) ~sum;memcpy_s((pSectorArray + 10)->Data2, 16, (pSectorArray + 10)->Data0, 16);
}void MyCard_SetDataIDSector(PSECTOR pSectorArray) {memcpy_s((pSectorArray + 10)->Data1, 16, gIdData, 16);
}void MyCard_SetCard(PSECTOR pSectorArray, uint8_t* pUIDBuffer, int number) {MyCard_SetUIDFromUID(pSectorArray, pUIDBuffer);MyCard_SetKeyFromUID(pSectorArray, pUIDBuffer);MyCard_SetDataIDSector(pSectorArray);MyCard_SetDataSector(pSectorArray, number);
}

写在结尾

⚠ 本篇文章仅供参考,请勿用于非法用途!⚠⚠⚠

一张水卡的数据解析及利用相关推荐

  1. 从0到1建立一张评分卡之数据预处理

    从 0 到 1 建立一张评分卡   之前看了很多评分卡建模方面的课程和文章,对评分卡的建立大致有一些了解.但是由于实际工作中没有接触过,也没有看到过比较舒服的代码,所以对评分卡这块一直有点不踏实.所幸 ...

  2. 求大神帮忙看一下这张水卡校验码是什么分析一下算法谢谢!!!!

    加粗样式删除线格 式

  3. 记录一次利用pn532进行学校水卡改余额过程

    仅为个人学习分享,切勿利用破坏违法,本人对其内容不负任何法律责任 一.准备过程 1.PN532 2.PL2303串口模块USB转TTL                 (在某宝,两个元件加一起才30多 ...

  4. 一卡通(M1卡)破解过程记录——数据分析(水卡、饭卡及门禁)

    前些日子在研究学校的一卡通安全,在此记录一下一卡通破解的全过程,仅用作学习交流,切勿用于违法用途 其他几篇: 一卡通(M1卡)破解过程记录--准备篇              理论篇          ...

  5. 学校水卡、本地公交卡破解记

    写在前面:破解卡只为科学研究所用,并探讨数据加密升级的必要性. 很早就在网上看过有网友发帖称破解了自己学校的水卡,颇有感触,上某宝查了下需要购买的设备ACR122U,居然要100多元,省吃俭用许久后我 ...

  6. 解决cuid卡写数据后,无法读取。以及救卡方法

    最近入手了几张cuid卡,用来复制校园卡的.但在写数据的时候发现的一系列问题.下面说一下我的解决方法.链接在评论区. 设备:pn532,手机 软件:上位机,M1T,以及手机上的mifare class ...

  7. TF卡只读数据三年后的变化

    2016年年初,手机上的手机tf卡出现只能只读,不能写入和删除的情况.新写入的数据断电之后消失,并且会重新显示损坏之前的数据. 因为里面有一些有价值的数据,发现会出现这种情况,当时以为这张tf卡中的数 ...

  8. 张庆余(1991-),男,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为软件架构、云计算。...

    张庆余(1991-),男,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为软件架构.云计算.

  9. 求解,某M1水卡数据计算分析/大神们求指导!

    标题-某M1水卡数据计算分析 洗澡水真的是好贵啊! 用Proxmark3解了一下水卡的数据,发现只有6扇区和7扇区数据有变化. 看了些资料发现 6扇区0块 第1 2位表示金额.现在卡里有2位数的钱 没 ...

最新文章

  1. C语言新手写扫雷攻略3
  2. iOS_Spring自动生成Model,Service,Controller 之 介绍
  3. Action Service Dao三层的功能划分
  4. 618技术特辑(三)直播带货王,“OMG买它”的背后,为什么是一连串技术挑战?
  5. 金山云纳斯达克敲钟上市,雷军手中又多了家上市公司
  6. 电梯、电梯调度与电梯问题
  7. 大学四年因为知道了这 60 个网站,我成了别人眼中的大神!
  8. mysql 读写分离_详解MySQL读写分离
  9. 机器学习训练营--快来一起挖掘幸福感吧
  10. 【中亦安图】关于数据库文件损坏风险的提醒(3)
  11. 又一新框架 | 无监督图像转换任务新境界(附论文代码)
  12. centos下rabbitmq启动失败:
  13. thinkphp update操作,某字段更新不成功
  14. Flutter 报错Mapping values are not allowed here. Did you miss a colon earlier?
  15. java写入dat文件_java写入dat文件
  16. 反射内存网搭建参考文献
  17. RabbitMq工具类(springboot)
  18. 道德经和译文_老子道德经第五十章原文及译文
  19. 分布式系统架构设计三十六式之服务治理 - 第一式 - 隔板模式
  20. MySQL分库分表解决方案

热门文章

  1. Flash HTML5动画特效
  2. 下三角矩阵的压缩存储
  3. 模拟根据后端返回列表数据,先包装成树结构,包装路由数据格式。
  4. c语言将英文月份转化为数字,用C语言进行数值月份向英文月份的转换 为什么输入两位数的月份只能识别第一个数字 求解答!!...
  5. php 转化为英文月份,php怎么实现月份数字转英文
  6. WidsMob Retoucher Mac(全能修图软件) v2.4破解版
  7. 企业级Docker虚拟化平台实战
  8. java mail 回复邮件_JavaMail 电子邮件答复/回复
  9. 流水账 20200617
  10. 《车载ADAU1452音频音乐曲线调试》