Привет, Хабр. Разбираясь с Arduino, мне захотелось реализовать какую-то практическую задачу. Наиболее интересным мне показалось поработать с SIM-картой. Результатом моей работы и стала данная статья, где я опишу ручной способ получения доступа к информации, содержащейся в тестовом SMS сообщении на SIM-карте, средствами программируемой платы Arduino.
Результаты исследования и их анализ
Начну с теории. SIM-карта – это контактная смарт-карта с собственным процессором, способная регистрироваться в мобильной сети. SIM-карта имеет постоянную (энергонезависимую) и оперативную память. Также есть модуль аппаратного шифрования и аппаратный генератор случайных чисел. Процессор SIM-карты работает на частоте до 10 МГц. Постоянная память делится на области: примерно 60% занимают данные оператора, 20% – операционная система, остальное – данные пользователя.
С помощью SIM-карты обеспечивается идентификация абонентского устройства, ее доступ к сети связи, а также защита от несанкционированного использования абонентского номера. Идентификация SIM-карты осуществляется с использованием международного идентификационного номера IMSI, однозначно соответствующего пользовательскому (абонентскому) номеру. Международный идентификатор IMSI, наряду с серийным номером телефонного аппарата IMEI, задействуется в идентификации пользователя коммутационным оборудованием сети при установлении и поддержании соединения.
Следует отметить, что перед проведением исследования необходимо изучить стандарт ISO-7816, который закрепляет основные положения протокола обмена данными с SIM-картой, а также ряд особенностей, связанных с непосредственной работой SIM-карты.
Кроме того, для верного извлечения и изучения информации с SIM-карты нужно знать:
1. Устройство SIM-карты.
2. Значение контактов SIM-карты.
3. Команды, с помощью которых происходит общение SIM-карты с мобильным устройством.
4. Файловую систему SIM-карты.
Подготовим аппаратную часть, подключив SIM-карту к Arduino. Для этого определим, какие выводы имеет SIM-карта (см.рис.1).

При установлении подключения между платой Arduino и SIM-картой используются следующие контакты:
1 – неиспользуемый контакт.
2 – I/O – линия последовательного интерфейса ввода/вывода.
3 – VPP – контакт программирования, который используется при записи служебной информации.
4 – GND – «земля».
6 – CLK – синхросигнал (тактирование).
7 – Reset – контакт сброса.
8 – VCC — питание.
Установление подключения происходит посредством пайки к указанным в стандарте контактам и соединением с выводами платы Arduino по следующей схеме:


Так как SIM-карта является разновидностью Smart-карт, вся технология обмена сообщениями будет полностью основываться на стандарте ISO–7816. Обмен данными производится с использованием USART интерфейса со следующими параметрами: скорость передачи = 9600 Бод, частота = 3,5МГц.
Для начала работы с SIM-картой ее требуется «активировать»: необходимо подать на RST низкий уровень, на VCC подать питание и начать «щелкать» синхросигналом CLK с заданной частотой. Через 4000 циклов перехода синхросигнала CLK подать на RST высокий уровень.

После «активации» SIM-карты нужно выставить RST на низкий уровень, затем SIM-карта отправит ATR (Answer–to–Reset) – ответ с информацией о частоте синхронизации, списком поддерживаемых протоколов передачи и т.д.
Первый байт ATR говорит о том, какая кодировка применяется SIM-картой (прямая или инверсная). При прямом кодировании первый байт равен 0x3B, при инверсном – 0x3F. Инверсное кодирование означает, что бит 1 в сообщении кодирует логический бит 0 и наоборот.
Когда получен ATR, можно продолжить «общение» с SIM-картой, основываясь на подобранной кодировке. Взаимодействие можно вести при помощи встроенного терминала в «Arduino IDE», с помощью которого происходит программирование платы «Arduino UNO».
Общение с SIM-картой осуществляется с помощью передаваемых команд в специальном формате. Команды состоят из заголовка (4 байта) и тела команды. Пример команд и их соответствующий код можно посмотреть в таблице, которая представлена ниже.
Команда | Код инструкции | Параметр инструкции 1 | Параметр инструкции 2 | Количество байт в данных, передаваемых командой |
SELECT | A4 | 00 | 00 | 02 |
STATUS | F2 | 00 | 00 | длина |
READ RECORD | B2 | номер записи | режим | длина |
UPDATE RECORD | DC | номер записи | режим | длина |
Примеры команд и их кодов в шестнадцатеричном виде
Память SIM- карты состоит из файлов-каталогов и элементарных файлов. В структуре файловой системы имеются:
- корневой файл-каталог – «Master File» («MF»);
- выделенные файлы-каталоги «Dedicated File» («DF»);
- элементарные файлы (записи) «Elementary File» («EF»).
Выделенный файл («DF») – это функциональная группа файлов, состоящая из него самого и всех тех файлов, которые он в себя включает (то есть он состоит из «DF» и его полного «поддерева»). Такой файл состоит только из заголовочной части. Заголовок файла содержит информацию о структуре и атрибутах файла.
Все элементарные файлы состоят из заголовка и части данных файла.
Элементарные файлы различаются по своей структуре. В стандарте «GSM» используются следующие три структуры элементарных файлов:
1. Прозрачный «EF» – имеет структуру заголовка, в котором содержится смещение начала данных файла и общая длина этих данных, а сами данные представляют собой последовательность байт.
2. Линейный фиксированный «EF» – имеет структуру последовательности записей одинаковой (фиксированной) длины. Первой записью является запись номер 1. Длина записи, а также это значение, умноженное на количество записей, указывается в заголовке файла.
3. Циклический «EF» – используется для записей, хранящихся в хронологическом порядке. Когда все пространство записи занято, новые сохраненные данные будут перезаписывать самую старую информацию.
У каждого файл есть имя – это его идентификатор. Он используется для адресации и идентификации каждого конкретного файла. Такой идентификатор состоит из двух байтов и закодирован в шестнадцатеричной системе счисления.
Первый байт идентификатора указывает на тип файла:
- «3F»: мастер-файл;
- «7F»: выделенный файл;
- «2F»: элементарный файл в основном мастер-файле;
- «6F»: элементарный файл в выделенном файле.
В качестве эксперимента в ходе написания статьи был получен текст первого SMS–сообщения, которое содержится на SIM-карте. Для этого, сначала, был отправлен заголовок команды «Select» – A0 A4 00 00 02. После чего необходимо было дождаться ответа от SIM-карты (3 байта). После получения ответа было отправлено тело команды – 7F 10 (7F – id файла, 10 – тело файла (каталога) «MF»), далее была отправлена команда A0 A4 00 00 02, 6F 3C – таким образом был совершён переход из корневого каталога в каталог «EF sms». После проведения подготовительных действий по переходу в каталог была отправлена команда «READ RECORD»: A0 B2 01 04 B0.
После получения команды по считыванию указанной записи, SIM-карта отправляет ответ в виде кодированных данных (рис. 5).

Ответ в виде кодированных данных о первом SMS-сообщении выглядит следующим образом (часть байт скрыта заменой на XX):
«B2 07 07 91 97 61 55 X3 XX FX 11 FF 09 81 97 71 29 X8 XX FX 00 08 FF 0C 04 1F 04 40 04 38 04 32 04 35 04 42 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 90 00».
В представленных данных, отправленных SIM-картой, можно выделить следующие области:
B2 07 – идентификатор начала сообщения;
97 61 55 X3 XX FX – номер получателя 7 916 553 XX XX (младший байт – старший);
97 71 29 X8 XX FX – номер отправителя 7 917 928 XX XX;
08 – кодировка (08 – кириллица);
0C – длина сообщения (12 байт);
04 1F 04 40 04 38 04 32 04 35 04 42 – содержимое сообщения: «Привет».
Вот так и прочитали первую смс с SIM-карты. Осталось только проверить на телефоне, что первая смс в SIM-карте именно такая. Так и оказалось, а, значит, эксперимент можно считать успешным.
В ходе исследования мы успешно проверили как работает «общение» между аппаратной платой Arduino и SIM-картой. Теперь, имея готовый вариант устройства для взаимодействия с SIM-картой, можно выяснять, а что еще интересного можно получить с SIM-карты. Оставлю себе надел на будущее.