Транспортная карта «тройка». как работает? можно обмануть?

Examples

Dump NROM-cartridge using dumper on port «COM14» to file «game.nes». PRG and CHR sizes are default.


Dump MMC1-cartridge (iNES mapper #1) using dumper with serial number (Windows only) «A9Z1A0WD». PRG size is 128 kilobytes, CHR size is 128 kilobytes too.

Dump 32K of PRG and 8K of CHR as simple NROM cartridge but execute C# script first:

Dump 32MBytes of COOLBOY cartridge using C# script and save it as UNIF file with some extra info:

Read battery-backed save from MMC1 cartridge:

Write battery-backed save back to MMC1 cartridge:

Rewrite ultracheap chinese COOLBOY cartridge using GPIO pins on /OE-/WE and play sound when it’s done:

You need to unsolder pins /OE and /WE and connect them to TCK and TDO pins on JTAG connector.

Same for new COOLBOY where /OE and /WE are connected to mapper, soldering not required:

Also you can rewrite COOLGIRL cartridges:

Mapper script files


Mapper files are stored in «mappers» subdirectory. When you specify a mapper number or name, the application compiles the scripts in that directory to find a matching one.

Mapper scripts are written in C# language. Each script must contain namespace (any name allowed) with class (also any name) that impliments IMapper interface.

    public interface IMapper
    {
        /// <summary>
        /// Name of the mapper
        /// </summary>
        string Name { get; }

        /// <summary>
        /// Number of the mapper to spore in the iNES header (-1 if none)
        /// </summary>
        int Number { get; }

        /// <summary>
        /// Name of the mapper to store in UNIF container (null if none)
        /// </summary>
        string UnifName { get; }

        /// <summary>
        /// Default PRG size to dump (in bytes)
        /// </summary>
        int DefaultPrgSize { get; }

        /// <summary>
        /// Default CHR size to dump (in bytes)
        /// </summary>
        int DefaultChrSize { get; }

        /// <summary>
        /// This method will be called to dump PRG
        /// </summary>
        /// <param name="dumper">FamicomDumperConnection object to access cartridge</param>
        /// <param name="data">This list must be filled with dumped PRG data</param>
        /// <param name="size">Size of PRG to dump requested by user (in bytes)</param>
        void DumpPrg(IFamicomDumperConnection dumper, List<byte> data, int size = );

        /// <summary>
        /// This method will be called to dump CHR
        /// </summary>
        /// <param name="dumper">FamicomDumperConnection object to access cartridge</param>
        /// <param name="data">This list must be filled with dumped CHR data</param>
        /// <param name="size">Size of CHR to dump requested by user (in bytes)</param>
        void DumpChr(IFamicomDumperConnection dumper, List<byte> data, int size = );

        /// <summary>
        /// This method will be called to enable PRG RAM
        /// </summary>
        /// <param name="dumper"></param>
        void EnablePrgRam(IFamicomDumperConnection dumper);
    }

FamicomDumperConnection implements IFamicomDumperConnection interface:

    public interface IFamicomDumperConnection
    {
        /// <summary>
        /// Simulate reset (M2 goes to Z-state for a second)
        /// </summary>
        void Reset();

        /// <summary>
        /// Read data from CPU (PRG) bus
        /// </summary>
        /// <param name="address">Address to read from</param>
        /// <param name="length">Number of bytes to read</param>
        /// <returns></returns>
        byte[] ReadCpu(ushort address, int length);

        /// <summary>
        /// Read data from PPU (CHR) bus
        /// </summary>
        /// <param name="address">Address to read from</param>
        /// <param name="length">Number of bytes to read</param>
        /// <returns></returns>
        byte[] ReadPpu(ushort address, int length);

        /// <summary>
        /// Write data to CPU (PRG) bus
        /// </summary>
        /// <param name="address">Address to write to</param>
        /// <param name="data">Data to write (single byte)</param>
        void WriteCpu(ushort address, byte data);

        /// <summary>
        /// Write data to CPU (PRG) bus
        /// </summary>
        /// <param name="address">Address to write to</param>
        /// <param name="data">Data to write, address will be incremented after each byte</param>
        void WriteCpu(ushort address, byte[] data);

        /// <summary>
        /// Write data to PPU (CHR) bus
        /// </summary>
        /// <param name="address">Address to write to</param>
        /// <param name="data">Data to write (single byte)</param>
        void WritePpu(ushort address, byte data);


        /// <summary>
        /// Write data to PPU (CHR) bus
        /// </summary>
        /// <param name="address">Address to write to</param>
        /// <param name="data">Data to write, address will be incremented after each byte</param>
        void WritePpu(ushort address, byte[] data);

        /// <summary>
        /// Get current mirroring
        /// </summary>
        /// <returns>bool array with CIRAM A10 values for each region: $0000-$07FF, $0800-$0FFF, $1000-$17FF and $1800-$1FFF</returns>
        bool[] GetMirroring();
    }

Check «mappers» directory for examples.

TroikaDumper / README.md

Users who have contributed to this file

Приложение TroikaDumper позволяет читать, сохранять и восстанавливать записанное состояние памяти карты Тройка. Для использования необходим телефон с **версией Android ≥ 4.4** и NFC чипом, **поддерживающим карты Mifare.** NFC чип должен быть произодства NXP [wikipedia.org/wiki/List_of_NFC-enabled_mobile_devices](https://en.wikipedia.org/wiki/List_of_NFC-enabled_mobile_devices) Чипы производства Broadcom и другие работать не будут.

Неполный список поддерживаемых телефонов supported_phones_list.txt

Запустите приложение и поднести карту Тройка. Должно отобразится состояние баланса, время последнего прохода и т. д. При считывании карты состояние памяти автоматически сохраняется и доступно в архиве (нижняя правая кнопка в виде папки)

Для записи дампа памяти на карту выберите нужный дамп из архива и нажмите кнопку запись. Кнопка записи находится левее кнопки архива.

Как избежать блокировки карты


Не оперируйте суммами баланса более 100 рублей

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

Хак для бесплатного пополнения карты «Тройка»

Как пишет в своем посте Игорь Шевцов, вся работа была проведена без использования специальных технических средств — ему понадобился только Android-смартфон с NFC-чипом. На поиск уязвимости у него ушло 15 дней. Для взлома системы Игорь Шевцов использовал мобильное приложение «Мой проездной», через которое он смог получить доступ к памяти карты и изучить структуру хранения данных.

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

Не оперируйте суммами баланса более 100 рублей. Никогда не проходите в метро два раза с одинаковым временем последнего прохода. После записи дампа обновите текущее время на карте используя валидатор в наземном транспорте. То есть, перед каждым проходом в метро нужно выполнить списание через желтый валидатор в автобусе или трамвае.

Как заявил разработчик, для исправления недочетов системы «необходимо усовершенствование формата хранения данных в памяти карты и обновление программного обеспечения всех систем, работающих с картой».

Other scripts

You can run custom C# scripts to interact with dumper and cartridge. It’s usefull for reverse engineering. Each script must contain namespace (any name allowed) with class (also any name) that contains void Run(IFamicomDumperConnection dumper) method. This method will be executed if —csfile option is specified. Also you can use NesFile and UnifFile containers.

You can run script alone like this:

Or execute it before main action like this:


So you can write your own code to interact with dumper object and read/write data from/to cartridge. This dumper object can be even on another PC (read below)! Check DemoScript.cs file for example script.

Чтение и запись данных с карты

TroikaDumper — это уникальное приложение для смартфонов на платформе Android, которое позволяет считывать содержимое транспортной карты Тройка и перезаписывать его с изменением данных. Следует отметить, что для корректной работы ваш смартфон должен иметь чип NFC производителя NXP с поддержкой карт Mifare. Полный список поддерживаемых устройств можно найти на сайте разработчика в репозитории GitHub.

Главной особенностью приложения является возможность внесения изменений на транспортной карте тройка. Поддерживается чтение полного дампа и редактирование конкретных значений на определенных позициях. Иными словами, вы сможете считать всю информацию с вашей карты (баланс, дата последнего прохода, идентификатор турникета) и изменить значение любой позиции. В некоторых случаях это позволит пополнять баланс карты без оплаты.

Разработчик приложения TroikaDumper для Андроид настоятельно рекомендует не оперировать суммами пополнения карты более 100 рублей, так как в зависимости от размера пополнения протоколы могут меняться. Помимо этого, после каждого прохода с использованием измененного значения карты необходимо выполнить списание с помощью валидатора желтого цвета в троллейбусе или автобусе.

GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.

Usage

It’s a command-line application.

Usage: famicom-dumper.exe <command>

Available commands:

  • list-mappers — list available mappers to dump
  • dump — dump cartridge
  • server — start server for remote dumping
  • script — execute C# script specified by —csfile option
  • reset — simulate reset (M2 goes to Z-state for a second)
  • dump-tiles — dump CHR data to PNG file
  • read-prg-ram — read PRG RAM (battery backed save if exists)
  • write-prg-ram — write PRG RAM
  • write-coolboy-gpio — write COOLBOY cartridge using GPIO
  • write-coolboy-direct — write COOLBOY cartridge directly
  • write-coolgirl — write COOLGIRL cartridge
  • write-eeprom — write EEPROM-based cartridge
  • test-prg-ram — run PRG RAM test
  • test-chr-ram — run CHR RAM test
  • test-battery — test battery-backed PRG RAM
  • test-prg-ram-coolgirl — run PRG RAM test for COOLGIRL cartridge
  • test-chr-ram-coolgirl — run CHR RAM test for COOLGIRL cartridge
  • test-coolgirl — run all RAM tests for COOLGIRL cartridge
  • test-bads-coolgirl — find bad sectors on COOLGIRL cartridge
  • read-crc-coolgirl — show CRC checksum for COOLGIRL
  • info-coolboy — show information about COOLBOY’s flash memory
  • info-coolgirl — show information about COOLGIRL’s flash memory

Available options:

  • —port <com> — serial port of dumper or serial number of FTDI device, default — auto
  • —tcpport <port> — TCP port for client/server communication, default — 26672
  • —host <host> — enable network client and connect to specified host
  • —mapper <mapper> — number, name or path to C# script of mapper for dumping, default is 0 (NROM)
  • —file <output.nes> — output filename (.nes, .png or .sav)
  • —psize <size> — size of PRG memory to dump, you can use «K» or «M» suffixes
  • —csize <size> — size of CHR memory to dump, you can use «K» or «M» suffixes
  • —reset — simulate reset first
  • —csfile <C#_file> — execute C# script from file
  • —unifname <name> — internal ROM name for UNIF dumps
  • —unifauthor <name> — author of dump for UNIF dumps
  • —badsectors — comma separated list of bad sectors for COOLBOY/COOLGIRL writing
  • —sound — play sound when done or error occured
  • —check — verify COOLBOY/COOLGIRL checksum after writing
  • —lock — write-protect COOLBOY/COOLGIRL sectors after writing

С этим читают