第二章:JCOP卡片物理特性与通信协议
做JCOP固件逆向,第一步不是拿示波器去抓信号,而是先搞清楚这张卡到底长什么样、怎么跟它说话。我见过不少新手上来就怼着7816接口猛测,结果发现卡片其实是非接触式的——白忙活一场。所以这一章,咱们先把物理层和通信协议捋清楚。
2.1 接触式接口:ISO/IEC 7816
接触式智能卡,说白了就是那张插进读卡器里的塑料片。它的物理接口由ISO/IEC 7816-2定义,标准触点有8个,编号C1到C8。但实际用的通常只有6个:VCC(电源)、GND(地)、RST(复位)、CLK(时钟)、I/O(数据线),还有VPP(编程电压,现在基本废弃了)。
我个人习惯,拿到一张卡先看触点氧化程度。如果触点发黑或者有划痕,大概率是频繁插拔导致的接触不良。我曾经遇到过一张卡,怎么复位都不应答,换了台读卡器就好了——就是触点脏了。
| 触点编号 | 信号名称 | 说明 |
|---|---|---|
| C1 | VCC | 供电电压,通常5V或3V |
| C2 | RST | 复位信号,低电平有效 |
| C3 | CLK | 时钟信号,频率通常1-5MHz |
| C4 | RFU | 保留未用 |
| C5 | GND | 地 |
| C6 | VPP | 编程电压,现代卡片已废弃 |
| C7 | I/O | 半双工数据线 |
| C8 | RFU | 保留未用 |
通信协议方面,7816-3定义了T=0(字符传输)和T=1(块传输)两种协议。T=0是字节级传输,每次发一个字节带奇偶校验;T=1是块级传输,有更完善的差错控制。JCOP卡片通常支持T=1,但有些老卡只支持T=0。你想想看,如果固件里只实现了T=0,你用T=1去通信,卡片根本不理你。
2.2 非接触式接口:ISO/IEC 14443
非接触式卡,就是那种靠近读卡器就能刷的卡。它靠电磁感应供电,工作频率13.56MHz。ISO/IEC 14443定义了两种类型:Type A和Type B。JCOP卡片通常支持Type A,也就是NXP的MIFARE系列用的那种。
14443的通信过程分几步:首先是PCD(读卡器)发送REQA命令,PICC(卡片)应答ATQA。然后进行防冲突和选卡,最后进入激活状态。嗯,这里要注意,非接触式通信的速率比接触式慢不少,而且容易受电磁干扰。我曾经在实验室里测一张卡,怎么都读不到ATQA,后来发现旁边放了个手机充电器——干扰太强了。
2.3 APDU命令结构
APDU(Application Protocol Data Unit)是智能卡通信的基本单位。不管是接触式还是非接触式,最终都是通过APDU来交换数据。APDU分两种:命令APDU(C-APDU)和响应APDU(R-APDU)。
命令APDU的结构是这样的:
CLA INS P1 P2 [Lc] [Data] [Le]
CLA: 指令类别,通常0x00表示ISO标准指令
INS: 指令代码,比如0xA4表示SELECT
P1, P2: 参数,具体含义看指令
Lc: 数据域长度(可选)
Data: 发送的数据(可选)
Le: 期望返回的数据长度(可选)
响应APDU的结构:
[Data] SW1 SW2
Data: 返回的数据(可选)
SW1, SW2: 状态字,比如0x90 0x00表示成功
举个例子,SELECT命令选择文件:
发送: 00 A4 04 00 02 3F 00
解释: CLA=00, INS=A4, P1=04(按名称选择), P2=00, Lc=02, Data=3F00(MF文件ID), Le=00
响应: 90 00
解释: 成功
我个人习惯,逆向分析时先抓一组正常的APDU交互,搞清楚卡片支持哪些指令。比如SELECT、READ BINARY、UPDATE BINARY这些基本指令。如果卡片返回6A 82(文件未找到),说明你选的路径不对;如果返回69 85(安全条件不满足),说明需要先验证PIN。
2.4 知识体系总览
下面这张图,是我自己总结的JCOP卡片物理与协议层知识结构。你可以把它当作一个快速索引,遇到问题先看这张图,定位到具体环节再深挖。
这张图把物理接口、通信协议、数据单元三个维度串起来了。你从物理层开始,一路走到APDU层,就能理解整张卡的工作流程。我建议你把这张图打印出来贴在工位上,做逆向时随时对照。