executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-javacardJava Card / SIM 卡 applet 逆向:CAP 文件组件解析(规范 12 组件)、CAP 字节码(Java 子集)还原、AID 与安装参数、process(APDU) 分派。 触发词:Java Card、javacard、CAP 文件、SIM 卡、USIM、applet、AID、银行卡、JCVM。
Independent GitHub snapshot · Automated classification · Original documentation governs
所有工具先验证再使用。静态解析可免沙箱;涉及真实卡片与读卡器交互先确认授权边界(卡片归属与分析目的),动态执行默认沙箱([[re-analyze/platform-tips]] 最高原则)。
git clone https://github.com/martinpaljak/ant-javacard(capfile 已并入其中);作为库引用构建。验证:解析样例 CAP 无异常git clone https://github.com/benallard/caprunner + git clone https://github.com/benallard/pythoncard(pythoncard/pythoncardx 目录放入 caprunner 同级路径);验证:python3 readcap.py <file.cap> 能列出组件信息git clone https://github.com/osmocom/pysim;pySim/javacard.py 的 CapFile 类——校验 Header 魔数 0xDECAFFED、读包 AID/applet AID、拼安装顺序 load file;验证:python3 -c "import sys; sys.path.insert(0,'pysim'); from pySim.javacard import CapFile; print(CapFile('x.cap').get_loadfile_aid())"java -jar gp.jar --version;java -jar gp.jar --list(列卡上应用与 AID)apt install default-jdk / dnf install java-17-openjdk / pacman -S jdk-openjdk;macOS: brew install openjdk;Windows: 官方 JDK 安装包javap -versionAPPLET-INF/classes/**/*.class(SDK 转换器打包,unzip -l 可见),unzip -p x.cap APPLET-INF/classes/com/example/Foo.class > Foo.class && javap -c -p Foo.class 拿到 Java 视图,与 CAP 字节码互相对照(注意操作码编号与指令名差异,见坑 3)git clone https://github.com/frankmorgner/vsmartcard,编译 virtualsmartcard 后 systemctl restart pcscd;Windows: BixVReader 类虚拟读卡器pip install pyscard(Linux 依赖 apt install libpcsclite-dev pcsclite pcscd / dnf install pcsc-lite-devel pcsc-lite / pacman -S pcsclite ccid;macOS: brew install pcsc-lite);验证:python3 -c "from smartcard.System import readers; print(readers())"按顺序执行,每步产物(解析脚本、反汇编文本、AID/INS 清单)与样本 sha256 存档;动态执行默认沙箱。
CAP 来源与文件识别:
file x.cap(ZIP 归档)→ unzip -l x.cap——存在 META-INF/MANIFEST.MF + <包路径>/javacard/*.cap 组件文件即为 CAP;含 APPLET-INF/classes 说明带原始类文件(步骤 4 可对照 javap);不含 javacard/ 组件文件则可能是后缀错误、加密负载或其他格式(见坑 4)sha256sum x.cap 归档;记下 Header 中的格式版本组件枚举与 Header 校验:
组件清单(Java Card 规范,tag 1-12;核心必备 + 可选):
| tag | 组件 | 内容与作用 |
|---|---|---|
| 1 | Header | 魔数、格式版本、flags、包 AID、包名 |
| 2 | Directory | 各组件大小表(缺失可选组件记 0)、静态字段尺寸、import/applet 计数 |
| 3 | Applet(可选) | applet 数、各 applet AID + install() 方法偏移 |
| 4 | Import | 外部包 AID 列表(供常量池外部引用定位) |
| 5 | ConstantPool | token → 类/字段/方法引用(6 类条目,每条 4 字节) |
| 6 | Class | 类/接口定义:标志位、父类引用、虚方法表、实现接口 |
| 7 | Method | 方法体:异常处理器表 + 方法头(max_stack/nargs/max_locals)+ CAP 字节码 |
| 8 | StaticField | 静态字段镜像区与数组初始化数据 |
| 9 | ReferenceLocation | 字节码中常量池 token 操作数的位置列表(安装时打补丁用) |
| 10 | Export(可选) | 对外可见的类/方法/字段符号(跨包链接用) |
| 11 | Descriptor | 签名池:方法名、描述符、method_offset 与 bytecode_count |
| 12 | Debug(可选) | 调试信息字符串表(含方法名),离线验证/还原用 |
网上流传的「九组件」列举(Header/Directory/Import/ConstantPool/Class/Method/Descriptor/Export/Applet)是简化说法,遗漏了字节码链接必需的 StaticField 与 ReferenceLocation——解析以本表为准
Header 字节布局:01 | size(u2) | magic=0xDECAFFED | fmt_minor | fmt_major | flags | pkg_minor | pkg_major | aid_len | 包AID | [包名];flags: 0x01=ACC_INT、0x02=ACC_EXPORT、0x04=ACC_APPLET;魔数不是 0xDECAFFED 即非合法 CAP(或已被加密/截断,见坑 4)
Directory 驱动组件一致性校验:
Method 组件方法体还原:
07 | size(u2) | handler_count(u1) | 异常处理器表(每条 8 字节:start_offset u2、active_length 位域 u2、handler_offset u2、catch_type_index u2)| 方法体序列(方法头 + 字节码)Import / 常量池 / Export 跨组件引用解析:
Applet 入口与 process(APDU) 分派还原:
unzip -l 确认结构,组件边界以各组件文件自身的 tag+size 为准