52梯控论坛

 找回密码
 立即注册
搜索
查看: 18|回复: 4
打印 上一主题 下一主题

本人关于CPU卡的一点研究(业余玩家,不喜勿喷)

[复制链接]
回帖奖励 6 分积分 回复本帖可获得 2 分积分奖励! 每人限 1 次
跳转到指定楼层
楼主
发表于 昨天 19:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Belli_666 于 2026-3-21 19:41 编辑

前几天心血来潮,看到pn532、pm3常规手段都解不出来的CPU卡,就做了一点小小的研究。。。
(小声)其实是CPU软件太贵了,觉得研究一下花大价钱不值得,想用最朴素的方式来尝试

硬件:Proxmark3_RDV3.0(Easy)冰人固件
参考资料:https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit 维基百科

读取一些没有加密的数据其实很简单,基本就3步
  • 发送ADPU负载,选择卡片并切换到根目录(算是吧)3F00
  • 这一步有两种方式,嗅探/暴力枚举都行,只要确定有数据的区块在哪里
  • 确定这块数据的类型,是记录(RECORD)还是二进制(BINARY)文件用第三步已知的对应指令读取数据
注意:本贴讨论的仅限于未开启MAC加密、DES、3DES的非控权CPU卡


0、确定卡片类型
这个不用多说了,看得懂这个帖子的应该不会有人连SAK是什么都不知道吧
(为了水内容还是多说一下吧)
SAK 08:常见的MIFARE Classic 1k卡片,也是数据区最常讨论的
SAK 20:纯CPU卡,有很多目录和文件,标准的ISO7816卡一般为8kb,每个文件都可以加密/不加密(不是计算机领域说的加密内容,这里的加密指的是一种权限控制,通过生成随机数传到读卡器上计算答案再传回卡片来鉴权,为了防止嗅探还有多种保护措施,如DES/MAC加密等)
SAK 28:兼容性较好,包含1k部分和CPU部分,可以理解为把两种卡搓一起了
SAK 18/44/66/88:个别厂商为了防止主流便宜读卡器(122/532)复制而生产的变种卡,大多本质上还是MF1k

1、选卡切换根目录(测试一下是否常规卡)
⚠如果提示状态码6A82/6A83就是非标准()CPU卡,另请高人吧,小人目前无能为力
  1. hf 14a apdu -kt -d 00A40000023F00 -s
复制代码
解释一下参数什么意思:
-s:选择卡片,卡片掉线/更换卡片时都要有这个参数,不然怎么输指令都没*用!
-k:通俗点讲就是保持对卡片的供电,不然没法连续执行指令
-t:TLV解码,大概就是读卡器返回数据后让bash帮你自动分析响应代表什么(例如状态码90 00代表操作成功)
-d:后面跟一个16进制数据,即APDU负载,查表请看二楼

2、确定数据位置
本步骤有两种方法,第一种需要勇气(不能被保安大叔抓住),第二种需要实力(电脑算力和读卡器速度)
①嗅探法
  1. hf 14a sniff
  2. 不行就尝试
  3. hf 14a snoop
复制代码

抱着你的电脑前往你认为比较老
沙发
 楼主| 发表于 昨天 19:20 | 只看该作者
本帖最后由 Belli_666 于 2026-3-21 19:41 编辑

的读卡器,把PM3夹在中间刷卡,多刷几次。
回来使用
  1. hf 14a list
复制代码
列出嗅探数据
  1. Rdr |0A  00  00  A4(读取指令) 00  00  02  3F  00(文件名,记住它)00  6A
  2. Tag |0A  00  6F  15  84  0E  31  50  41  59  2E  53  59  53  2E  44  44  46|<b>30  31  A5  03  88  01  01  90  00  B7  2C(TLV信息)</b>
复制代码

②暴力枚举法
写一个脚本从0000枚举到FFFF,每层65536个文件,总共4'294'967'296个组合,1个月应该能跑完

3、读取数据
先按照第一步的指令,把3F00换成嗅探到的文件名执行一次来选定文件,即XXXX
  1. hf 14a apdu -kt -d 00A4000002XXXX -s
复制代码
然后读取文件:
数据大多都是二进制文件,先试试
  1. hf 14a apdu -kt -d 00B0000000
复制代码

(成功图例)
如果不行(状态码非90 00)
试试:
  1. hf 14a apdu -kt -d 00B2000000
复制代码
这是针对记录文件的命令
如果不行参考楼下的状态字表
本贴严禁灌水!
只允许讨论CPU卡!
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 昨天 19:38 | 只看该作者
# APDU指令速查手册(解卡业务专用)

## 一、指令类别(CLA)速查

| CLA | 含义 | 说明 |
|-----|------|------|
| 00 | ISO 7816-4标准指令 | 最常用 |
| 80 | 私有指令(GSM/支付) | SIM卡、金融卡 |
| 84 | 安全相关指令 | 认证、密钥管理 |
| A0 | 电信应用指令 | SIM卡特有 |
| B0 | 非标准扩展指令 | 厂商特定 |

## 二、核心指令代码(INS)全集

### 2.1 文件操作指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| A4 | SELECT | 选择文件 | `00 A4 P1 P2 Lc [文件标识符]` |
| B0 | READ BINARY | 读二进制文件 | `00 B0 P1 P2 Le` |
| B1 | WRITE BINARY | 写二进制文件 | `00 B1 P1 P2 Lc [数据]` |
| B2 | READ RECORD | 读记录文件 | `00 B2 P1 P2 Le` |
| B3 | WRITE RECORD | 写记录文件 | `00 B3 P1 P2 Lc [数据]` |
| D0 | WRITE BINARY | 更新二进制(扩展) | `00 D0 P1 P2 Lc [数据]` |
| D2 | WRITE RECORD | 更新记录(扩展) | `00 D2 P1 P2 Lc [数据]` |
| D6 | UPDATE BINARY | 更新二进制 | `00 D6 P1 P2 Lc [数据]` |
| DC | UPDATE RECORD | 更新记录 | `00 DC P1 P2 Lc [数据]` |
| E2 | APPEND RECORD | 追加记录 | `00 E2 P1 P2 Lc [数据]` |

### 2.2 数据操作指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| B2 | READ RECORD | 读记录(同上) | `00 B2 P1 P2 Le` |
| CA | GET DATA | 获取数据对象 | `00 CA P1 P2 Le` |
| DA | PUT DATA | 写入数据对象 | `00 DA P1 P2 Lc [数据]` |
| CB | GET NEXT DATA | 获取下一个数据对象 | `00 CB P1 P2 Le` |
| C0 | GET RESPONSE | 获取响应数据 | `00 C0 00 00 Le` |

### 2.3 安全控制指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| 20 | VERIFY | 验证PIN/密码 | `00 20 P1 P2 Lc [PIN]` |
| 22 | MANAGE SECURITY ENVIRONMENT | 管理安全环境 | `00 22 P1 P2 Lc [数据]` |
| 24 | CHANGE REFERENCE DATA | 修改参考数据 | `00 24 P1 P2 Lc [数据]` |
| 26 | DISABLE VERIFICATION REQUIREMENT | 禁用验证要求 | `00 26 P1 P2 Lc [数据]` |
| 28 | ENABLE VERIFICATION REQUIREMENT | 启用验证要求 | `00 28 P1 P2 Lc [数据]` |
| 2A | PERFORM SECURITY OPERATION | 执行安全操作 | `00 2A P1 P2 Lc [数据]` |
| 2C | RESET RETRY COUNTER | 重置重试计数器 | `00 2C P1 P2 Lc [数据]` |
| 84 | GET CHALLENGE | 获取随机数 | `00 84 00 00 Le` |
| 88 | INTERNAL AUTHENTICATE | 内部认证 | `00 88 00 00 Lc [挑战数据]` |
| 82 | EXTERNAL AUTHENTICATE | 外部认证 | `00 82 00 00 Lc [认证数据]` |

### 2.4 卡片管理指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| 44 | ACTIVATE FILE | 激活文件 | `00 44 P1 P2 00` |
| 46 | DEACTIVATE FILE | 停用文件 | `00 46 P1 P2 00` |
| 70 | MANAGE CHANNEL | 管理逻辑通道 | `00 70 P1 P2 Lc [数据]` |
| 73 | MANAGE SECURITY ENVIRONMENT | 管理安全环境(扩展) | `00 73 P1 P2 Lc [数据]` |
| 75 | MANAGE MEMORY | 管理内存 | `00 75 P1 P2 Lc [数据]` |
| A4 | SELECT(同上) | 选择文件 | `00 A4 P1 P2 Lc [文件标识符]` |
| F2 | STATUS | 获取状态信息 | `00 F2 P1 P2 Le` |
| F3 | TERMINATE CARD USAGE | 终止卡片使用 | `00 F3 P1 P2 00` |
| FA | TERMINATE DF | 终止DF | `00 FA P1 P2 00` |
| FE | TERMINATE EF | 终止EF | `00 FE P1 P2 00` |

## 三、SELECT指令P1参数详解

| P1值 | 选择模式 | 说明 |
|------|----------|------|
| 00 | 通过文件标识符选择 | 最常用 |
| 01 | 选择父DF | 返回上一级目录 |
| 02 | 通过文件标识符选择子DF | 在当前DF下选择 |
| 03 | 通过路径选择 | 使用完整路径 |
| 04 | 通过DF名称选择 | 按应用名称选择 |
| 08 | 从MF开始选择 | 绝对路径选择 |
| 09 | 从当前DF开始选择 | 相对路径选择 |
| 0C | 获取子文件列表 | 探索目录内容 |

## 四、READ/WRITE指令P1P2编码规则

### 4.1 READ BINARY (B0/B1)
```
P1: b8 b7 b6 b5 b4 b3 b2 b1
        └─────┬─────┘   │
          偏移高位      SFI标志(0=偏移,1=SFI)

当b8=0时:偏移量 = (P1<<8) | P2
当b8=1时:SFI = P1低5位,偏移量 = P2
```

### 4.2 READ RECORD (B2/B3)
```
P1: 记录号(00=下一条,01-FF=具体记录)
P2: b8 b7 b6 b5 b4 b3 b2 b1
       └─┬──┘   │    └─────┬─────┘
     模式选择  保留 包含标识符    SFI

模式选择:
  00 - 按记录号读取
  01 - 读取第一条记录
  10 - 读取最后一条记录
  11 - 按记录标识符读取
```

## 五、GET DATA常用P1P2组合

| P1P2 | 数据对象 | 说明 |
|------|----------|------|
| 0000 | 保留 |  |
| 0001 | 卡片数据对象 |  |
| 0002 | 当前目录的AID |  |
| 0003 | 制造商特定数据 |  |
| 0004 | 卡片发行者数据 |  |
| 0005 | 卡片持有者数据 |  |
| 0006 | 图像 |  |
| 0007 | 应用程序相关数据 |  |
| 0008 | 卡片能力 |  |
| 0009 | 逻辑通道信息 |  |
| 000A | 当前环境 |  |
| 000B | 接口设备能力 |  |
| 000C | 算法信息 |  |
| 000D | 访问控制规则 |  |
| 000E | 安全环境 |  |
| 000F | 数字签名 |  |
| 0010 | 公钥证书 |  |
| 0011 | PIN状态 |  |
| 0012 | 安全消息计数器 |  |
| 0013 | 安全消息时间戳 |  |
| 0014 | 安全消息随机数 |  |
| 0015 | 日志格式 |  |
| 0016 | 日志数据 |  |
| 0017 | 持卡者证件 |  |
| 0018 | 跟踪数据 |  |
| 0019 | 交易计数器 |  |
| 001A | 交易日期 |  |
| 001B | 交易时间 |  |
| 001C | 交易金额 |  |
| 001D | 交易货币代码 |  |
| 001E | 交易类型 |  |
| 001F | 商户名称 |  |
| 0020 | 商户国家代码 |  |
| 0021 | 商户类别代码 |  |
| 0022 | 终端国家代码 |  |
| 0023 | 终端能力 |  |
| 0024 | 终端类型 |  |
| 0025 | 接口设备序列号 |  |
| 0026 | 应用交互特征 |  |
| 0027 | 应用生命周期状态 |  |
| 0028 | 应用优先级 |  |
| 0029 | 应用选择指示器 |  |
| 002A | 应用用途控制 |  |
| 002B | 应用版本 |  |
| 002C | 应用有效日期 |  |
| 002D | 应用失效日期 |  |
| 002E | 应用图像 |  |
| 002F | 应用标签 |  |
| 0030 | 应用首选名称 |  |
| 0031 | 应用交易计数器 |  |
| 0032 | 最后在线ATC寄存器 |  |
| 0033 | PIN尝试计数器 |  |
| 0034 | 生物特征数据 |  |
| 0035 | 生物特征模板 |  |
| 0036 | 生物特征匹配结果 |  |
| 0037 | 安全支持模板 |  |
| 0038 | 卡风险管理数据对象列表1 |  |
| 0039 | 卡风险管理数据对象列表2 |  |
| 003A | 持卡者验证方法列表 |  |
| 003B | 持卡者验证方法结果 |  |
| 003C | 发卡行认证数据 |  |
| 003D | 应用文件定位器 |  |
| 003E | 应用主账号 |  |
| 003F | 应用主账号序列号 |  |
| 0040 | 应用过期日期 |  |
| 0041 | 应用生效日期 |  |
| 0042 | 应用主账号PAN |  |
| 0043 | 卡片持有者姓名 |  |
| 0044 | 磁条2等效数据 |  |
| 0045 | 磁条3等效数据 |  |
| 0046 | 应用主账号PAN |  |
| 0047 | 卡片持有者姓名扩展 |  |
| 0048 | 应用密码 |  |
| 0049 | 银行标识代码 |  |
| 004A | 发卡行国家代码 |  |
| 004B | 发卡行标识 |  |
| 004C | 卡片序列号 |  |
| 004D | 服务代码 |  |
| 004E | 应用模板 |  |
| 004F | 应用标识符 |  |
| 0050 | 应用标签 |  |
| 0051 | 应用首选名称 |  |
| 0052 | 应用优先级指示器 |  |
| 0053 | 发卡行代码表索引 |  |
| 0054 | 应用主账号PAN |  |
| 0055 | 日志条目 |  |
| 0056 | 磁条1等效数据 |  |
| 0057 | 磁条2等效数据 |  |
| 0058 | 磁条3等效数据 |  |
| 0059 | 卡片持有者证件数据 |  |
| 005A | 应用主账号PAN |  |
| 005B | 跟踪1数据 |  |
| 005C | 跟踪2数据 |  |
| 005D | 跟踪3数据 |  |
| 005E | 卡片持有者证件类型 |  |
| 005F | 卡片持有者证件号码 |  |
| 0060 | 卡片持有者证件有效期 |  |
| 0061 | 卡片持有者证件发证机关 |  |
| 0062 | 卡片持有者证件发证国家 |  |
| 0063 | 卡片持有者证件发证地点 |  |
| 0064 | 卡片持有者证件发证日期 |  |
| 0065 | 生物特征数据组模板 |  |
| 0066 | 生物特征信息组模板 |  |
| 0067 | 生物特征持有者模板 |  |
| 0068 | 存储容量 |  |
| 0069 | 可用内存 |  |
| 006A | 最大文件大小 |  |
| 006B | 文件标识符 |  |
| 006C | 短文件标识符 |  |
| 006D | 文件大小 |  |
| 006E | 总文件大小 |  |
| 006F | PIN长度 |  |
| 0070 | 安全属性 |  |
| 0071 | 安全环境 |  |
| 0072 | 数字签名 |  |
| 0073 | 公钥 |  |
| 0074 | 私钥 |  |
| 0075 | 密钥信息 |  |
| 0076 | 密钥组件 |  |
| 0077 | 密钥检查值 |  |
| 0078 | 密钥版本 |  |
| 0079 | 密钥标识符 |  |
| 007A | 密钥用途 |  |
| 007B | 密钥算法 |  |
| 007C | 密钥长度 |  |
| 007D | 密钥有效期 |  |
| 007E | 密钥状态 |  |
| 007F | 密钥数据 |  |
| 0080 | 扩展头列表 |  |
| 0081 | 日志格式 |  |
| 0082 | 日志数据 |  |
| 0083 | 持卡者证件 |  |
| 0084 | 跟踪数据 |  |
| 0085 | 交易计数器 |  |
| 0086 | 交易日期 |  |
| 0087 | 交易时间 |  |
| 0088 | 交易金额 |  |
| 0089 | 交易货币代码 |  |
| 008A | 交易类型 |  |
| 008B | 商户名称 |  |
| 008C | 商户国家代码 |  |
| 008D | 商户类别代码 |  |
| 008E | 终端国家代码 |  |
| 008F | 终端能力 |  |
| 0090 | 终端类型 |  |
| 0091 | 接口设备序列号 |  |
| 0092 | 应用交互特征 |  |
| 0093 | 应用生命周期状态 |  |
| 0094 | 应用优先级 |  |
| 0095 | 应用选择指示器 |  |
| 0096 | 应用用途控制 |  |
| 0097 | 应用版本 |  |
| 0098 | 应用有效日期 |  |
| 0099 | 应用失效日期 |  |
| 009A | 应用图像 |  |
| 009B | 应用标签 |  |
| 009C | 应用首选名称 |  |
| 009D | 应用交易计数器 |  |
| 009E | 最后在线ATC寄存器 |  |
| 009F | PIN尝试计数器 |  |

## 六、解卡常用指令组合

### 6.1 文件系统探索
```bash
# 1. 选择MF
00A40000023F00

# 2. 尝试获取文件列表
00A4000C00

# 3. 尝试常见文件标识符
00A40000020001  # 常见系统文件
00A40000020002
00A40000022F00  # DIR文件
00A40000022F01  # ATR文件

# 4. 通过SFI快速读取(如果已知)
00B0850000  # 读取SFI=5
00B0860000  # 读取SFI=6
```

### 6.2 安全状态探测
```bash
# 1. 检查PIN状态
00CA9F17  # 获取PIN尝试计数器

# 2. 尝试默认PIN
0020000004FFFFFFFF  # 验证PIN(PIN=FFFF)
002000000400000000  # 验证PIN(PIN=0000)
002000000412345678  # 验证PIN(PIN=12345678)

# 3. 获取安全环境信息
00CA9F06  # 获取安全环境
00CA9F07  # 获取算法信息
```

### 6.3 数据提取
```bash
# 1. 读取关键数据对象
00CA9F36  # 获取交易计数器
00CA9F13  # 获取最后交易日期
00CA9F1A  # 获取商户国家代码
00CA9F1B  # 获取交易货币代码

# 2. 读取应用数据
00CA4F00  # 获取应用标识符
00CA5000  # 获取应用标签
00CA9F38  # 获取PDOL
```

## 七、状态字(SW1SW2)关键代码

### 7.1 成功类
| SW1SW2 | 含义 |
|--------|------|
| 9000 | 成功 |
| 6100-61FF | 有XX字节数据待取(发送GET RESPONSE) |
| 6200 | 警告:状态未改变 |
| 6281 | 警告:回送数据可能损坏 |
| 6282 | 警告:文件长度小于Le |
| 6283 | 警告:选中的文件无效 |
| 6284 | 警告:FCI格式不符合ISO 7816 |

### 7.2 错误类(解卡重点关注)
| SW1SW2 | 含义 | 解卡意义 |
|--------|------|----------|
| 6300 | 认证失败 | PIN验证失败 |
| 63CX | 验证失败,剩余X次尝试 | PIN尝试次数信息 |
| 6700 | 长度错误 | Lc/Le值错误 |
| 6981 | 命令与文件结构不兼容 | 文件类型错误 |
| 6982 | 安全状态不满足 | 需要先认证 |
| 6983 | 认证方法锁定 | PIN被锁定 |
| 6984 | 引用数据无效 | 密钥/PIN错误 |
| 6985 | 使用条件不满足 | 条件未满足 |
| 6986 | 命令不允许(无当前EF) | 未SELECT文件 |
| 6987 | 安全报文数据项丢失 | 安全通信问题 |
| 6988 | 安全报文数据项不正确 | MAC/加密错误 |
| 6A80 | 数据域参数不正确 | 数据格式错误 |
| 6A81 | 功能不支持 | 指令不支持 |
| 6A82 | 文件未找到 | 文件不存在 |
| 6A83 | 记录未找到 | 记录不存在 |
| 6A84 | 文件空间不足 | 存储已满 |
| 6A85 | Lc与TLV结构不一致 | 长度不匹配 |
| 6A86 | P1P2参数不正确 | 参数错误 |
| 6A87 | Lc与P1P2不一致 | 长度参数冲突 |
| 6A88 | 引用数据未找到 | 密钥/PIN不存在 |
| 6A89 | 文件已存在 | 重复创建 |
| 6A8A | DF名称已存在 | 重复DF |
| 6D00 | INS不支持 | 指令代码错误 |
| 6E00 | CLA不支持 | 类别代码错误 |
| 6F00 | 未知错误 | 一般错误 |

## 八、非标准扩展指令(厂商特定)

### 8.1 MIFARE Classic相关
| INS | 功能 | 说明 |
|-----|------|------|
| C0 | MIFARE Classic认证 | `FF C0 00 块号 06 [密钥]` |
| C1 | MIFARE Classic读块 | `FF C1 00 块号 10` |
| C2 | MIFARE Classic写块 | `FF C2 00 块号 10 [数据]` |

### 8.2 特殊功能指令
| INS | 功能 | 说明 |
|-----|------|------|
| B2 | READ RECORD(扩展) | 某些卡片支持更多模式 |
| D6 | UPDATE BINARY(扩展) |  |
| DA | PUT DATA(扩展) |  |
| E4 | ERASE BINARY | 擦除二进制文件 |
| E6 | ERASE RECORD | 擦除记录 |

## 九、实用速查表

### 9.1 常用文件标识符
| 文件ID | 类型 | 用途 |
|--------|------|------|
| 3F00 | MF | 主文件 |
| 2F00 | EF | DIR文件(应用列表) |
| 2F01 | EF | ATR文件 |
| 2F02 | EF | 卡片发行者数据 |
| 0001-001F | EF | 系统文件 |
| 0100-01FF | EF | 用户文件 |
| 1000-10FF | DF | 应用目录 |

### 9.2 常用SFI范围
| SFI | 用途 |
|-----|------|
| 1-10 | 系统文件 |
| 11-20 | 密钥文件 |
| 21-30 | 用户数据文件 |

### 9.3 解卡工作流程指令序列
```bash
# 阶段1:卡片识别
00A40000023F00        # 选择MF
00A4000C00            # 获取文件列表
00CA4F00              # 获取AID

# 阶段2:文件系统探索
00A40000022F00        # 选择DIR文件
00B0000000            # 读取DIR内容
00A4000002XXXX        # 遍历发现的文件

# 阶段3:安全测试
0020000004FFFFFFFF    # 测试默认PIN
00CA9F17              # 检查PIN计数器
0084000008            # 获取挑战值

# 阶段4:数据提取
00B2010C00            # 读取记录1
00B2020C00            # 读取记录2
00CA9F36              # 获取交易计数器
```


回复 支持 反对

使用道具 举报

地板
发表于 昨天 19:45 | 只看该作者

回帖奖励 +2 分积分

Belli_666 发表于 2026-3-21 19:38
# APDU指令速查手册(解卡业务专用)

## 一、指令类别(CLA)速查

虽然看不懂,但是你的字多,你厉害
回复 支持 反对

使用道具 举报

5#
发表于 昨天 22:41 | 只看该作者

回帖奖励 +2 分积分

学习了,感谢指导,加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服

QQ|52梯控│电梯卡延期│电梯卡复制

GMT+8, 2026-3-22 01:32

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表