Тем, кто только начинает экспериментировать с этими карточками, настоятельно рекомендую прочитать имеющийся на этом сайте мануал по Т192.

Возможно, мои исследования могут быть кому-то полезны, даже если карта не Т192.

Итак,начнём.

1.Выбор микроконтроллеров

С точки зрения схемотехники эмуляторов Т192,на мой взгляд, наиболее оптимальным является использование микроконтроллера со встроенным тактовым генератором. Я проводил эксперименты с контроллером ATTiny 22L. Для построения эмулятора на этом контролере не нужно никаких навесных компонентов. PDF файл с описанием контроллера можно найти на www.gaw.ru. Для программирования контроллера подойдёт программатор FBPRG16 ,более-менее распространённый в сети. Хотя у FBPRG и нет такого контроллера в списке поддерживаемых устройств, TINY 22L программируется в режиме AT90S2313. Подключать вывод XTAL не нужно.

Ещё одно важное, на мой взгляд,замечание. Если хочется сделать эмулятор без внешнего питания (с питанием от таксофона), то нужен контроллер с малым временем запуска (не более 40-50 мкс). У контроллеров с кварцевым генератором это время составляет 40 мс (АТ90 S2313),если бит FSTRT незапрограммирован. Конечно, это очень большое время. карта, как потом выясним, может быть считана за 1 мс! или даже быстрее.

Так уж сложилось, что изначально прошивка таксофона не предусматривала каких-либо специальных проверок подлинности карты. В этом случае подойдёт программа block2.asm. Программа зашивается в TINY и всё!!! Естественно, Вам нужно будет поменять 4й байт в прошивке на код Вашего региона. Списки с кодами городов есть в описании Т192, но если Вы сомневаетесь, можете прочитать телефонную карту Вашего "телекома". 4-й байт определяет код региона. также можно поменять серийник эмулятора на тот, что имеется в реальной карте. Эмулятор с программой BLOCK2 имеет выход типа "открытый коллектор", поэтому не пытайтесь использовать контроллер, припаянный к чипу пустой телефонной карты. После сборки девайса можно проверить его на программе для чтения и модификации тел. карт Т192, которая выложена на этом сайте. Следует только иметь в виду, что в прошивке используется формат MSB first. Это не проблема, если поменять направление сдвига байт, можно писать в LSB формате.

Итак, это устройство будет работать, если на автомате нет никаких специальных схем защиты. Серийные номера можно легко менять,обеспечивая таким образом некоторую скрытность. НО предупреждаю сразу- как действует система отслеживания подобных звонков я не знаю, поэтому не могу дать гарантии на то, что смена серийников имеет какой-то толк.

Ещё один момент- в эмуляторе очень сложно предусмотреть все возможные сигналы, которые подаёт таксофон .(например - вычитание из большего счётчика, неподтверждение вычитания, запрос повтора счётчика и т.п.) Этот вариант эмулятора не поддерживает никаких "исключений". Но на самом деле это и не нужно. Автомат никогда не подаст таких сигналов. Поэтому нет никакого смысла тратить время на реализацию "правильного поведения" карты в таких случаях.

У нас этот вариант не действует уже около года, может больше. Если Вы проверяете, и у Вас работает - ваша тел. компания не снабдила автоматы защитой.

Защита от эмуляторов:

Впервые с защитой мне пришлось столкнуться в Нижнем Новгороде, где версия BLOCK2 не работала. Сейчас, конечно, там многое изменилось, но в 2001-2002 там стояли прямоугольные большие автоматы с цифрами на светодиодных индикаторах. Внешне это проявлятось так: вставляешь карту-эмулятор, автомат рисует прочерки --------... типа карта не годна. СУть защиты заключалась в следующем - автомат подаёт питание на карту и начинает её читать через время, намного меньше 40 мкс, которое необходимо TINY для запуска. Контроллер не успевает выйти на рабочий режим. Способ обойти эту защиту прост - достаточно включать эмулятор от внешней батарейки. Такой хитрый ход "конём" - и можно звонить хоть куда... Стоит отметить, что в тех автоматах была и ещё одна защита. Суть её в следующем: у карты Т192 один вывод не задействован. Но, судя по всему, он имеет ёмкость на общий провод или что-то в этом роде. Таксофон подаёт короткие импульсы и анализирует, подавлены они этой ёмкостью или нет. Если ёмкости нет - как в случае с эмулятором (этот вывод свободен) таксофон отказывается брать карту. Узнать про наличие такой защиты легко- достаточно маленьким кусочком скотча аккуратно заклеить "неиспользуемый" контакт на хорошей карточке. И позвонить с неё. Если таксофон откажется соединять или брать карту - оторвите скотч.

Обходится эта система очень просто - нужно в эмуляторе замкнуть на землю неиспользуемый в Т192 контакт. И всё!!!

Затем, с течением времени, эти автоматы стали исчезать, им на замену пришли металлические синие автоматы, которые по-русски пишут "вставьте карту наберите номер". В Нижнем Новгороде они были сразу с новой защитой, о которой я расскажу ниже. А в нашем городе эти автоматы обрели защиту позже. Но, как выяснилось, такую-же.

Итак, защита по времени включения и по незадействованному контакту оказалась недостаточной. Новая схема защиты не использовала эти приёмы.

Защита вторая. Её проявление:

Когда вставляешь эмулятор - таксофон пишет число единиц. Всё вроде ОК. Но стоит только позвонить - после вычитания таксофон обрывает связь. У нас он при этом пишет " таксофон временно занят". А в Нижнем просто рвёт связь. При этом вычитание единиц производится правильно. Вроде бы, такая политика проявления защиты сделана для того, чтобы сбить с толку фрикера. НО! Это не про нас!!!. на самом деле таксофон уже после засовывания в него эмулятора точно "может знать" настоящая это карта или нет. Ряд экспериментов показал суть этой защиты, а также позволил выработать принципиально новую концепцию эмуляции карты. Вот в чём идея. В начале любой карты Т192 идёт 3 байта (MSB first) 0x85,0x31,0x09. Видимо, в этой области данных, или в области серийника таксофон может ИЗМЕРЯТЬ время, прошедшее с момента спада сигнала на линии CLK до изменения состояния линии i/o. Дело в том, что карта- устройство аппаратное, а эмулятор на контроллере- программный. таким образом, карта оказывается быстрее, чем TINY на 1 МГц (это частота встроенного RC генератора). Автомат видит подмену и рвёт связь. Что же делать? Выход оказался очень оригинальным. А что, если область с серийником будет выдавать тел.карта НАСТОЯЩАЯ!!, а счётчики с кол-вом единиц- контроллер. Так строится ГИБРИДНЫЙ эмулятор. В нём контроллер подсоединяется параллельно карте. И при работе всё это выглядит следующим образом: В начале подаётся сигнал сброса на карту. Этот же сигнал воспринимает контроллер. При этом он держит линию i/o в высокоимпедансном состоянии. работает сама карточка. Как только телефон доходит до области счётчиков, КОНТРОЛЛЕР переводит линию i/o из высокоимпедансного состояния в режим ВЫХОДА. И начинает выдавать кол-во единиц. "Пересилить" карту удаётся с помощью 1 вывода без проблем. Стоит только иметь в виду, что в этом случае на некоторых старых моделях телефонов уровня лог. 1 всё равно не хватает. тогда читаются не счётчики из контроллера, а НАСТОЯЩАЯ карта. При этом автомат покажет актив этой карты - 0. Если это происходит, можно использовать несколько выводов параллельно, или подключить специальный, разработанный мною ключ-усилитель. Он усиливает лог. 1 из контроллера и не влияет на сигналы, идущие с таксофона. При запараллеливани ног придётся изменить программу. При использовании ключа это не требуется. При таком подходе автомат не видит подмены!!!

Мы опять победили!!!

Здесь есть ещё кое-что, что я не упомянул выше. первая версия программы для TINY BLOCK3s работала по следующему принципу: после сигнала сброса карта отсчитывала число бит, отведённых до счётчиков, а потом контроллер включался в работу. Этот вариант прекрасно работал, но появилась ещё одна концепция. А что, если не отлавливать сигнал сброса, а синхронизировать работу контроллера по сигналам с телефонной карты?!? При этом, если таксофон начинает "читать без достаточной задержки" (как в первой защите) карта будет выдавать свой серийный номер, в это время мы инициализируемся, загружаем счётчики, готовимся... делаем чо нам угодно... а как только придёт время выдавать счётчики, сразу включаемся в работу? А! так вот!!!

Протокол карты , видимо, специально был разработан для такого подхода.!. Дело в том, что карточка выдаёт данные по заднему фронту на линии CLK. А после зоны "скрытых счётчиков" FF FF FF FF FF FF по переднему фронту выдаётся 0 !!!!! Сие обстоятельство и используется для включения контроллера. Нужно отловить изменение сигнала из 1 в 0 по переднему фронту! И всё!!! В этом варианте контроллер может включаться с запаздыванием относительно тел. карты. Программа BLOCK4s работает именно по такому принципу.

Есть , правда, в этом варианте защиты ещё один неприятный момент. Для того, чтобы значения счётчиков успешно записались в ЕЕПРОМ, нужно неск. миллисекунд. Когда телефон делает вычитание в 0, он почему-то не даёт времени на перезапись счётчиков (понятия не имею, как это сделано). Может, я и ошибаюсь, но в эмуляторе после такой операции обычно оказывается некорректное значение счётчиков. Оно может превышать максимально допустимое число единиц для Вашего региона. Есть 2 способа избежать это:

1) сделать восстановление счётчиков когда вычтание не нулевое. Я не пробовал, но должно работать.

2) Сделать специальную программу с коррекцией числа единиц на карте. т.е. при загрузке счётчиков программным путём проверяется значение счётчиков, вычисляется рабочий(меньший) счётчик, если его число единиц находится вне допустимых границ, то устанавливаем его в максимальное значение. Этот вариант реализован в программе BLOCK5s. Правда, при последнем вычитании в 0 счётчики портятся, а время чтения карты недостаточно, чтобы их восстановить. Используйте внешние 3-5В на пару секунд - и карта вновь готова к работе!!!

Кратко обобщу подход:
Серийник выдаёт карта, а число единиц - контроллер.
При этом не недо знать ни код региона, ни т.п.
нужно просто подпаять контроллер параллельно карте и использовать усилитель-ключ, если это необходимо.
Для смены серийника (например,чтобы работать в другом городе) не надо программатора!!! нужно всего лишь сменить карту-пустышку.
Защита на скорость включения становится неэффективной.
Защита по ёмкости незадействованного контакта также бесполезна, поскольку в эмуле работает НАСТОЯЩАЯ карточка (хоть и пустая).
Возможно, этот подход можно применить и к другим стандартам. У нас в городе пока только Т192, поэтому нет шансов попробовать.

Всё было-бы просто здорово, если бы не инженеры Волга-Телеком.

Защита номер 3.

Вставляешь карту с программой BLOCK5s, автомат читает число единиц некорректно. Причём каждый раз по-разному. Вычитание невозможно, поскольку при каждом чтении число единиц меняется. Таксофон рвёт связь.

Вот это уже гораздо хуже......... Анализ этой фигни показывает, что контроллер телефона читает карту быстрее, чем может работать TINY22L. Дело очень плохо. Для того , чтобы разобраться с этой защитой , потребовалось создать измеритель скорости карты и сканер трафика, идущего от телефона к карте.

Измеритель скорости и сканер я опишу в другой статье.
А сейчас расскажу про процесс взлома.
Взяв реальную карту, я измерил её скорость - время, проходящее с момента спада CLK и обновления данных на i/o. Поразительно!!! время оказалось порядка 2,1 мкс!!! Причём оно одинаково для счётчиков и серийника.
Проведя аналогичные измерения с эмулятором версии BLOCK5s выяснилось, что он проигрывает в скорости карте примерно в 7-8 раз. Так автомат отличает подделку! Что же, берём контроллер АТ90S2313, ставим кварц на 10 МГц. И, конечно,внешнее питание. Надо же как-то пробовать? Зашиваем в 2313 BLOCK2, переставив только ноги. Идём к автомату, включаем,вставляем-не работает. То есть автомат правильно считывает число единиц на карте. Но при вычитании сразу рвёт связь и грозно пишет "таксофон временно занят". Хотя единицы вычитает корректно. Как же так? Неужели есть ещё какая-то возможность провести проверку? Оказалось, что всё намного проще. Когда я подцепил сканер параллельно настоящей карточке с единицами и отснял сигналы, которые передаёт телефон, то выяснилось, что на самом деле протокол вычитания не изменили. Но автомат точно отличал подделку, хотя в ней всё было как у настоящей карты. Разгадка появилась сама собой. Когда я подключил реальный чип с единицами, а питание на него подал внешнее - таксофон оборвал связь.С РЕАЛЬНОЙ КАРТОЙ!!!! Вот как! А если чип питается от телефона - связь не обрывается. Это, конечно,наводит на кое-какие мысли... Можно предполагать:

1) карта при записи новых значений потребляет больший ток, автомат отлавливает наличие скачка тока.

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

2) таксофон производит манипуляции с линией питания. Дело в том, что после подачи питания на карту она выдаёт 1 до того , как на неё поступит сигнал сброса.
НО! таксофон (поскольку алгоритм вычитания стандартный) не может снять питание карты до подтверждения записи. А уж после... пожалуйста! Здесь, при просмотре записи сигналов с таксофона был замечен интересный момент. После подтверждения карта снова выдаёт новое значение счётчика. Максимально возможное значение - 1000ед.(новая карта) Для записи числа 1000 в двоичной системе достаточно 10 разрядов. А таксофон читает 16 разрядов!!!!!
ВОт так!! Это неспроста. телефон после прочтения 10 полезных разрядов снимает питание с карты. А потом вновь подаёт его и читает дальше. только вот читаться будут не 0 а 1, т.к. карта не сброшена!!!! При использовании внешнего питания(а как иначе, ведь 2313 требует 40 мс для запуска) эту ситуацию не удаётся контролировать. И эмуль вместо единиц выдаёт НУЛИ!! Так таксофон и отличает подделку .
Как обойти? Первое, что может придти в голову - контролировать состояние линии питания программно. Мысль хорошая, но это слишком усложняет программу и требует модификации прошивки.
Я использовал внешнее прерывание. Оно конфигурируется по спаду уровня. И эта ножка с внешним прерыванием подключается к питанию,идущему от телефона. Сам же контроллер питается от батареек. При этом, когда телефон вдруг задумает снять питание, тут же возникает прерывание, обработчик которого просто производит переход в режим ожидания RESET и карта выдаёт единички. Реально! Это работает!!! При этом не требуется значительных переделок программы и карта корректно отреагирует на снятие питания из любой точки кода!!! Это реализовано в программе BLOCK6.
Вот так вот. Волга - Телеком FOREVER!!!!

В заключение хочется сказать пару слов о защитах. Все защиты,основанные на скорости и т.п. манипуляциях БЕСПОЛЕЗНЫ, т.к существуют контроллеры, способные работать на гораздо более высоких скоростях, чем реальные карты. Защиты, основанные на металлодетекторах(детекторах проводов), на измерении аналоговых электрических величин (сопротивление между контактами, ток потребленияи т.п.) мне не попадались. Я ни разу не видел таксофона с активной авторизацией (и на Т192 в том числе).

Наиболее эффективный способ защиты - активная авторизация. Но , видимо, при разработке этих систем это не было изначально заложено. Также я слышал (не знаю, насколько это правда), что в Москве МГТС использует таксоф. карты имеющие защиту несимметричным диверсификационным ключом. Видимо, это тоже весьма эффективно.

СКАНЕР на микроконтроллере 2313.

Чтобы эффективно противодействовать различным схемам защиты, это устройство будет очень полезным. Идея заключается в следующем: на выводы 0 и 1 порта B вводятся сигналы CLK и RST с телефонной карты. К порту D выв.0 подключён выключатель. Также имеется светодиод для индикации режима работы. Чтобы отснять трафик при вычитании, сканер подпаивается параллельно рабочей карточке с единицами(земля,CLK,RST). Дело в том, что карта управляется именно по этим двум линиям. Если обнаружится при расшифровке записи нестандартные манипуляции, то их можно повторить в домашних условиях, анализируя поведение линии i/o карты. Но мне не попадалось ни разу таких автоматов. Использование сканера может быть полезно при исследовании ещё не описанного чипа, если, конечно, он управляется по 2м линиям.

Принцип работы сканера заключается в следующем: При перемене состояния 0 и 1 вывода порта В , у нас происходит фиксация нового состояния. Это понятно при анализе программы SCANER.ASM. Затем все манипуляции записываются в ЕЕПРОМ,но в особой форме, которую легко расшифровать. Писать в прямой форме неудобно из-за того, что объём ЕЕПРОМ равен всего 128 байт. Гораздо выгоднее использовать " сжатие" данных, когда пишется в еепром не каждый байт, а только число его повторений.

Использовать сканер нужно следующим образом:

1) Вставить в таксофон.
2) Подключить питание контроллеру
3) Снять трубку таксофона. При этом он прочитает карту. Весь процесс чтения будет зафиксирован в ОЗУ контроллера.
4) набрать номер, нажать "ответ". Если всё нормально, таксофон вычтет единички и не разорвёт связь.
5) можно повесить трубку таксофона. Переключить выключатель на порте D. После записи значений из ОЗУ в ЕЕПРОМ загорится лампочка.
6) Нажать кнопку RESET и отключить питание с контроллера. Достать сканер из таксофона. RESET использовать желательно, чтобы не повредить содержимого ЕЕПРОМ.
7) Принести контроллер домой и считать содержимое ЕЕПРОМ программатором.

Рассмотрим анализ на примере лога нашего таксофона с последней версией защиты. (файл PHONE.HEX)

       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
      -----------------------------------------------  ----------------
 0000:00 ee 88 0b ee 74 00 ee 88 14 ee b4 00 ee 88 00  .юИ.юt.юИ.ю¦.юИ.
 0010:ee 48 6f ee 8b 00 ee 88 00 ee 48 5e ee 87 00 ee  юHoюЛ.юИ.юH^юЗ.ю
 0020:88 00 ee 74 ce ff ff ff ff ff ff ff ff ff ff ff  И.юt+___________
 0030:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ________________
 0040:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ________________
 0050:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ________________
 0060:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ________________
 0070:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ________________

ЕЕПРОМ прочитан программатором FBPRG16.
читаем с конца.
- СЕ. Признак начала данных. (FF-когда ячейка была стёрта и в неё ничего не записано).
- 00 ее 74.
Распишем число 74 в двоичной системе.
 0х74=01110100
Здесь лежит ключ к разгадке тайны...
Запись в этот байт производится следующим образом:
  а)ждём изменения состояния сигналов CLK и RST.
  б)сдвигаем все биты влево 2 раза.
  в)выполняем установку двух младших бит -CLK и RST

Таким образом - (слева напрво)
01 - поднятие RST при низком CLK 
11 - поднятие CLK при высоком RST
01 - опускание CLK при высоком RST
00 - опускание RST.
Фактически, таксофон произвёл поднятие и опускание CLK при высоком
RST . Это стандартная процедура сброса.
(смотри описание карты Т192 автор- Ruslan V.Pisarev )

далее идёт 0хЕЕ. Этот байт для визуальной ориентировки.
справа от ЕЕ код изменения состояния линий
слева - число повторений предыдущих изменений.

0х00 - предыдущее состояние (сигнал) повторялся 0 раз.
(предыдущего ещё пока просто нет!)

Итак, автомат подал сигнал сброса.

смотрим далее...

00 ее 88.

аналогично расписываем в двоичном коде число 88.

0х88 = 10001000.

10 - поднятие CLK при низком RESET
00 - опускание CLK.............
10 - опять поднятие CLK
00 - опускание CLk. 

Автомат читает карту.

ЕЕ - для визуальной ориентировки

00 - сигнал , записанный перед этим ( напомню, было 00 ее 74)
то бишь 74 повторился 0 раз, - стандартная процедура сброса не
повторялась.

Едем дальше.

5e ee 87

Распишем 87 в бинарный код...
0х87 =10000111

10 - поднятие CLK
00 - опускание CLK
01 - поднятие RESET
11 - поднятие CLK при высоком RESET

Это есть не что иное, как начало процедуры сброса.

ее - для ориентировки

5е - сигнал, записанный перед этим (0х88) повторился 5е раз!!!
0х5е = 94(decimal)

В течении 0х88 происходит чтение 2х бит карты.(это очевидно)
значит,таксофон прочитал 94*2 + 2 бит с карты =190 бит. 
+1 бит в 87 (тоже восьмёрка) + первый бит выставляется сразу
после сброса. Итого - 94*2 +2 +1 +1 =192 бита т.е. вся карточка!!!

Дальше по порядку...
00 ee 48

0х48 =01001000

01 - опускание CLK при высоком RESET
00 - опускание RESET
10 - поднятие CLK
00 - опускание CLK 

Завершение сброса и начало чтения.

Отмечу сразу, что сигналы выглядят достаточно похоже.
0х74 в начале - сброс
а 0х74 здесь просто разделилась на 2 группы.
0х87 и 0х48

и так далее... по аналогии.

скажу сразу, лог был записан-чтение карты(когда её только вставил в телефон),модификация карты. здесь всё представлено вместе, но это легко отделить по сигналам сброса.

Ещё важный момент - сканер фиксирует сигнатуру в памяти только когда приходит другая, отличная от предыдущей. Тогда для гарантии записи можно пару раз дёрнуть за рычаг сброса автомата, чтобы он выдал процедуру сброса и чтения на карту.

Как только таксофон произведёт все операции с картой, нужно замкнуть выключатель, и всё содержимое памяти ОЗУ окажется в ЕЕПРОМ. Такой способ записи трафика достаточно экономичен с точки зрения использования памяти. При необходимости вести мониторинг большего числа линий, чем две, можно записывать по 2 байта, немного доработав программу. Вести мониторинг состояния линии i/o таким способом нельзя, поскольку при этом будет мало повторяющихся участков сигнатур и память моментально "забьётся".

2004 (C) by Dima AG.