之前没有对金融卡片研究过今天用自己的建行环球旅行信用卡学习一下。
使用的读卡器是一款CCID的接触式读卡器,北京的中国移动营业厅有使用他的低版本型号。CCID的读卡器通讯API还算比较简单,自己之前有现成的代码,但是测试了一下,在选择完T0协议后,通讯还是有问题,向卡片发数还是有问题,总是犯0xE的错误。不查代码了直接用我司麻工研发的强大的snooper。
首先上来是选择MF
1.SELECT
APDU:00A404000E 315041592E5359532E444446
3031
SW1SW2:6120
好久木有用看COS了,还在等9000呢,最后经@智能卡技术 提醒才反应过来要再取剩下20个字节。
2.GET RESPONSE
APDU:00C0000020
RETURN:6F1E840E315041592E535953
2E4444463031A50C8801015F
2D027A689F110101
SW1SW2:9000
返回的数据是FCI,按照PBOC2.0的规范解析了一下,可以从FCI中得到SFI,然后去读取支付系统目录记录。
3.READ RECORD
APDU:00B2010C00
SW1SW2:6C31
按状态字的指示调整一下READ RECORD指令的LE重新发指令
4.READ RECORD
APDU:00B2010C31
RETURN:702F612D4F08A00000033301
0102500B50424F4320435245
4449549F1210434342205042
4F43322E3020434152448701
01
SW1SW2:9000
返回9000,得到的数据就是支付系统目录记录,按照PBOC2.0的规范分析一下数据,可以从数据中得到只有一个目录入口,然后按照规范中对ADF格式的说明,从ADF中可以得到下面的信息
4F 08
A000000333 010102 AID 最后PIX为010102标明了是贷记应用
50 0B
50424F4320435245444954应用标签
9F12 10
4343422050424F43322E3020 43415244 应用优先名称
87 01
01 应用优先权标识符 b8是0,不需要持卡人选择即可选择应用
下面直接选择AID,规范上对SELECT命令的P1,P2说明比较简单,开始一直是6DOO,不可能是INS错啊,后来发现P1=04才搞定,P1的第三bit要为1才行,OMG。
(按照PBOC2.0的规范,应该在目录SFI,从记录1开始向后读,一直读到卡片返回状态字为6A83,然后再从ADF中查找AID和终端匹配的应用,这里因为自己明显是分析者,啥应用都支持。)
5.SELECT
APDU:00A4040008 A000000333010102
SW1SW2:614E
按照状态字的指示继续获取剩下的数据
6.GET RESPONSE
APDU:00C000004E
RETURN:6F4C8408A000000333010102
A540500B50424F4320435245
4449548701019F38099F7A01
9F02065F2A025F2D027A689F
1101019F1210434342205042
4F43322E302043415244BF0C
059F4D020B0A
SW1SW2:9000
按照规范分析一下选择了ADF的响应报文。
6F 4C
84 08 A000000333010102
//DF名称
A5 40500B50424F432043524544
4954870101
9F38 09 //PDOL的数据
9F7A 01
//电子现金指示器
9F02 06 //授权金额
5F2A 02 //交易货币代码
5F2D 02 7A68 //首选语言
9F11 01 01 //发卡行代码索引表
9F12 10 4343422050424F43322E 302043415244
BF0C 059F4D020B0A //发卡行自定义数据
貌似如果是北京公交卡的话在这就可以Get Balance了,这块还要用GPO,这块完全不熟,我再看看。。
搞定了再继续。