如何从磁条卡获取APDU命令并写入空白卡?求APDU入门指导
先理清核心误区:磁条卡≠APDU适用场景
APDU(Application Protocol Data Unit)是**IC智能卡(芯片卡)**的专属通信协议,磁条卡根本不使用APDU——磁条卡存储的是磁道1/2/3的明文/加密数据,读取靠磁头而非APDU命令。先确认你的卡是带芯片的IC卡,下面的内容才适用。
IC卡APDU读取+写入实操指南
1. 必备工具
- USB智能卡读卡器:ACR122U、ACS ACR38这类平民款就行,支持PC/SC标准
- 电脑工具:
pcsc_scan:快速识别读卡器和卡的基本信息gscriptor/pyApduTool:可视化发送APDU命令- Python
pyscard库:适合写脚本批量操作
2. 读取卡号的基础APDU操作
绝大多数IC卡(银行卡、门禁卡等)的卡号可以通过标准命令读取:
- 先发送选择应用命令(以PBOC金融卡为例,通用命令):
00 A4 04 00 07 A0000000031010 00 - 再发送读取二进制数据命令,提取卡号字段(偏移和长度可能因卡调整):
00 B0 00 00 10 - 卡返回的16进制数据转ASCII后,就是你要的卡号。
3. 提取完整APDU交互序列
要把卡内所有数据对应的APDU命令都导出来:
- 用
Wireshark抓取读卡器的USB通信流量,记录每一条发送的APDU命令和卡的响应 - 或者用
pyApduTool的日志功能,全程记录你读取卡数据时的所有命令 - 把这些命令按执行顺序整理,就是你需要的"可复用APDU命令集"
4. 写入空白IC卡的注意事项
- 空白卡必须和原卡同芯片型号、同应用规范(比如原卡是MIFARE Classic,空白卡也得是同类型)
- 按提取的APDU命令逐条顺序发送给空白卡,注意:
- 部分卡有写入保护,需要先发送解锁APDU(比如MIFARE卡的验证密钥命令)
- 通用写入命令格式:
00 D6 00 00 [数据长度] [待写入数据],参数要严格匹配原卡的写入逻辑
新手快速上手脚本示例
用Python pyscard写个简单的APDU发送脚本,快速体验:
from smartcard.System import readers from smartcard.util import toHexString # 连接第一个读卡器 reader = readers()[0] conn = reader.createConnection() conn.connect() # 发送选择PBOC应用的APDU命令 apdu = [0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0,0x00,0x00,0x00,0x03,0x10,0x10, 0x00] response_data, sw1, sw2 = conn.transmit(apdu) print(f"卡响应数据: {toHexString(response_data)}") print(f"状态字(判断是否成功): {hex(sw1)[2:].upper()}{hex(sw2)[2:].upper()}")
内容的提问来源于stack exchange,提问作者mike ball
相关产品推荐
相关产品推荐

