UART

Support HackTricks

Основна інформація

UART - це серійний протокол, що означає, що він передає дані між компонентами по одному біту за раз. На відміну від цього, паралельні комунікаційні протоколи передають дані одночасно через кілька каналів. Загальноприйняті серійні протоколи включають RS-232, I2C, SPI, CAN, Ethernet, HDMI, PCI Express та USB.

Зазвичай лінія утримується на високому рівні (на логічному значенні 1), поки UART знаходиться в стані простою. Потім, щоб сигналізувати про початок передачі даних, передавач надсилає стартовий біт приймачеві, під час якого сигнал утримується на низькому рівні (на логічному значенні 0). Далі передавач надсилає від п'яти до восьми біт даних, що містять фактичне повідомлення, за яким слідує необов'язковий біт парності та один або два стопові біти (з логічним значенням 1), залежно від конфігурації. Біт парності, що використовується для перевірки помилок, рідко зустрічається на практиці. Стоповий біт (або біти) сигналізують про закінчення передачі.

Ми називаємо найпоширенішу конфігурацію 8N1: вісім біт даних, без парності та один стоповий біт. Наприклад, якщо ми хочемо надіслати символ C, або 0x43 в ASCII, в конфігурації 8N1 UART, ми надішлемо такі біти: 0 (стартовий біт); 0, 1, 0, 0, 0, 0, 1, 1 (значення 0x43 у двійковій системі), і 0 (стоповий біт).

Апаратура для зв'язку з UART:

  • USB-to-serial адаптер

  • Адаптери з чіпами CP2102 або PL2303

  • Універсальний інструмент, такий як: Bus Pirate, Adafruit FT232H, Shikra або Attify Badge

Визначення портів UART

UART має 4 порти: TX(Передача), RX(Прийом), Vcc(Напруга) та GND(Заземлення). Ви можете знайти 4 порти з літерами TX та RX написаними на PCB. Але якщо немає жодних вказівок, вам, можливо, доведеться спробувати знайти їх самостійно, використовуючи мультиметр або логічний аналізатор.

З використанням мультиметра та вимкненого пристрою:

  • Щоб визначити GND пін, використовуйте режим Тесту на безперервність, помістіть задній провід у заземлення та тестуйте червоним, поки не почуєте звук з мультиметра. На PCB можна знайти кілька GND пінів, тому ви могли знайти або не знайти той, що належить UART.

  • Щоб визначити VCC порт, встановіть режим DC напруги та налаштуйте його на 20 В. Чорний щуп на заземлення, а червоний щуп на пін. Увімкніть пристрій. Якщо мультиметр вимірює постійну напругу 3.3 В або 5 В, ви знайшли пін Vcc. Якщо ви отримали інші напруги, спробуйте з іншими портами.

  • Щоб визначити TX порт, встановіть режим DC напруги до 20 В, чорний щуп на заземлення, а червоний щуп на пін, і увімкніть пристрій. Якщо ви помітили, що напруга коливається протягом кількох секунд, а потім стабілізується на значенні Vcc, ви, найімовірніше, знайшли порт TX. Це тому, що при увімкненні він надсилає деякі дані для налагодження.

  • RX порт буде найближчим до інших 3, він має найнижчі коливання напруги та найнижче загальне значення всіх пінів UART.

Ви можете переплутати порти TX та RX, і нічого не станеться, але якщо ви переплутаєте GND та VCC порт, ви можете зіпсувати схему.

У деяких цільових пристроях порт UART відключений виробником шляхом відключення RX або TX або навіть обох. У такому випадку може бути корисно простежити з'єднання на платі та знайти точку розподілу. Сильним натяком на підтвердження відсутності виявлення UART та розриву схеми є перевірка гарантії пристрою. Якщо пристрій було відправлено з гарантією, виробник залишає деякі інтерфейси для налагодження (в даному випадку UART) і, отже, повинен був відключити UART і знову підключити його під час налагодження. Ці пін-коди можна підключити шляхом пайки або за допомогою перемичок.

Визначення швидкості UART

Найпростіший спосіб визначити правильну швидкість передачі - це подивитися на вихідний сигнал TX і спробувати прочитати дані. Якщо отримані дані нечитабельні, перемикайтеся на наступну можливу швидкість передачі, поки дані не стануть читабельними. Ви можете використовувати USB-to-serial адаптер або універсальний пристрій, такий як Bus Pirate, щоб зробити це, в парі з допоміжним скриптом, таким як baudrate.py. Найпоширеніші швидкості передачі - 9600, 38400, 19200, 57600 та 115200.

Важливо зазначити, що в цьому протоколі вам потрібно підключити TX одного пристрою до RX іншого!

CP210X UART до TTY адаптер

Чіп CP210X використовується в багатьох прототипних платах, таких як NodeMCU (з esp8266) для серійної комунікації. Ці адаптери відносно недорогі і можуть бути використані для підключення до інтерфейсу UART цільового пристрою. Пристрій має 5 пінів: 5V, GND, RXD, TXD, 3.3V. Переконайтеся, що ви підключили напругу, підтримувану цільовим пристроєм, щоб уникнути пошкоджень. Нарешті, підключіть пін RXD адаптера до TXD цільового пристрою та пін TXD адаптера до RXD цільового пристрою.

Якщо адаптер не виявлено, переконайтеся, що драйвери CP210X встановлені в хост-системі. Як тільки адаптер буде виявлено та підключено, можна використовувати такі інструменти, як picocom, minicom або screen.

Щоб перерахувати пристрої, підключені до систем Linux/MacOS:

ls /dev/

Для базової взаємодії з інтерфейсом UART використовуйте наступну команду:

picocom /dev/<adapter> --baud <baudrate>

Для minicom використовуйте наступну команду для налаштування:

minicom -s

Налаштуйте параметри, такі як швидкість передачі (baudrate) та ім'я пристрою в опції Serial port setup.

Після налаштування використовуйте команду minicom, щоб запустити UART Console.

UART через Arduino UNO R3 (знімні плати з чіпом Atmel 328p)

Якщо адаптери UART Serial to USB недоступні, Arduino UNO R3 можна використовувати з швидким хаком. Оскільки Arduino UNO R3 зазвичай доступний скрізь, це може заощадити багато часу.

Arduino UNO R3 має вбудований USB to Serial адаптер на самій платі. Щоб отримати UART з'єднання, просто витягніть мікроконтролер Atmel 328p з плати. Цей хак працює на варіантах Arduino UNO R3, де Atmel 328p не припаяний до плати (використовується SMD версія). Підключіть RX пін Arduino (Цифровий пін 0) до TX піну UART інтерфейсу та TX пін Arduino (Цифровий пін 1) до RX піну UART інтерфейсу.

Нарешті, рекомендується використовувати Arduino IDE для отримання Serial Console. У розділі tools у меню виберіть опцію Serial Console і встановіть швидкість передачі відповідно до UART інтерфейсу.

Bus Pirate

У цьому сценарії ми будемо перехоплювати UART зв'язок Arduino, яка надсилає всі виводи програми до Serial Monitor.

# Check the modes
UART>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. KEYB
9. LCD
10. PIC
11. DIO
x. exit(without change)

# Select UART
(1)>3
Set serial port speed: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. BRG raw value

# Select the speed the communication is occurring on (you BF all this until you find readable things)
# Or you could later use the macro (4) to try to find the speed
(1)>5
Data bits and parity:
1. 8, NONE *default
2. 8, EVEN
3. 8, ODD
4. 9, NONE

# From now on pulse enter for default
(1)>
Stop bits:
1. 1 *default
2. 2
(1)>
Receive polarity:
1. Idle 1 *default
2. Idle 0
(1)>
Select output type:
1. Open drain (H=Hi-Z, L=GND)
2. Normal (H=3.3V, L=GND)

(1)>
Clutch disengaged!!!
To finish setup, start up the power supplies with command 'W'
Ready

# Start
UART>W
POWER SUPPLIES ON
Clutch engaged!!!

# Use macro (2) to read the data of the bus (live monitor)
UART>(2)
Raw UART input
Any key to exit
Escritura inicial completada:
AAA Hi Dreg! AAA
waiting a few secs to repeat....

Вивантаження прошивки за допомогою UART консолі

UART Консоль забезпечує чудовий спосіб роботи з основною прошивкою в середовищі виконання. Але коли доступ до UART Консолі є лише для читання, це може ввести багато обмежень. У багатьох вбудованих пристроях прошивка зберігається в EEPROM і виконується на процесорах, які мають нестабільну пам'ять. Отже, прошивка зберігається в режимі лише для читання, оскільки оригінальна прошивка під час виробництва знаходиться всередині EEPROM, і будь-які нові файли можуть бути втрачені через нестабільну пам'ять. Таким чином, вивантаження прошивки є цінним зусиллям під час роботи з вбудованими прошивками.

Існує багато способів зробити це, і розділ SPI охоплює методи витягування прошивки безпосередньо з EEPROM за допомогою різних пристроїв. Хоча рекомендується спочатку спробувати вивантажити прошивку за допомогою UART, оскільки вивантаження прошивки з фізичними пристроями та зовнішніми взаємодіями може бути ризикованим.

Вивантаження прошивки з UART Консолі вимагає спочатку отримати доступ до завантажувачів. Багато популярних постачальників використовують uboot (Універсальний Завантажувач) як свій завантажувач для завантаження Linux. Отже, отримання доступу до uboot є необхідним.

Щоб отримати доступ до завантажувача, підключіть UART порт до комп'ютера та використовуйте будь-які інструменти Серійної Консолі, при цьому живлення пристрою має бути відключено. Коли налаштування готове, натисніть клавішу Enter і утримуйте її. Нарешті, підключіть живлення до пристрою і дайте йому завантажитися.

Це перерве завантаження uboot і надасть меню. Рекомендується ознайомитися з командами uboot і використовувати меню допомоги для їх переліку. Це може бути команда help. Оскільки різні постачальники використовують різні конфігурації, необхідно зрозуміти кожну з них окремо.

Зазвичай команда для вивантаження прошивки виглядає так:

md

який означає "вивантаження пам'яті". Це вивантажить пам'ять (вміст EEPROM) на екран. Рекомендується зафіксувати вихід Serial Console перед початком процедури для захоплення вивантаження пам'яті.

Нарешті, просто видаліть всі непотрібні дані з файлу журналу та збережіть файл як filename.rom і використовуйте binwalk для витягнення вмісту:

binwalk -e <filename.rom>

Це перелічить можливий вміст з EEPROM відповідно до підписів, знайдених у hex-файлі.

Хоча необхідно зазначити, що не завжди uboot розблокований, навіть якщо він використовується. Якщо клавіша Enter нічого не робить, перевірте інші клавіші, такі як клавіша Space тощо. Якщо завантажувач заблокований і не переривається, цей метод не спрацює. Щоб перевірити, чи є uboot завантажувачем для пристрою, перевірте вивід на UART Консолі під час завантаження пристрою. Можливо, він згадає uboot під час завантаження.

Support HackTricks

Last updated