Взлом Verifone ZON Jr XL

Tomcat

Professional
Messages
2,689
Reaction score
915
Points
113
Давным-давно я пытался начать бизнес и хотел принимать транзакции по кредитным картам, поэтому арендовал терминал для кредитных карт у CardService International. Бизнес ни к чему не привел, но я арендовал эту машину настолько долго, что в конце концов стал ее владельцем. Я уверен, что это обошлось мне как минимум в 1500 долларов арендных платежей.

DSCF1731.jpg


Теперь, много лет спустя, я готов от этого избавиться. Я проверил eBay: они продаются всего за 10 долларов — даже не стоит затрачивать на это усилий. С другой стороны, они настолько дешевы, что могли бы иметь некоторую ценность, если бы их можно было легко перепрофилировать посредством взлома. Ведь у них красивая клавиатура и буквенно-цифровой вакуумно-люминесцентный дисплей.

Еще у него сзади 8-контактный разъем DIN, думаю для принтера:

DSCF1732.jpg


Я лучше разберу его, прежде чем выбросить...

Так что же внутри него?​

Два винта сзади снимаем заднюю крышку:

DSCF1734.jpg


Затем печатную плату можно вытянуть вверх (без винтов). Имеется 20-контактный разъем SIP, соединяющий основную плату с платой клавиатуры/дисплея:

DSCF1735.jpg


При внимательном рассмотрении основной платы и платы клавиш/дисплея можно увидеть технологию 80-х годов: все обычные чипы со сквозными отверстиями:

DSCF1736.jpg


DSCF1737.jpg


Реверс-инжиниринг будет простым!

Список деталей​

Итак, что мы имеем? На основной плате имеются следующие чипы:
  • Кристалл 7,15909 МГц (вдвое выше частоты цветовой синхронизации NTSC)
  • Y2, кристалл 32768 Гц.
  • шестигранный инвертор 74HC04
  • приемник RS-232 MC1489
  • U1, часы реального времени OKI M6242.
  • U2, модем 74HC942, скорость 300 бод.
  • U3, тройной вентиль И-НЕ 74HC10.
  • U4, EEPROM 27C256, 32 КБ.
  • U5 и U6: микросхемы статической оперативной памяти M5M5165P объемом 8 КБ.
  • U7, процессор Z80A
  • U9, двойной аналоговый мультиплексор CD4052 с 4 входами
  • U10, 3-битный декодер 74HC138.
  • U11, Z80 CTC (цепь таймера счетчика)
  • U12 и U15: 8-битная адресуемая защелка 74HC259.
  • U13 счетверенный операционный усилитель TL074CN
  • U14 — двойной триггер 74HC74.
  • U16 и Z80 PIO (контроллер параллельного ввода-вывода)
  • U17 генератор тонального набора UM95089.
  • стабилизатор L387A 5 В с генератором сброса
  • регулятор 79L05 -5В
  • Q1, Q2 и Q3: транзисторы 2N3904 NPN.
  • Батарея (разряженная)
Плата клавиатуры/дисплея имеет следующие микросхемы:
  • U3, Вакуумно-люминесцентный драйвер 10937P-40.
  • U2 — счетверенный операционный усилитель TL074CN.
  • Пьезодинамик
  • Схема генератора высокого напряжения для вакуумного флуоресцентного дисплея (он должен быть, плюс круглый индуктор вверху - бесполезная вещь).
Прохладный! Это классическая система Z-80, и описание каждого чипа доступно в Интернете. Это легко взломанное устройство.

Карта памяти​

Час возни с проверкой целостности выявляет карту памяти. 74HC10 и 74HC04 используются для создания простого декодера адреса пространства памяти:
  • U4 27C256 EPROM: 0x0000 – 0x7FFF (32 КБ)
  • Статическая ОЗУ U5 M5M5165P: 0xC000 – 0xFFFF (8 КБ с двойным псевдонимом)
  • Статическая ОЗУ U6 M5M5165P: 0x8000 – 0xBFFF (8 КБ с двойным псевдонимом)
74HC138 — декодер портов ввода-вывода:
  • 0x00 Z80 CTC (CS0 подключен к A0, а CS1 подключен к A1)
    • КТК подключается следующим образом:
      • TRG0 (контакт 23) Не подключен
      • TO0 (контакт 7) подключен к TRG1.
      • TRG1 (контакт 22) подключен к TO0.
      • TO1 (контакт 8) Подключен к тактовому контакту второго триггера 74HC7, который управляет динамиком.
      • TRG2 (контакт 21) Не подключен
      • TO2 (контакт 9) подключен к TRG3.
      • TRG3 (контакт 20) подключен к TO2.
  • 0x20 Z80 PIO (с C/~D, подключенным к A0, и B/~A, подключенным к A1)
    • ПИО подключается следующим образом:
      • A0 (контакт 15) Ряд клавиатуры 0 (верхний ряд)
      • A1 (контакт 14) Ряд клавиатуры 1
      • A2 (контакт 13) Ряд клавиатуры 2
      • A3 (контакт 12) Ряд клавиатуры 3
      • A4 (контакт 10) Передача данных на модем и разъем DIN
      • A5 (контакт 9) Обнаружение несущей на модеме 74HC942
      • A6 (контакт 8) К контакту 6 MC1489. Контакт 4 подключен к разъему DIN. Я предполагаю, что это используется для управления потоком.
      • A7 (контакт 7) К контакту 10 разъема 74HC04. Вывод 11 (вход) подключен к ленточному усилителю для чтения магнитной полосы.
      • ARDY (контакт 18) Не подключен
      • ~ASTB (контакт 16) Не подключен
      • B0 (контакт 27) ~C1 микросхемы тонального набора
      • B1 (контакт 28) ~C2 микросхемы тонального набора
      • B2 (контакт 29) ~C3 микросхемы тонального набора
      • B3 (контакт 30) ~R1 микросхемы тонального набора
      • B4 (контакт 31) ~R2 микросхемы тонального набора
      • B5 (контакт 32) ~R3 микросхемы тонального набора
      • B6 (контакт 33) ~R4 микросхемы тонального набора
      • B7 (контакт 34) Получение данных от модема и разъема DIN
      • BRDY (контакт 21) Не подключен
      • ~BSTB (контакт 17) Не подключен
  • 0x40 U15 74HC259 (8-битный выходной порт)
    • Вход D подключен к A0
    • S0 подключен к A1
    • S1 подключен к A2
    • S2 подключен к A3
    • Таким образом, это означает запись в четную ячейку, чтобы очистить бит, или запись в следующую, более высокую нечетную ячейку, чтобы установить ее.
    • 8 выходных битов подключены следующим образом:
      • Q0 (контакт 4, порт 0x40) Столбец клавиатуры 0 (крайний левый)
      • Q1 (контакт 5, порт 0x42) Столбец клавиатуры 1
      • Q2 (контакт 6, порт 0x44) Столбец клавиатуры 2
      • Q3 (контакт 7, порт 0x46) Столбец клавиатуры 3
      • Q4 (контакт 9, порт 0x48) Идет к базе Q2. Эмиттер Q2 идет на оптоизолятор U20 (думаю). Это управляет некоторой частью схемы модема.
      • Q5 (контакт 10, порт 0x4A) Тактовый сигнал для вакуумно-люминесцентного дисплея
      • Q6 (контакт 11, порт 0x4C) Сигнал данных для вакуумно-люминесцентного дисплея
      • Q7 (контакт 12, порт 0x4E) Сигнал сброса вакуумного флуоресцентного дисплея. Когда этот бит низкий, утверждается сброс.
  • 0x60 U12 74HC259 (8-битный выходной порт)
    • 8 выходных битов подключены следующим образом:
      • Q0 (контакт 4, порт 0x60) к базе Q3. Эмиттер Q3 поступает на оптоизолятор U28. Это управляет некоторой частью схемы модема.
      • Q1 (контакт 5, порт 0x62) к контакту O/~A (режим отправки/ответа) модема 74HC942
      • Q2 (контакт 6, порт 0x64) к контакту «шумоподавитель» модема 74HC942
      • Q3 (контакт 7, порт 0x66) к базе Q1, который подключен к реле снятия трубки.
      • Q4 (контакт 9, порт 0x68) к диоду D3: думаю что-то связано с кардридером
      • Q5 (контакт 10, порт 0x6A) к контакту 10 (~preset2) 74HC74. Я думаю, используется для включения или отключения динамика.
      • Q6 (контакт 11, порт 0x6C) для адреса контакта A мультиплексора CD4052.
      • Q7 (контакт 12, порт 0x6E) для адреса контакта B мультиплексора CD4052.
  • 0x80 M6242 (Часы реального времени)
  • 0xA0 не используется
  • 0xC0 не используется
  • 0xE0 не используется

Подсхемы​

Мне нужно нарисовать схематическую диаграмму этой штуки, но она настолько проста, что в ней нет особой необходимости. Вместо этого, вот описание каждой из подсхем, которые я смог найти:

SIP-разъем​

Вот распиновка разъема SIP, который соединяет основную плату с клавиатурой/платой дисплея. Первый контакт — ближайший к задней части машины:
  1. Ряд клавиатуры 0 (верхний ряд)
  2. Ряд 1
  3. Ряд 2
  4. Ряд 3
  5. Столбец клавиатуры 3 (крайний правый столбец)
  6. Столбец 2
  7. Столбец 1
  8. Столбец 0
  9. Не подключен
  10. Не подключен
  11. Не подключен
  12. Кардридер/ленточная головка
  13. Сигнал сброса дисплея: активный низкий уровень
  14. Отображение сигнала данных
  15. Отображение тактового сигнала
  16. +5В
  17. Оратор
  18. -5В
  19. Оратор
  20. Земля

Источник питания​

Он генерирует напряжение 5 В и -5 В с помощью линейных регуляторов. -5 В используется для питания отрицательной шины операционных усилителей. OP-AMP на основной плате используется в качестве линейного драйвера для вывода данных разъема DIN. Операционный усилитель на клавиатуре/плате дисплея представляет собой усилитель с магнитной головкой для устройства считывания карт.

Осциллятор​

Одна половина 74HC74 используется для деления генератора с частотой 7,15909 МГц (сделанного из кристалла и некоторых инверторов 74HC04) пополам, чтобы получить 3,579545 МГц для тактовой частоты основного процессора и микросхемы тонального генератора.

Перезагрузить​

Его обеспечивает стабилизатор напряжения L387A. Он подключен к некоторым контактам выбора чипа чипа часов реального времени и чипов статического ОЗУ, чтобы помочь сохранить их содержимое при сбросе. Чипы статического ОЗУ и чип часов реального времени питаются (через логический элемент диод-ИЛИ) как от сети, так и от батареи.

Оратор​

Пьезодинамик подключен к выходам Q и ~Q второго триггера 74HC74. Выход ~Q подключен к входу D, поэтому этот триггер подключен как счетчик деления на два. Вход синхронизации подключен к выводу TO1 CTC: поэтому вам необходимо настроить CTC для генерации тона. Вход ~preset подключен к выходу Q5 U12. Я думаю, идея состоит в том, чтобы использовать его в качестве бита разрешения вывода, чтобы вы могли оставить таймер в CTC всегда работающим.

Последовательный порт​

A4 PIO предназначен для передачи данных. B7 — получение данных. Я почти уверен, что при этих назначениях произошла схематическая ошибка, поскольку все остальные контакты A являются входами, а все остальные контакты B — выходами. В любом случае, идея состоит в том, что программное обеспечение должно обеспечивать «битовый» UART, используя эти контакты.

Эти контакты передачи и приема подключены к аналоговому переключателю CD4052, так что эти же контакты можно подключить к различным последовательным источникам. Адресные контакты B и A CD4052 подключены к U12 Q6 и Q7.

  • B = 0, A = 0: последовательные линии подключены к модемной микросхеме 74HC942.
  • B = 0, A = 1: последовательные линии подключены к внешнему разъему DIN.
  • B = 1, A = 0: последовательные линии подключены к клавиатуре/плате дисплея, но на этой плате они подключены к незаполненной микросхеме. Я не знаю цели.
  • B = 1, A = 1: входная линия подключена к полученному MC1489, который питается от операционного усилителя. Не знаю назначения: может ОУ настроен как генератор и это какое-то тестовое подключение? Выходная линия подключена к оптоизолятору U18, так что это как-то связано с модемом, но я не уверен, с чем.

DIN-разъем​

Вот распиновка внешнего разъема:

din.jpg


  1. Земля
  2. Нет подключения
  3. Нет подключения
  4. Вход уровня RS-232 на контакт 4 MC1489. Контакт 6 MC1489 подключается к A6 PIO. Я думаю для контроля потока.
  5. Вход уровня RS-232 на контакт 1 MC1489. Контакт 3 MC1489 подключается к мультиплексору CD4052. Это последовательный ввод данных.
  6. Подключен к контакту 7 TL074. Вывод 6 TL074 подключен к мультиплексору CD4052. Это вывод последовательных данных.
  7. Нет подключения
  8. Подключен к 5В через резистор сопротивлением 47 Ом.
TL074 используется в качестве драйвера линии RS-232. Выходное напряжение колеблется от 5 В до -5 В.

Клавиатура​

Контакты U15 Q0–Q3 управляют колонками. A0–A3 PIO — это входы строк.

Сенсорный тональный генератор​

B0–B6 PIO подключены к микросхеме генератора тональных сигналов UM95089. Этот чип предназначен для подключения к телефонной клавиатуре, поэтому программное обеспечение должно имитировать нажатие клавиши, устанавливая один бит строки и один бит столбца (при переводе битов в низкий уровень все остальные должны оставаться высокими).

Отобразить​

Для записи на дисплей достаточно отправить на него одну целую строку из 16 символов. Каждый символ отправляется как байт в диапазоне 0x00–0x3F, причем байт сериализуется так, чтобы первым отправлялся старший бит. Для каждого бита должен быть предусмотрен спадающий фронт тактовой частоты.

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

Часы имеют максимальное время 20 мкс, поэтому его необходимо поддерживать на низком уровне. Минимальная длительность импульса составляет 1 мкс. После каждого переданного байта необходимо подождать 120 мкс.

Яркость дисплея контролируется с помощью команды рабочего цикла: 0xC0 - 0xFF, где 0xC0 — выключено, а 0xFF — максимальная яркость. Яркость по умолчанию после сброса отключена, поэтому мы должны отправить одну из этих команд, чтобы включить дисплей.

Колонкой, в которую начинается запись, можно управлять командами 0xA0 – 0xAF. Самый левый столбец — 0xAF, следующий — 0xA0 и т. д.

Это набор символов из таблицы данных:

font.jpg


"Привет, мир!" программа​

Теперь у нас есть достаточно информации, чтобы написать собственные программы для этого оборудования.

Мы, конечно, могли бы написать их на языке ассемблера Z-80, но есть хороший бесплатный компилятор C: Компилятор C для малых устройств: SDCC.

Вот программа для вывода сообщения на дисплей:

Code:
/* IoPorts для вакуумно-люминесцентного дисплея */
/* Обратите внимание на специальную директиву SDCC для объявления и определения местоположения портов ввода-вывода */

__sfr __at 0x4a clr_lock;
__sfr __at 0x4b set_lock;

__sfr __at 0x4c clr_data;
__sfr __at 0x4d set_data;

__sfr __at 0x4e clr_reset;
__sfr __at 0x4f set_reset;

/* задержка 7,54 мкс */

void Delay()
{
        /* Ничего не делать: последовательность вызовов и повторов составляет 7,54 мкс */
}

/* Не менее 120 мкс */

void long_delay()
{
        unsigned char x;
        for (x = 0; x != 20; ++x)
                задержка();
}

/* Сериализуем один байт и отправляем его на дисплей */

void send_byte(unsigned char c)
{
        unsigned char scan = 0x80;
        do {
                if ((c & scan) != 0) {
                        set_data = 1;
                } Еще {
                        clr_data = 1;
                }
                set_clock = 1;
                задерживать();
                clr_lock = 1; /* Спадающий фронт, когда данные стабильны */
                Delay();
                сканирование >>= 1;
        } while(сканирование!= 0);
        длинная_задержка(); /* Задержка 120 мкс после отправки каждого символа */
}

/* Запись всей строки */

void send_msg(char *s)
{
        char x;
        send_byte (0xAF); /* Указатель на первую цифру */
        for (x = 0; x != 16; ++x) {
                if (*s != 0) {
                        send_byte(0x3F & *s++);
                } Еще {
                        send_byte(0x20); /* Пробелы до конца строки */
                }
        }
        send_byte(0xFF); /* Включить отображение, полная яркость */
}

/* Инициализировать отображение */

void init_display()
{
        clr_clock = 1; /* Частота обычно низкая */
        clr_reset = 1; /* Подтверждаем сброс */
        long_delay();
        set_reset = 1; /* Сброс освобождения */
        long_delay();
}

Int main()
{
        init_display();
        send_msg("Привет, МИР!");
        вернуть 0;
}

Для компиляции мы используем следующую команду:

Code:
sdcc -mz80 --xram-loc 0x8000 test.c

Параметр -mz80 устанавливает архитектуру Z-80. --xram-loc задает расположение оперативной памяти: туда будет помещен раздел данных.

Компилятор свяжется с включенной в комплект простой программой запуска C «crt0.s» и сгенерирует файл шестнадцатеричного формата Intel, который можно использовать в программаторе EPROM. Crt0.s устанавливает стек в 0xFFFF и предоставляет инструкцию перехода от вектора сброса к коду. Он помещает инструкции «reti» в векторы прерываний.

Если у вас есть инициализированные глобальные переменные, они будут находиться в разделе данных (в оперативной памяти), и будет сгенерирован код для установки их начального значения. Этот код находится вместе с остальным кодом в EPROM.

eprom.jpg


Старый ластик UV EPROM и старый программатор EPROM на базе MS-DOS.[/TD]

И вот результат:

hacked.jpg


Символ «@» в конце строки связан с тем, что «,» на самом деле не является символом: вместо этого он оказывается модификатором предыдущего символа. Вы можете видеть, что ',' не использует всю позицию символа. Итак, мы намеревались отправить 16 символов, но на самом деле отправили только 15, в результате чего для последнего оставшегося символа осталось значение сброса. В любом случае, моя функция send_msg должна это учитывать. '!' выглядит смешно, но это из-за шрифта.
 
Top