В процессе изучения через мой ридер прошло очень много билетов. Какие-то я,
закатав рукава, доставал «из помойки», какие-то покупал — смотрел, что на них
записано, затем проходил и смотрел еще раз. Это были билеты почти всех типов, за
исключением, пожалуй, проездного «Ультралайта» на 70 поездок. Через пару недель
у меня накопилась большая и отсортированная база дампов разных билетов и в
разных состояниях. Были и дампы, снятые с одного и того же билета после каждой
поездки, и несколько билетов с метрополитеновскими номерами, идущими подряд. В
мою коллекцию попало даже несколько дампов двух разных временных единых
социальных билетов (один был выдан сроком на 5 дней, другой на 30), снятых через
некоторый временной интервал. Это оказались очень интересные экземпляры, и при
этом очень редкие (мне они доставались из первых рук с немедленным возвратом,
только на «прочитать»). По сути, это почти единственный тип «Ультралайтов»,
который работает не только в метро, но и на наземном транспорте. К тому же,
только у этого типа билетов вообще нет ограничения на количество поездок.
Впоследствии, именно они сослужили мне большую службу…
Весь этот зоопарк я собирал с одной целью — четко определить структуру и
формат записи данных на билете. Конечно, какие-то поля были видны сразу,
невооруженным глазом, но некоторые нет. Например, я не сразу понял, где записан
номер билета метро (тот самый, который на нем напечатан). Осознание пришло
совершенно случайно. Дело в том, что я (как и, думаю, большинство из нас),
смотря в хекс, привык выравнивать для себя информацию по байтам и мыслить,
минимум, байтами. Выяснилось, что здесь этот подход неверен. Глядя на дамп
билета, нужно мыслить более мелкими единицами — тетрадами, а иногда и битами.
Понял я это тогда, когда «узрел» наконец номер билета, — он оказался сдвинут на
4 бита относительно начала байта, а оставшиеся 4 бита с той и с другой стороны
номера занимала прочая служебная информация.
Через некоторое время формат записи данных на билеты стал почти полностью
понятен. Стало очевидно, где и как хранятся все даты, счетчики, идентификаторы.
Оставалась лишь пара полей, назначение которых было неясно просто потому, что от
дампа к дампу данные в них были одинаковы.
Но на этом вся радость и закончилась — глупо было бы предполагать, что такие
билеты могут оставить незащищенными. В каждом дампе было 32 бита различной
информации, никак не коррелировавшей с остальным содержимым. Я предположил, что
это своего рода контрольная сумма, «хэш» данных, написанных на билете. Все
попытки прикинуть или рассчитать эти 32 бита обернулись полным провалом (в
частности, было предположение, что это какой-то вид CRC32, с нестандартным
полиномом и стартовым значением). При попытке изменить хотя бы полтора бита
информации внутри билета терминал проверки в метро высвечивал «ПЛОХОЙ БИЛЕТ»,
увесистым домкратом заколачивая последние гвозди в крышку гроба. Конечно, были
попытки обойти систему и другими способами, например, попытаться скопировать
билет на чистую карту один-в-один (тут, увы, помешал заводской серийник,
который, как выяснилось, тоже участвовал в генерации «хэша») или выставить биты
блокировок так, чтобы запретить турникету изменять содержимое билета.
Проверочный терминал такой «вечный» билетик признавал, но турникет пускать
отказывался... Таким образом, я уперся в стену. В ту большую, крепкую бетонную
стену, об которую многие имеют привычку убиваться с разбега. Не найдя никакой
информации на форумах и досках, я решил, что на этом мои исследования закончены
— путей больше нет, и поставил жирную точку. Как выяснилось, зря... |