Сектор – 3 блока по 16 байт.
Блок – шестнадцатеричная последовательность из 32 символов. Следовательно, два символа - один байт.
"Подорожник" – транспортная карта на базе MiFare Classic 1K
Данные о балансе.
Баланс – первые 4 байта
Дубликат нулевого блока для валидации баланса
Дата последнего пополнения – байты 2, 3 и 4
Зачислено боливар – байты 8, 9 и 10
Данные о поездках.
Дата последней поездки – первые три байта
Стоимость поездки – байты 6 и 7
Количество поездок в метро – нулевой байт
Количество поездок на наземке – первый байт
Value-блоками являются только 0 и 1 в четвертом секторе. Их структура такова:
byte 0..3: 32 bit value in little endian
byte 4..7: copy of byte 0..3, with inverted bits
byte 8..11: copy of byte 0..3
byte 12: index of backup block (can be any value)
byte 13: copy of byte 12 with inverted bits
byte 14: copy of byte 12
byte 15: copy of byte 13
Я знаю, зачем вы пришли. Алгоритмы чтения и перезаписи приложены к этому гисту.
В качестве входных данных используется четвертый сектор "Подорожника".
После декодирования информации выводится следующее:
Balance: 831
Latest top up: 2019-09-28 13:58:00
Aquired: 1000
Соответственно: баланс, последнее пополнение, и на сколько была пополнена карта. Аналогично можно вывести и всё остальное.
После этого происходит демонстрация модификации:
Balance: 1331
Latest top up: 2019-10-01 00:00:00
Aquired: 500
Для модификации Value-блоков тут сделан удобный метод. По поводу модификции "обычных" блоков информации не было найдено, поэтому его модификация здесь сделана "кустарно".
Ну, и, в конечном счете, показывается модифицированный сектор, который можно записать с помощью MCT:
New sector 4 data:
EC07020013F8FDFFEC07020000FF00FF
EC07020013F8FDFFEC07020000FF00FF
FC0000394E017E0850C30001383CE3EB
И да, если вы вдруг здесь оказались и читаете это: Я не несу никакой ответственности за ваши действия.