第一章:JCOP开发环境搭建
做JCOP漏洞利用,第一步就是把开发环境搭起来。这活儿看着简单,但坑不少。我见过太多人卡在环境配置上,一卡就是好几天。
今天咱们就把JDK、GPAC工具链、JCOP模拟器、调试工具,还有那个经典的Hello World Applet,一口气搞定。
1.1 JDK安装——选对版本很重要
JCOP开发离不开Java。但注意,不是越新越好。
我个人习惯用JDK 8。为什么?因为GPAC工具链对JDK 8的支持最稳定。我曾经试过JDK 11,结果编译时一堆兼容性问题,折腾了两天才换回8。
安装步骤很简单:
- 去Oracle官网下载JDK 8(Windows x64版本)
- 双击安装,一路下一步
- 配置环境变量:
JAVA_HOME指向安装目录,PATH里加上%JAVA_HOME%\bin - 打开命令行,输入
java -version验证
C:\Users\jcop> java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
看到这个输出,说明JDK装好了。
1.2 GPAC工具链配置——核心中的核心
GPAC(GlobalPlatform Application Configuration)是JCOP开发的基础工具链。说白了,它就是用来编译、打包、安装Applet的那套东西。
GPAC包含几个关键组件:
| 组件 | 作用 | 我的建议 |
|---|---|---|
| gp.jar | 核心库,提供GP API | 版本选2.2.0以上 |
| ant-javacard.jar | Ant构建插件 | 配合Eclipse用很顺手 |
| converter.jar | 将class文件转为CAP文件 | 这个最容易出问题 |
配置步骤:
- 下载GPAC工具链(我一般从GitHub上拉最新release)
- 解压到
C:\gpac目录 - 设置环境变量
GPAC_HOME=C:\gpac - 把
%GPAC_HOME%\bin加到PATH里
build.properties文件,把GPAC路径写进去。这样换机器时只需要改一个文件,不用动环境变量。
1.3 JCOP模拟器使用——没有卡也能调试
做JCOP开发,你不可能每次都拿真卡来测。模拟器就是你的救星。
JCOP模拟器其实就是一个Java应用,它模拟了智能卡芯片的运行环境。我常用的版本是JCOP Tools 2.1.0。
启动模拟器:
java -jar jcop_simulator.jar -port 8050
参数说明:
-port 8050:监听端口,GPAC通过这个端口连接模拟器- 默认会加载一个空的JCOP环境
- 支持APDU交互,跟真卡一模一样
嗯,这里要注意:模拟器启动后,别急着关命令行窗口。关了模拟器就停了。
1.4 JCOP调试工具介绍——找到问题的眼睛
调试工具这块,我主要用三个:
- GPAC命令行工具:最基础,但最可靠。用
gp -list查看已安装的Applet,用gp -install安装新Applet。 - Eclipse + Ant插件:我个人的主力开发环境。配置好build.xml后,一键编译、安装、调试。
- APDU调试器:比如GlobalPlatformPro自带的
gp --debug模式,可以逐条发送APDU命令,查看响应。
我曾经遇到过一个诡异的bug:Applet在模拟器上跑得好好的,一上真卡就崩。后来用APDU调试器逐条跟踪,发现是某个APDU命令的LC字段长度不对。这种问题,没有调试工具根本查不出来。
1.5 Hello World Applet编写——第一个JCOP程序
终于到写代码的环节了。咱们写一个最简单的Applet:收到APDU命令后,返回"Hello World"字符串。
package com.jcop.demo;
import javacard.framework.*;
public class HelloWorldApplet extends Applet {
private static final byte[] HELLO_WORLD =
new byte[] {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
private static final byte CLA = (byte) 0x00;
private static final byte INS_HELLO = (byte) 0x01;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new HelloWorldApplet().register();
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
// 检查CLA和INS
if (buffer[ISO7816.OFFSET_CLA] != CLA) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
if (buffer[ISO7816.OFFSET_INS] != INS_HELLO) {
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
// 返回Hello World
apdu.setOutgoingAndSend((short) 0, (short) HELLO_WORLD.length);
Util.arrayCopy(HELLO_WORLD, (short) 0, buffer, (short) 0,
(short) HELLO_WORLD.length);
}
}
代码不多,但有几个关键点:
install()方法是入口,每个Applet必须实现process()处理APDU命令,是核心逻辑- 记得检查CLA和INS,不然会出安全漏洞
编译和安装:
# 编译
javac -cp %GPAC_HOME%\lib\gp.jar HelloWorldApplet.java
# 打包成CAP文件
java -jar %GPAC_HOME%\lib\converter.jar -classdir . -applet 0x01:0x02:0x03:0x04:0x05:0x06 HelloWorldApplet
# 安装到模拟器
gp --install HelloWorldApplet.cap --key 404142434445464748494A4B4C4D4E4F
看到Successfully installed的提示,说明你的第一个JCOP Applet已经跑起来了。
--key参数是默认的测试密钥。真卡上一定要换掉,不然你的Applet就是裸奔状态。
本章小结
环境搭建这块,说白了就是三件事:JDK装对版本、GPAC配好路径、模拟器能跑起来。代码反而是最简单的。
我刚开始学JCOP时,光环境就搭了三天。现在回想起来,其实就是几个环境变量没设对。所以别急,一步步来,肯定能搞定。
下一章咱们会深入APDU通信协议,那是JCOP漏洞利用的基础。到时候见。
公众号:蓝海资料掘金营,微信deep3321