3

私は正常に動作する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ファイルに変換した後、cap ファイルをWinRARで開き、 .CAPファイルの 1 バイトを次のように変更します。

( class.capの 9 番目の bye の0x78代わりに置き換えました)。0x07

拡大するにはクリックしてください :

ここに画像の説明を入力

今、この新しい 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:

この新しいcapファイルを JCOP カードにもインストールしようとしました。インストールは再び失敗しましたが、上記のエラーの代わりに、カードは約 15 分間ミュートされました。(カードリーダーが再びアクティブになるには、約 15 分かかります!)

注2:

このファイルの 9 バイト目ではなく 10 バイト目を変更しようとしました。だから私はに置き換え0x01ました0x45。その後、新しい CAP ファイルを正常にインストールしました。カードはバイトコードの検証後にもこの操作を検出し、インストールを防止するべきではありませんか?

4

1 に答える 1

3

カードの防御メカニズムの発動に成功しました! 変更内容に応じて、バイトコード検証は失敗してカードをミュートするか、テストに合格します。cap ファイルは単なるコンテナです。より深い分析が必要な場合は、実際のJava Card Byteコードについてさらに読む必要があります

于 2015-04-20T09:06:04.887 に答える