Итак, вставив карточку в ридер, подав на нее питание и получив ATR (Answer To Reset - ответ карточки на подачу питания или команду СБРОС/RESET), выполняем по шагам ...
Шаг 1. Предъявляем админовские пароли.
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
2A
|
00
|
00
|
08
|
|
00 00 00 00 00 00 00 00
|
|
Чисто случайно получаем ответ 90 00 и невозмутимо продолжаем -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
2A
|
00
|
01
|
08
|
|
00 00 00 00 00 00 00 00
|
|
Не путайте пароли администратора с PIN и PUK-кодами, которыми Вы пользуетесь в процессе
эксплуатации своего телефона.
Чтобы исключить возможную путаницу понятий в дальнейшем, разграничим
понятия PIN-кодов и паролей администратора.
Пароли администратора позволяют получить неограниченный доступ к содержимому
карточки, в то время, как PIN и PUK-коды это всего лишь определенные в файловой системе GSM файлы (CHV1 и CHV2),
содержащие эти самые коды, плюс сопутствующая информация.
Эти файлы (CHV1 и CHV2) используются Вашим телефоном для
запроса ввода PIN и PUK кодов. Верификация кодов происходит путем сверки введенного с содержимым файла.
Предъявление PIN/PUK кодов ни в коей мере не позволит Вам вносить изменения на карте, как то - создание, запись или удаление файла.
А вот пароли администратора позволяют подобные манипуляции. К примеру, ели вы заблокировали Вашу карту, в том числе и PUK-код,
то зная пароли администратора, просто перезапишите определенные области в файле CHV1 (или CHV2, первый или второй PIN/PUK коды соответственно).
Шаг 2. Записываем PIN'ы и PUK'и.
Начинаем с CHV1 -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
00 00
|
|
Теоретически получаем 90 00. Обновляем содержимое (всего файла) -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
D6
|
00
|
00
|
17
|
|
01 00 00 31 31 31 31 FF FF FF FF 03 03 31 32 33 34 35 36 37 38 0A 0A
|
|
Здесь сделаю краткое отступление с целью объяснить формат содержимого CHV файла:
|
Byte
|
Parameter/Description
|
Mandatory-Optional
|
Length
|
|
1
|
Байт активации - 00 - не используется - 01 - нужно предъявлять при включении трубки
|
|
1
|
|
2-3
|
RFU, заполняется нулями
|
|
2
|
|
4-11
|
PIN (ASCII коды символов в HEX; значения FF - нет символов). Пин-код в нашем случае: 1111
|
|
8
|
|
12
|
Предустановленное к-во попыток ввода пин-кода
|
|
1
|
|
13
|
Оставшееся к-во попыток ввода пин-кода
|
|
1
|
|
14-21
|
PUK (ASCII коды символов разблокировки пина в HEX). PUK в нашем случае: 12345678
|
|
8
|
|
22
|
Предустановленное к-во попыток ввода кода разблокирования
|
|
1
|
|
23
|
Оставшееся к-во попыток ввода кода разблокирования
|
|
1
|
|
В данном примере пин-код, это четыре единицы - "1111" с ограничением количества попыток неправильного ввода равного трем, а PUK - "12345678" с соответствующим количеством попыток равным десяти.
Аналогичным образом записываем CHV2 -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
01 00
|
|
Должны получить 90 00. Обновляем содержимое (делаем пин и пак-коды одинаковыми) -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
D6
|
00
|
00
|
17
|
|
01 00 00 31 31 31 31 FF FF FF FF 03 03 31 32 33 34 35 36 37 38 0A 0A
|
|
Проверить корректность записи пин-кодов можно командой -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
20
|
00
|
01
|
08
|
|
31 31 31 31 FF FF FF FF
|
|
Это обычная проверка пин-кода. Именно такой APDU формируется Вашим телефоном и отсылается карточке, когда, после включения телефона, вводится пин-код. Результат должен быть 90 00.
Шаг 3. IMSI или Ваш персональный логин в сеть.
IMSI (International Mobile Subscriber Identity) - это глобально уникальный идентификатор абонента. Формируется из 3 частей:
код страны + код сети оператора GSM + внутрисетевой код абонента. Сопоставляется в биллинговой и коммуникационной системе оператора с выделенным абоненту телефонным номером, собственно поэтому IMSI и выполняет роль логина в сеть ;-).
Формат IMSI, который используется оператором, отличается от хранимого на SIM-карте. Допустим, к примеру, что оператор видит IMSI как - 123456789012345 (15 цифр). Тогда на карточку нужно заносить IMSI в виде - 08 19 32 54 76 98 10 32 54. Правило преобразования следующее:
- к IMSI а-ля оператор приписываем 809 слева, в результате чего получаем - 809123456789012345 (18 цифр);
- считаем, что полученное на предыдущем этапе число в BCD формате (т.е. каждые две цифры представляют один байт). Переставляем старший и младший ниблы каждого байта местами. В результате должны получить что-то подобное этому - 081932547698103254. Первый байт отражает количество значащих байт (исключая байт длины - себя), необходимых для IMSI.
Длина IMSI не может превышать 8 байт. Но иногда иператоры могут использовать укороченную нотацию, когда IMSI меньше 15 цифр. В таком случае, необходимо IMSI от оператора дополнить справа шестнадцатеричными F до длины в 15 цифр и подвергнуть описанному выше преобразованию. Естественно, не забудте скорректировать первый байт, там уже не будет 8, а цифра поменьше.
Запишем наш IMSI.
Перейдем в директорию GSM -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
7F 20
|
|
Должны получить ответ вида 9F XX, где XX - длина доступных данных для команды Get Response.
Мы в директории GSM. Выбираем файл IMSI -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 07
|
|
Снова получаем 9F XX.
Выполняем запись содержимого файла IMSI -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
D6
|
00
|
00
|
09
|
|
80 91 23 45 67 89 01 23 45
|
|
Должны получить 90 00. IMSI записан.
Шаг 4. Ki - пароль доступа к сети.
KI (Mobile Subscriber Identification Key) - идентификационный ключ абонента. Используется для аутентификации абонента в сети оператора GSM.
Формат Ki, используемый оператором, представляет шестнадцатеричное число, длиной 16 байт, например: 12 34 56 78 90 AB CD EF 12 34 56 78 90 AB CD EF. Файл на карточке, содержащий Ki, имеет следующий формат -
00 LL 00 Ki ....... Ki ZZ YY 00
|
Byte
|
Parameter/Description
|
Mandatory-Optional
|
Length
|
|
1
|
RFU - зарезервировано
|
|
1
|
|
2
|
LL - длина Ki (HEX)
|
|
1
|
|
3
|
RFU - зарезервировано
|
|
1
|
|
4 - 19
|
значение Ki (HEX)
|
|
16
|
|
20
|
Предустановленное к-во попыток ввода
|
|
1
|
|
21
|
Оставшееся к-во попыток ввода
|
|
1
|
|
22
|
RFU - зарезервировано
|
|
1
|
|
Длина Ki может быть ментше 16 байт. В таком случае используется выравнивание влево, а неиспользуемые байты заполняются значениями FF.
После преобразования к необходимому виду, получаем -
00 10 00 12 34 56 78 90 AB CD EF 12 34 56 78 90 AB CD EF 08 08 00
Это значение и будем заносить на карточку.
Мы все еще в директории GSM. Поэтому сразу выбираем нужный файл -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
00 01
|
|
Отет вида 9F XX нас как всегда устраивает.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
22
|
|
00 10 00 12 34 56 78 90 AB CD EF 12 34 56 78 90 AB CD EF 08 08 00
|
|
И как всегда должны получить ответ карты - 90 00.
Шаг 5. Инициализируем необходимые файлы поддиректории GSM.
Файл Language Preference содержит коды одного или более языков в порядке предпочтения. Формат файла очень простой - каждый байт обозначает один из языков. Для простоты будем работать только с английским языком.
Выбираем нужный файл -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 05
|
|
Отет вида 9F XX нас как всегда устраивает.
Обновляем содержимое (только первый байт) -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
01
|
|
01
|
|
И как всегда должны получить ответ карты - 90 00.
Файл Ciphering key Kc содержит сессионный ключ. Формат - первые 8 байт есть, собственно, сам ключ. Последний, девятый байт, обозначает порядковый номер ключа, причем старшие 5 бит этого байта всегда должны быть выставлены в 0. Последний байт имеет специальное значение - 07 (в двоичном представлении - 00000111), что указывает на отсутствие ключа (ключ будет сгенерирован самой картой в процессе работы).
Выбираем нужный файл -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 20
|
|
Отет должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
09
|
|
FF FF FF FF FF FF FF FF 07
|
|
И как всегда должны получить ответ карты - 90 00.
Обратите внимание! В качестве значения ключа переданы байты FF. Это не есть тот ключ, который будет использоваться. Значения FF всегда используются в качестве заполнителя непроинициализированных полей файлов на смарт-карте, если дополнительно ничего не оговорено. О том, что ключа еще нет, также говорит и последний байт - 07.
Файл HPLMN search period - содержит итнервал времени между поисками HPLMN (изучайте матчасть, если интересно ;-) ). Формат файла - 1 байт, кодирующий время как (16Y+Z)n минут. Причем Y - старший, а Z - младший ниблы байта. Значение 00 - поиск не осуществляется.
Выбираем нужный файл -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 31
|
|
Отет должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
01
|
|
04
|
|
И как всегда должны получить ответ карты - 90 00.
Файл Administrative data. Не вдаваясь в подробности обновим содержимое файла -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F AD
|
|
Отет должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
03
|
|
00 FF FF
|
|
И как всегда должны получить ответ карты - 90 00.
В данном случае был установлен нормальный режим работы (первый байт равен 00) без дополнительных параметров (байты 2 и 3 равны FF).
Файл SIM servicу table отображает список сервисов, указывая какие из них доступны и активны. За дополнительной информацией обращайтесь к GSM 11.11. Вкратце - каждый байт отвечает за определенные четыре сервиса, указывая, который из них реализуется самой картой и активен. Я только заполню необходимые значения -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 38
|
|
Отет должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
04
|
|
FF 3F FF 0F
|
|
И как всегда должны получить ответ карты - 90 00.
Последний файл поддиректории GSM, с которым мы будем возиться - Broadcast control channels. Этот файл длиной 16 байт. Заполним его значениями по умолчанию -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 74
|
|
Отет должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
В6
|
00
|
00
|
10
|
|
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
|
И как всегда должны получить ответ карты - 90 00.
Перейдем в поддиректорию Telecom -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
7F 10
|
|
Отет должен быть 9F XX.
Здесь нас интересует только файл SMSP (Short message service parameters). Файл состоит из одной или нескольких записей, содержащих набор SMS параметров. Первая запись (возможно единственная) содержит набор параметров по умолчанию. Структура записи -
|
Byte
|
Parameter/Description
|
Mandatory-Optional
|
Length
|
|
1-Y
|
Alpha-Identifier
|
O
|
Y
|
|
Y+1
|
Parameter Indicators
|
M
|
1
|
|
Y+2 ... Y+13
|
TP-Destination Address
|
M
|
12
|
|
Y+14 ... Y+25
|
TS-Service Centre Address
|
M
|
12
|
|
Y+26
|
TP-Protocol Identifier
|
M
|
1
|
|
Y+27
|
TP-Data Coding Scheme
|
M
|
1
|
|
Y+28
|
TP-Validity Period
|
M
|
1
|
|
Колонка M/O таблицы указывается на обязательное/опциональное присутствие поля в записи (M - mandatory, O - optional). Единственное необязательное поле - альфа-идентификатор. Значение длины Y может быть равно нулю.
Следующее поле - индикатор параметров длиной 1 байт. Индикатор является битовой маской, указывающей наличие/отсутсвие следующих пяти полей в записи (если бит установлен в 1 - параметр присутствует) -
|
Byte
|
Parameter/Description
|
Mandatory-Optional
|
Length
|
|
1
|
TP-Destination Address
|
|
|
|
2
|
TS-Service Centre Address
|
|
|
|
3
|
TP-Protocol Identifier
|
|
|
|
4
|
TP-Data Coding Scheme
|
|
|
|
5
|
TP-Validity Period
|
|
|
|
6
|
зарезервирован, установлен в 1
|
|
|
|
7
|
зарезервирован, установлен в 1
|
|
|
|
8
|
зарезервирован, установлен в 1
|
|
|
|
Поле Destination Address оставляем незаполненным (поле заполняется непосредственно при отправке SMS-сообщения).
Поле Service Centre Address заполняется специфичным для конкретного оператора значением - номером сервис центра. Предположим, что номер сервис центра нашего оператора +38050-123-45-67 ;-). В таком случае поле TS-Service Centre Address будет иметь вид:
07 91 83 50 10 32 54 76 FF FF FF FF
Первый байт (07) указывает количество байт данный, содержащихся в поле. Неиспользуемые байты заполняются значениями FF. Второй байт (91) представляет тип закодированного адреса сервис-центра (GSM 3.40 Version5.3.0:July1996 страница 33). В нашем случае он указывает, что адрес сервис-центра представлен в виде международного номера телефона (не забудьте переставить местами старшие и младшие ниблы каждого байта!).
Следующее поле - TP-Protocol Identifier. Значение этого поля установим в 00. Подробное описание формата этого поля в документе GSM 3.40 (GSM 3.40 Version5.3.0:July1996 страница 47).
Поле TP-Data Coding Scheme тоже оставим нулевым - 00 (GSM 3.38 страница 8).
Поле TP-Validity Period (GSM 3.40 Version5.3.0:July1996 страница 33) указывает период времени, в течение которого будут предприниматься попытки доставить SMS-сообщение абоненту, недоступному в сети. Значение 168 (hex: A8) соответствует двум дням.
Как уже упоминалось, файл SMSP состоит из записей, то есть его структура - linear fixed. Длина одной записи - 44 байта (hex:2C). Согласно вышеописанной структуре, первая запись в нашем случае будет выглядеть следующим образом -
4B 56 53 4D 53 30 31 FF FF FF FF FF FF FF - alpha-identifier
E1 - Parameter indicators
FF FF FF FF FF FF FF FF FF FF FF FF - TP-Destination Address
07 91 83 50 10 32 54 76 FF FF FF FF - TS-Service Centre Address
00 - TP-Protocol Identifier
00 - TP-Data Coding Scheme
A7 - TP-Validity Period
FF - RFU
FF - RFU
Теперь выполним команду Select для нашего файла -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
A4
|
00
|
00
|
02
|
|
6F 42
|
|
Ответ должен быть 9F XX.
Обновляем содержимое -
|
Cla
|
Ins
|
P1
|
P2
|
P3/Lc
|
Le
|
Data In
|
|
A0
|
DC
|
01
|
04
|
2C
|
|
4B 56 53 4D 53 30 31 FF FF FF FF FF FF FF E1 FF FF FF FF FF FF FF FF FF FF FF FF 07 91 83 50 10 32 54 76 FF FF FF FF 00 00 A7 FF FF
|
|
И как всегда должны получить ответ карты - 90 00.
На данном этапе инициализация SIM -карты завершена. Вставив карточку в телефон и включив писание, должны увидеть приглашение ввода пин-кода. Введите "1111" (вспомните шаг 2). Телефон должен начать поиск сети и, при условии заполнения реальными значениями соответствующих файлов, должен подключиться. Попробуйте сделать звонок ;-).