Реклама:

Чтобы выйти за пределы простой расшифровки ATR, следует изучить программы, которые обеспечивают настоящий "диалог" с картой, помещенной в устройство чтения-записи. В INVERSE. EXE используется обратный формат передачи, а в DIRECT. EXE - прямой. Тип карт следует предварительно определить с помощью программ ATR.EXE и DECART. BAS. Стоит подчеркнуть, что INVERSE. BAS и DIRECT. BAS представляют собой только исходные тексты, которые следует обязательно откомпилировать (преобразовать в файлы с расширением .ЕХЕ).

10 REM - INVERSE. BAS -

20 KEY OFF XLS

30 РА1Ш""Диалст в обратной формате ISO" 40 PRINT • PRIMT

50 OPEN "CDM1 :9600,0,B,2' AS "1

60 PRINT'Вставить карту и ввести команду ISO'

70 PRIMT -<ESC>: выход .PRIMT

60 GOSUB 110

90 PRIMT B1.M$;

100 GOTO 80

110 M$=" '

120 A$=1NKEYJ :1F A$<>~ THEM 150' 130 IF L0C(1)<>0 THEM GOSUB 230 И0 GOTO 120

160 IF A$=CHR$(27) THEM EMD 160 PRINT AS;

170 B$=IMKEY$ :IF B$=' THEN 170 180 PRINT Bit- -; 190 N=VAL("SH"+A$*B$)

200 GOSUB 370 210 MJ=CHR$(M) 22C RE1 URN 230 T$=TIME$

240 IF T$=TIMEJ THEM 240

250 IF L0C(1)=0 THEN fiEUffl

260 CJ=INPUTJ(L0C(1)."1): PRINT : PRINT " •

270 FOR K=1 TO LEN(C$)

280 M=ASC(MID$(C$.K.1))

290 GOSUB 370

300 Dt=HEX$(M)+" '

310 IF LEM(D$)<3 THEM DJ="0"+DJ

320 PRINT 0J;

330 NEXT К

340 IF L0C(1)<>0 THEN CJ=IMPUTJ(L0C(1),"1):GOTO 270 350 PRIMT "•'• 360 RETURN 370 M=255

380 IF M>127 THEM N=N-128 :M=M-1 390 IF M>63 THEN N=N-64 M=M-2 400 IF M>31 THEN N=N-32 :M=M-4 410 IF M>15 THEM N=M-16 :M=M-8 420 IF M>7 THEN N=M-8 :M=M-16 430 IF M>3 THEM N=M-4 :M=M-32 440 IF N>1 THEM N=N-2 :M=h-64 450 IF N>0 THEM M=M-128 460 RETURN

470 BEN (c)1997 Patrick GUEULLE

10 REM - DIRECT BAS -20 KEY OFF :CLS

30 PRINT' Диалог в обратном формате ISO" 40 PRINT :PRINT

50 OPEN "C0M1 .9600, e, 8,2" AS "1

60 РРІМГВстгвить карту и ввести команду ISO"

70 PRIMT"<ESC>: внход' :PRINT

80 GOSUB 110

90 PRINT m,Mt;

100 GDT0 80

110 M$="'

120 A$=IMKEY$ :1F AJO"" THEM 150 130 IF L0C(1)<>0 THEN GOSUB 210 140 GOTO 120

150 IF AI=CHR$(27) THEN EMD 160 PRINT AS;

170 BS=INKEY$ :IF B$= THEN 170

180 PRIMT BSt" ";

190 M$=CHR$(VAL("SH"+A$+BS))

200 RETURN 210 T$=TINEJ

22П. IF Т$=ТМЕ$ THEM 220

230 IF LDC(1)=0 THEM RETURN

240 CJ=INPUT$(L0C(1),"1): PRIMT : PRIMT ■

250 FOR K=1 TO LEN(CS)

260 D$=HEX$(ASC(MID$(C$.K,1)))f

270 IF tEN(D$)<3 THEN Di="0"+D$

280 PRIMT DJ;

290 NEXT К

300 IF LOC(1)oO THEN C$=IMPUT$(LOC(1)."1):G0T0 250 310 PRINT -.-320 RETURN

330 F.EN (c)1997 Patrick GUEULLE

Принцип работы программ крайне прост: все байты, которые выдает карта (начиная с ATR) выводятся на экран в шестнадцатерич-ном формате сразу после того, как они принимаются устройством чтения-записи. Блоки байтов, принятые из карты, для облегчения их дальнейшего распознавания помечаются звездочками (например, при копировании содержимого экрана). В любой момент можно передать в карту несколько байтов, набрав их в шестнадцатеричном формате на клавиатуре. Передача происходит немедленно, байт за байтом, без необходимости нажатия каких-нибудь клавиш для подтверждения.

Это обусловлено тем, что обменом управляет устройство чтения-записи: именно оно должно посылать команды карте, которая может ответить или "промолчать", согласно установленным для нес правилам безопасности (отсутствие реакции может рассматриваться как "знак протеста"). Команды могут быть "на запись" или "на чтение". Команда "на запись" служит для того, чтобы послать блок данных в карту, команда "на чтение" требует выдачи ответа. В протоколе Т = О все команды должны применять блок из пяти байтов, называемый заглавным, или header; его структура показана ниже.

Структура команды стандарта ISO

Диалог с картами

Самый первый байт (CLA) называют классом ISO команды. Это присвоенный карте код, расположенный в интервале от 00h до FEh. Он может быть OBCh для BULL СР8 (современной французской банковской карты) или ТВ 100 компании Philips - либо же A0h для карты телефона GSM. Значение по умолчарию 00 h также часто встречается, а спецификация EMV (Europay Mastercard Visa) предусматривает для некоторых финансовых карт следующего поколения код B0h.

Программы CLASSINV.EXE и CLASSDIH.EXE позволяют на карте неизвестного типа провести систематическое исследование класса ISO, перебирая все возможные сочетания. Следует помнить, что речь идет соответственно о компилируемых версиях CLASSINV.BAS (для карт с обратным форматом передачи) и CLASSDIH. BAS (для карт с прямым форматом передачи) и не следует пытаться запускать нижеприведенные исходные тексты в интерпретаторе GWBASIC.

10 REM - CLASSINV.BAS -20 KEY OFF :CLS

30 РАШТ"определение класса ISO карта с обратим форматов передачи" 40 PRINT :РЙМТ

50 OPEN Х0М1 :9600.0.8,2" AS "1

60 PRINT Вставьте карту в картоприемник

70 IF L0C(1)<>0 THEN 100

80 IF IMKEYS=CHflS(27) THEM 570

90 GOTO 70

100 TS=TIMEJ :BEEP

110 IF Tt=TIMEJ THEN 110

120 A$="1

130 WHILE NDT E0F(1) 140 AS=AWNPUT$(1,"1) 150 WE.4C

160 IF LEFT$(Ai,1) = CHR$(3) THEN 180

170 CLS : PRINT "Карта не распознана" :G0T0 570

1B0 FOR R=0 TO 254

190 IF IMKEYJ=CHR$(27) THEN 570

200 CS=HEXt(fi)

210 IF LEM(CS)=1 THEN C$="0"+CJ

220 B$=C$+"B008E090"

230 CLS .PRINT CS.

240 FOR F=1 TO 9 STEP 2

250 K$=MJD$(B".F,2)

260 MS="Srf +K$

270 M=VAL(MS)

280 G0SU8 580

290 PRIMTH1,CHfl$(M),

300 FOR T=0 TO 20 NEXT T

310 MEXT F

320 UPTIMES

330 IF T$=TIMES THEN 330

340 IF L0C(1)<>0 THEM 370

350 IF IHKEY"=CHRS(27) THEN 570

360 GOTO 340

370 A$=INPUTJ(L0C(1)."1)

380 "="'

390 FOR F=1 TO LEN(A$) 400 N$=MTD$(At,F,1) 410 N=ASC(N$) 420 G0SUB 580 430 M$=HEXJ(M)

440 IF LEN(M$)=1 THEM M$="0"+MJ 450 D$=D$+MJ 460 NEXT F

470 IF LOCdJoO THEN A$=INPUT$(L0C(1),"1):G0TO 390 480 IF LEFT$(D$,2)o"6E" THEN 510 490 NEXT R 500 GOTO 570

510 PRINT Класс распознан" :PRINT :PRINT :FJEEP

520 PRIMT'Продолжить исследование: <ENTER>"

530 РА1МТ"Выход: <ESC>"

540 IF INKEY$=CHR$(27) THEM 570

550 IF IMKEYJ=CHR$(13) THEM 490

560 GOTO 540

570 PRINT :PRINT :END

580 N=255

590 IF M>127 THEM M=M-128 :M=N-1 600 IF M>63 THEN M=N-64 :M=M-2 610 IF M>31 THEM M=N-32 :M=M-4 620 IF N>15 THEM M=N-16 :M=M-8 630 IF N>7 THEN M=N-8 :M=M-16 640 IF N>3 THEN N=N-4 :M=M-32 650 IF M>1 THEN M=N-2 :M=M-64 660 IF M>0 THEM M=M-128 670 RETURN

680 REN (c)1997 Patrick GUEULLE

10 REM - CLASSDIR.BAS -20 KEY OFF :CLS

30 РРШ"'Исследование класса ISD карты с прямым форматом передачи" 40 PRINT PRIMT

50 OPEN "С0М1 :9600,е.8.2" AS "1

60 PRINT"BcTaBbTe карту в картоприемник"

70 IF L0C(1)<>0 THEN 100

BO IF IMKEY$=CHR$(27) THEM 550

90 GOTO 70

100 T$=TIME$ 'BEEP

110 IF TS= TIMES THEM 110

1J0 A$="-

130 WHILE NOT EOF(l)

140 AJ"AJtIMPUTS(1,"1)

150 WEMO

160 IF LEFTS(AJ,1) = CHfi$(59) THEN 180

170 CLS :PRINT"Kapra не распознана" :GOT0 550

180 FOR R=0 TO 254

190 IF IMKEY$=™$(27) THEN 550

200 CS=HEXt(R)

210 IF LEM(C$)=1 THEN Ct="0"+C$

220 B$=CJ+"B008E090"

230 CLS :PRIMT C$.

240 FOR F=1 TO 9 STEP 2

250 KS=MID$(B$.F.2)

260 N$=Hn'+KS

270 H=VAL(NS)

280 PR1NTB1,CHR$(M);

290 FOR T=0 TO 20 :MEXT T

300 NEXT F

310 T$=TIME$

320 IF T$=TIME$ THEM 320

330 IF LOC(1)oO THEN 380

340 IF INKEYS=CHfl$(27) THEN 550

350 GOTO 330

360 AS=INPUTS(L0C(1),"1)

370 D$="

380 FOR F=1 TO LEN(AJ) 390 NS=M1D$(AJ,F,1) 400 M=ASC(Nt) 410 MJ=HEX$(M)

420 IF LEN(M$)=1 THEN M$="0"+MJ 430 D$=D$+M$ 440 MEXT F

4S0 IF L0C(1)<>0 THEN AJ=INPUT$(LOG(1)."1)'G0TO 380 460 IF LEFT$(D$,2)o'6E' THEM 490 470 MEXT R 480 GOTO 550

490 PRINT" Класс распознан" : PRINT : PRINT :BEEP

500 РР1пТ"Продол)кить исследование: <ENTER>"

510 PRINT "Выход: <ESC>'

520 IF INKEY$=CHR$(27) THEM 550

530 IF IMKEYt=CHR$(13) THEN 470

540 GOTO 520

550 PRINT :PRINT :EMD

560 REM (c)1997 Patrick GUEULLE

Конечно же, не стоит надеяться на то, что с помощью этих программ удастся определить конфиденциальный код карты, поскольку любая хорошо защищенная карта полностью блокируется после трех неудачных попыток.

Следующий байт (INS) - собственно команда, посылаемая карте; можно сказать, что это код операции (opcode). Коды нижеперечисленных операций уже стали классическими и используются во многих асинхронных картах;

BOh Чтение байтов

DOh Запись байтов

20h Ввод кода

Три перечисленных кода позволяют проводить интересные эксперименты, хотя всегда выгоднее найти полную систему команд для каждого типа карт, с которым предполагается работать. Вот, например, список команд, используемых картами GSM:

24h

change CHV

26h

disable CHV

28h

enable CHV

COh

get response

32h

increase

04h

invalidate

BOh

read binary

B2h

read record

44h

rehabilitate

88h

run GSM algorithm

A2h

seek

A4h

select

FAh

sleep

F2h

status

2Ch

unblock CHV

D6h

update binary

CDh

update record

20h

verify CHV

Если система команд неизвестна, можно испытывать коды, заимствованные у других карт и, если они воспринимаются исследуемой картой, применять их в дальнейшем. Банты AI и А2, которые следуют за командой INS, составляют так называемое расширение команды. Это может быть физический адрес зоны памяти для чтения или записи, номер кода или ключа

Пятый байт (L) устанавливает длину следующего после него блока данных. Они передаются карте, если команда "на запись", и принимаются из карты, если команда "на чтение". Значение OOh выделено для команд, которые не требуют операций записи или чтения:

аннулирование, реабилитация, перевод в режим ожидания, ратификация кода и т.п.

Как только карта распознает заголовок действительной команды, она отвечает байтом процедуры. Сразу после этого следует блик данных, передаваемых картой по команде "на чтение"; если же команда "па запись", этот байт служит для устройства чтения-записи сигналом готовности карты к приему данных. В последнем случае устройство должно передать ровно столько байтов, сколько указано в байте L. В большинстве случаев байт процедуры идентичен коду операции (INS), но он может быть равен INS+1; это значит, что на карту следует подать напряжение Vpp (по командам записи или ввода кода).

Карта квитирует завершение обработки команды двумя бантами SW1 и SW2 (иногда в виде исключения - одним), которые передаются устройству чтения-записи либо в конце блока выдаваемых данных, либо после получения последнего байта из принимаемых данных. Если все завершилось удачно, то ответ будет 90 00. Другие значения байтов SW1 и/или SW2 позволяют уточнить истинное положение дел.

Отчет, начинающийся с 6Eh или 6Dh, указывает на то, что команда не поддерживается картой. 6Eh означает, что байт CLA не соответствует классу карты, а 6Dh - что INS является недопустимым кодом операции. Другие отчеты, начинающиеся с 6, показывают, что карта восприняла команду, но она неверно сформулирована: некорректное расширение - 6Bh (например, попытка считывания по адресу, которого не существует), некорректная длина - 67h (при введении слишком длинного или слишком короткого кода).

В подобных случаях байт SW2 часто содержит скорректированный код команды, что очень полезно для начинающих исследователей. Значение 6Fh зарезервировано для случаев, которые пока нигде не описаны.

Значения отчетов, начинающихся с 9, так же как байты SW2, не определяются стандартом, а зависят от области применения. Тем не менее существует ряд неписаных соглашений по некоторым из них: 9010h Ввод неверного кода (1 попытка) 9020h Ввод неверного кода (2 попытка) . 9040h Ввод неверного кода (3 попытка) 9080h Ввод неверного кода (карта блокирована) 9001h Ошибка при записи в ЭППЗУ 9202h Ошибка при записи в ЭСППЗУ

9802h Неверный секретный код 9804h Некорректный ввод кода 9806h Код аннулирован

9810h Не соблюдается условие безопасности 9820h Секретный код неактивен

Большое количество операций требует введения того или иного кода, который обеспечивает безопасность карты, поэтому важно знать, что для разных типов карт предусмотрены разные способы представления кодов. Например, применительно к картам BULL СР8 код пользователя из четырех цифр надо преобразовать в одно слово из 4 байт по "открытому" алгоритму. Код 4950, таким образом, должен быть представлен (вместе с расширением OOOOh) в виде 12543FFFh. После первого ввода он обязательно "ратифицируется" командой ВС 40 00 00 00.

При работе с картами COS компании Gemplus коды из 4 байт перед вводом должны быть преобразованы в коды из 8 байт. Эта операция состоит в том, что к каждой половине байта в старшие разряды добавляются 4 бита, значения которых абсолютно произвольны. Код 45343F45h может быть преобразован в строку вида 04050304030F0405h или, что более удобно, - 54455354434F4445h (TESTC0DE в символах ASCII), часто опознаваемый тестовыми чип-картами.

Расшифровка ответа на сброс || Оглавление || Практические примеры