被操纵的CAP文件是否可以在安装过程中破坏Java卡?

时间:2015-04-19 11:13:53

标签: javacard globalplatform jcop

我有一张可以正常使用的Java卡:

GlobalPlatfomPro:: gp -list
AID: A000000003000000 (|........|)
     ISD OP_READY: Security Domain, Card lock, Card terminate, Default selected,
 CVM (PIN) management

我编写了一个简单的程序,在接收到每个命令时返回APDU缓冲区:

public class BArrayReturner extends Applet {

    public static byte[] theArray={(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff};
    public static short arrayLength=0;

    private BArrayReturner() {

    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {

        new BArrayReturner().register();
        BArrayReturner.arrayLength=(short)bArray.length;
        Util.arrayCopyNonAtomic(bArray, (short)0,BArrayReturner.theArray , (short) 0, BArrayReturner.arrayLength);    
    }

    public void process(APDU apdu) throws ISOException {
        byte[] buffer=apdu.getBuffer();
        Util.arrayCopyNonAtomic(BArrayReturner.theArray, (short)0,buffer , (short) 0, (short)0x40); 
        apdu.setOutgoingAndSend((short)0, (short)255);
    }

}

将上述程序转换为.cap文件后,我使用 WinRAR 打开了cap文件,并更改了 .CAP 文件的一个字节,如下所示: / p>

(我在 class.cap )的第九轮中替换了0x78而不是0x07

点击放大:

enter image description here

现在我尝试安装这个新的cap文件。但不仅安装失败了,而且我不能再列出我卡的内容了:

GlobalPlatfomPro:: gp -list -v -d
# Detected readers
[*] ACS CCID USB Reader 0
SCardConnect("ACS CCID USB Reader 0", T=*) -> T=0
SCardBeginTransaction("ACS CCID USB Reader 0")
Reader: ACS CCID USB Reader 0
ATR: 3B68XxXxXxXxXxXx009000
More information about your card:
    http://smartcard-atr.appspot.com/parse?ATR=3B68XxXxXxXxXxXx009000

A>> T=0 (4+0000) 00A40400 00
A<< (0000+2) (20ms) 6F00
SCardEndTransaction()
SCardDisconnect("ACS CCID USB Reader 0", false)
Exception in thread "main" java.lang.IllegalStateException: No selected ISD!
        at openkms.gp.GlobalPlatform.openSecureChannel(GlobalPlatform.java:327)
        at openkms.gp.GPTool.main(GPTool.java:280)

我的问题:

这个新生成的CAP文件在我的智能卡上发生了什么?有没有人知道字节代码和源和操作文件中此字节的含义?这是安装受操纵文件的良好逻辑响应吗?

注1:

我也尝试在我的JCOP卡上安装这个新的 cap 文件。安装再次失败,但不是上述错误,卡静音大约15分钟。 (读卡器必须大约15分钟再次激活!)

注2:

我试图更改此文件的第10个字节而不是第9个字节。所以我将0x01替换为0x45。之后我成功安装了新的CAP文件!卡也不应该在字节码验证后检测到这种操作并阻止安装吗?

1 个答案:

答案 0 :(得分:3)

您成功触发了卡上的防御机制! 根据您更改的内容,字节代码验证程序会失败并使卡静音,否则它将通过测试。 cap文件只是一个容器。如果您想要更深入的分析,您必须阅读有关实际Java Card Byte代码的更多信息