- •От издательства
- •О техническом обозревателе
- •О соавторах
- •Об авторах
- •Вступительное слово
- •Благодарности
- •Предисловие
- •Почему важна защита интернета вещей?
- •Чем защита интернета вещей отличается от традиционной ИТ-защиты?
- •Законы хакинга интернета вещей
- •Заключение
- •Моделирование угроз для интернета вещей
- •Схема моделирования угроз
- •Определение архитектуры
- •Разбивка архитектуры на компоненты
- •Выявление угроз
- •Использование деревьев атак для обнаружения угроз
- •Распространенные угрозы интернета вещей
- •Атаки с подавлением сигнала
- •Атаки с воспроизведением
- •Атаки со взломом настроек
- •Клонирование узла
- •Заключение
- •Пассивная разведка
- •Физический или аппаратный уровень
- •Периферийные интерфейсы
- •Среда загрузки
- •Блокировки
- •Предотвращение и обнаружение несанкционированного доступа
- •Прошивка
- •Интерфейсы отладки
- •Физическая устойчивость
- •Разведка
- •Атаки на сетевой протокол и службы
- •Тестирование беспроводного протокола
- •Оценка веб-приложений
- •Картирование приложений
- •Элементы управления на стороне клиента
- •Аутентификация
- •Управление сеансом
- •Проверка ввода
- •Логические ошибки
- •Сервер приложений
- •Исследование конфигурации хоста
- •Учетные записи пользователей
- •Привилегии учетной записи
- •Уровни патчей
- •Удаленное обслуживание
- •Управление доступом к файловой системе
- •Шифрование данных
- •Неверная конфигурация сервера
- •Мобильное приложение и облачное тестирование
- •Заключение
- •4. Оценка сети
- •Переход в сеть IoT
- •VLAN и сетевые коммутаторы
- •Спуфинг коммутатора
- •Двойное тегирование
- •Имитация устройств VoIP
- •Идентификация устройств IoT в сети
- •Обнаружение паролей службами снятия отпечатков
- •Атаки MQTT
- •Настройка тестовой среды
- •Написание модуля MQTT Authentication-Cracking в Ncrack
- •Тестирование модуля Ncrack на соответствие MQTT
- •Заключение
- •5. Анализ сетевых протоколов
- •Проверка сетевых протоколов
- •Сбор информации
- •Анализ
- •Создание прототипов и разработка инструментов
- •Работа с Lua
- •Общие сведения о протоколе DICOM
- •Генерация трафика DICOM
- •Включение Lua в Wireshark
- •Определение диссектора
- •Определение основной функции диссектора
- •Завершение диссектора
- •Создание диссектора C-ECHO
- •Начальная загрузка данных функции диссектора
- •Анализ полей переменной длины
- •Тестирование диссектора
- •Разработка сканера служб DICOM для механизма сценариев Nmap
- •Написание библиотеки сценариев Nmap для DICOM
- •Коды и константы DICOM
- •Написание функций создания и уничтожения сокетов
- •Создание заголовков пакетов DICOM
- •Написание запросов контекстов сообщений A-ASSOCIATE
- •Чтение аргументов скрипта в движке сценариев Nmap
- •Определение структуры запроса A-ASSOCIATE
- •Анализ ответов A-ASSOCIATE
- •Создание окончательного сценария
- •Заключение
- •6. Использование сети с нулевой конфигурацией
- •Использование UPnP
- •Стек UPnP
- •Распространенные уязвимости UPnP
- •Злоупотребление UPnP через интерфейсы WAN
- •Другие атаки UPnP
- •Использование mDNS и DNS-SD
- •Как работает mDNS
- •Как работает DNS-SD
- •Проведение разведки с помощью mDNS и DNS-SD
- •Злоупотребление на этапе проверки mDNS
- •Атаки «человек посередине» на mDNS и DNS-SD
- •Использование WS-Discovery
- •Как работает WS-Discovery
- •Подделка камер в вашей сети
- •Создание атак WS-Discovery
- •Заключение
- •UART
- •Аппаратные средства для связи с UART
- •Как найти порты UART
- •Определение скорости передачи UART
- •JTAG и SWD
- •JTAG
- •Как работает SWD
- •Аппаратные средства для взаимодействия с JTAG и SWD
- •Идентификация контактов JTAG
- •Взлом устройства с помощью UART и SWD
- •Целевое устройство STM32F103C8T6 (Black Pill)
- •Настройка среды отладки
- •Кодирование целевой программы на Arduino
- •Отладка целевого устройства
- •Заключение
- •Как работает SPI
- •Как работает I2C
- •Настройка архитектуры шины I2C типа «контроллер–периферия»
- •Заключение
- •9. Взлом прошивки
- •Прошивка и операционные системы
- •Получение доступа к микропрограмме
- •Взлом маршрутизатора Wi-Fi
- •Извлечение файловой системы
- •Статический анализ содержимого файловой системы
- •Эмуляция прошивки
- •Динамический анализ
- •Внедрение бэкдора в прошивку
- •Нацеливание на механизмы обновления микропрограмм
- •Компиляция и установка
- •Код клиента
- •Запуск службы обновления
- •Уязвимости служб обновления микропрограмм
- •Заключение
- •10. Радио ближнего действия: взлом rFID
- •Радиочастотные диапазоны
- •Пассивные и активные технологии RFID
- •Структура меток RFID
- •Низкочастотные метки RFID
- •Высокочастотные RFID-метки
- •Настройка Proxmark3
- •Обновление Proxmark3
- •Клонирование низкочастотных меток
- •Клонирование высокочастотных меток
- •Имитация RFID-метки
- •Изменение содержимого RFID-меток
- •Команды RAW для небрендированных или некоммерческих RFID-тегов
- •Подслушивание обмена данными между меткой и считывателем
- •Извлечение ключа сектора из перехваченного трафика
- •Атака путем подделки RFID
- •Автоматизация RFID-атак с помощью механизма скриптов Proxmark3
- •Пользовательские сценарии использования RFID-фаззинга
- •Заключение
- •11. Bluetooth Low Energy (BLE)
- •Как работает BLE
- •Необходимое оборудование BLE
- •BlueZ
- •Настройка интерфейсов BLE
- •Обнаружение устройств и перечисление характеристик
- •GATTTool
- •Bettercap
- •Взлом BLE
- •Настройка BLE CTF Infinity
- •Приступаем к работе
- •Заключение
- •12. Радиоканалы средней дальности: взлом Wi-Fi
- •Как работает Wi-Fi
- •Атаки Wi-Fi на беспроводные клиенты
- •Деаутентификация и атаки «отказ в обслуживании»
- •Атаки на Wi-Fi путем подключения
- •Wi-Fi Direct
- •Атаки на точки доступа Wi-Fi
- •Взлом WPA/WPA2
- •Взлом WPA/WPA2 Enterprise для сбора учетных данных
- •Методология тестирования
- •Заключение
- •13. Радио дальнего действия: LPWAN
- •Захват трафика LoRa
- •Настройка платы разработки Heltec LoRa 32
- •Настройка LoStik
- •Превращаем USB-устройство CatWAN в сниффер LoRa
- •Декодирование протокола LoRaWAN
- •Формат пакета LoRaWAN
- •Присоединение к сетям LoRaWAN
- •Атаки на LoRaWAN
- •Атаки с заменой битов
- •Генерация ключей и управление ими
- •Атаки воспроизведения
- •Подслушивание
- •Подмена ACK
- •Атаки, специфичные для приложений
- •Заключение
- •14. Взлом мобильных приложений
- •Разбивка архитектуры на компоненты
- •Выявление угроз
- •Защита данных и зашифрованная файловая система
- •Подписи приложений
- •Аутентификация пользователя
- •Управление изолированными аппаратными компонентами и ключами
- •Проверенная и безопасная загрузка
- •Анализ приложений iOS
- •Подготовка среды тестирования
- •Статический анализ
- •Динамический анализ
- •Атаки путем инъекции
- •Хранилище связки ключей
- •Реверс-инжиниринг двоичного кода
- •Перехват и изучение сетевого трафика
- •Анализ приложений Android
- •Подготовка тестовой среды
- •Извлечение файла APK
- •Статический анализ
- •Обратная конвертация двоичных исполняемых файлов
- •Динамический анализ
- •Перехват и анализ сетевого трафика
- •Утечки по побочным каналам
- •Заключение
- •15. Взлом умного дома
- •Физический доступ в здание
- •Клонирование RFID-метки умного дверного замка
- •Глушение беспроводной сигнализации
- •Воспроизведение потока с IP-камеры
- •Общие сведения о протоколах потоковой передачи
- •Анализ сетевого трафика IP-камеры
- •Извлечение видеопотока
- •Атака на умную беговую дорожку
- •Перехват управления интеллектуальной беговой дорожкой на базе Android
- •Заключение
- •Инструменты для взлома интернета вещей
- •Предметный указатель
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь, когда вы извлекли флеш-память, можете запустить утили- |
|
|
|
|
|
m |
|||||
|
w Click |
|
|
|
|
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
ту strings, чтобы приступить к просмотру информации или выполd-f-x chan |
.c |
|
|||||||||
|
|
. |
|
|
|
|
|
|
|||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
нить дальнейший анализ с помощью таких инструментов, как bin- |
|
|
|
|
|
|
|||||
walk. О тестировании безопасности |
микропрограмм будет подробно |
|
|
|
|
|
|
||||
рассказываться в главе 9. |
|
|
|
|
|
|
|
|
|
|
|
I2C
I2C – это протокол последовательной связи для низкоскорост- ных устройств. Компания Phillips Semiconductors разработала I2C в 1980-х годах для связи между компонентами на одной печатной плате, но вы можете также использовать его между компонента- ми, соединенными кабелем. В мире интернета вещей вы часто най- дете его в микроконтроллерах, интерфейсах ввода/вывода,таких как клавиатуры и кнопки, обычных бытовых и корпоративных устрой- ствах,атакжедатчикахвсехтипов.Важноотметить,чтодажедатчики во многих промышленных системах управления (ICS) используютI2C, благодаря чему он получил большое распространение.
Основным преимуществом этого протокола является его про- стота. Вместо четырех проводов, которые использует SPI, I2C имеет двухпроводнойинтерфейс.Крометого,оборудованиебезвстроенной поддержки I2C может использовать I2C через контакты ввода/вывода общего назначения. Но его простота и тот факт, что все данные пере- даются по одной и той же шине,повышают риски,если злоумышлен- ник хочет перехватить данные или ввести свои собственные. Причи- на в том, что в устройствах IoT, использующих одну и ту же шину I2C, не предусмотрена аутентификация компонентов.
Как работает I2C
Простота I2C позволяет оборудованию обмениваться данными без строгихтребованийкскорости.Впротоколеиспользуютсятрилинии:
линия последовательной передачи данных (SDA) для передачи данных, последовательная линия синхронизации(SCL)для определения момен-
та считывания данных и линия заземления (GND). Линии SDA и SCL подключены к периферийным устройствам, и они представляют со- бой драйверы с открытым стоком: обе линии необходимо подклю- чить к резисторам. (Вам понадобится только один резистор для ка- ждойлинии,а не по одномудля каждого периферийного устройства.) Напряженияварьируютсямежду1,8,3,3и5,0В,апередачимогутпро- исходить с четырьмя разными скоростями: 100 кГц или начальной скоростью в соответствии со спецификациями I2C; 400 кГц–быстрый режим; 1 МГц – высокоскоростной режим и 3,2 МГц – сверхбыстрый режим.
Каки последовательныйпериферийныйинтерфейсSPI, I2C использу-
ет конфигурацию контроллера и периферии. Компоненты передают данныеполинииSDAбитзабитомввосьмибитныхпоследовательно-
SPI И I2C 235
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
|
X |
|
|
|
|
|
|||
|
|
|
- |
|
|
|
|
|
d |
|
||
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|||
|
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
BUY |
|
|
|||
стях.Контроллер или несколько контроллеров управляетлинией SCL. |
|
|
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
m |
|||
|
w Click |
|
|
|
|
|
|
|||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
Архитектура I |
|
w |
|
df-x chan |
|
o |
|
|||||
C поддерживает более одного контроллера и одно или |
. |
.c |
|
|||||||||
2 |
|
|
|
|
|
|
|
|
||||
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
несколько периферийных устройств – каждое с уникальными адре- сами, используемыми для связи. В табл. 8.2 показана структура сооб- щения, отправленного от контроллера к периферийному устройству.
Таблица 8.2.Сообщение I2C,отправленное на периферийное устройство через SDA
Адрес I2C |
Бит |
Данные |
Данные |
|
Старт (7 или 10 бит) |
чтения/записи |
БитACK/NACK (8 бит) |
БитACK/NACK (8 бит) |
Стоп |
Контроллер начинает каждое сообщение с состояния шины START, которое сигнализирует о начале сообщения. Затем он отправляет адреспериферийногоустройства,которыйобычноимеетдлину7бит, но может иметь длину до 10 бит. Это позволяет использовать до 128 (при использовании 7-битных адресов) или до 1024 периферийных устройств (при использовании 10-битных адресов) на одной шине. Контроллер также добавляет бит чтения/записи, который указывает тип выполняемой операции. Бит ACK/NACK указывает, каким будет следующий сегмент данных. I2C делит фактические данные на вось- мибитные последовательности, каждая из которых заканчивается другим битом ACK/NACK. Контроллер завершает сообщение, фор- мируя состояние STOP. Для получения дополнительной информации о протоколе посетите https://www.i2c-bus.org/.
Как упоминалосьранее,протокол I2C поддерживаетнесколько кон- троллеров на одной шине. Это важно, потому что, подключившись к шине,мы могли бы действовать как другой контроллер,а затем чи- тать и отправлять данные на периферийные устройства.
В следующем разделе настроим нашу собственную архитектуру шины I2C.
Настройка архитектуры шины I2C типа «контроллер–периферия»
Чтобы продемонстрировать, как отслеживать обмен данными I2C и записывать данные на периферийные устройства на шине,давайте построим классическую архитектуру шины связи контроллера и пе- риферии с помощью следующего оборудования с открытым исход- ным кодом:
zzмикроконтроллера Arduino Uno ( https://store.arduino.cc/usa/ardui- no-uno-rev3/), который будет действовать в качестве контроллера шины;
zzодногоилинесколькихсветодиодовRGB,управляемых по I2C (https:
//www.sparkfun.com/products/8579/), – в качестве периферийных устройств.Полнуюдокументацию по светодиодам BlinkM,вклю- чаяпримерыдругихспособовихпрограммирования,вынайдете на странице https://thingm.com/products/blinkm/.
236 Глава 8
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
|
X |
|
|
|
|
|
|||
|
|
|
- |
|
|
|
|
|
d |
|
||
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Мы решили использовать Arduino Uno, потому что аналоговые |
|
|
|
|
|
m |
||||||
|
|
w Click |
|
|
|
|
|
|
||||
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
выводы, которые Arduino использует для SDA и SCL, имеют встроенd-f-x chan |
.c |
|
||||||||||
|
|
|
. |
|
|
|
|
|
|
|||
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
ные резисторы,и нам не придется добавлять в схему подтягивающие |
|
|
|
|
|
|
||||||
резисторы. Кроме того, это позволяет нам использовать официаль- |
|
|
|
|
|
|
||||||
ную библиотеку Arduino Wire для управления шиной I2C в качестве |
|
|
|
|
|
|
||||||
контроллера и отправки команд на периферийные устройства I2C. |
|
|
|
|
|
|
||||||
В табл. 8.3 перечислены аналоговые выводы Arduino Uno, поддержи- |
|
|
|
|
|
|
||||||
вающие I2C. |
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 8.3.Контакты Arduino Uno для шины I2C |
|
|
|
|
|
|
|
|
|
|
||
Аналоговый вывод Arduino |
Вывод I2C |
|
|
|
|
|
|
|
|
|
|
|
A2 |
GND |
|
|
|
|
|
|
|
|
|
|
|
A3 |
PWR |
|
|
|
|
|
|
|
|
|
|
|
A4 |
SDA |
|
|
|
|
|
|
|
|
|
|
|
A5 |
SCL |
|
|
|
|
|
|
|
|
|
|
|
Найдите контакты A2,A3,A4 и A5 на Arduino Uno, а затем подклю- чите к ним штекерные соединительные провода, как показано на рис. 8.7.
Рис.8.7.Аналоговые контакты расположены в правом нижнем углу Arduino Uno
Затем найдите контакты GND (–), PWR (+), SDA (d) и SCL (c) на све- тодиоде BlinkM, проверив метку в верхней части каждого ряда кон- тактов, как показано на рис. 8.8.
Теперь используйте макетную плату для подключения светодиода BlinkM и кабелей к соответствующим контактам платы Arduino, опи- раясь на данные табл. 8.4.
SPI И I2C 237
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.8.8.Контакты BlinkM GND,PWR,data и clock четко обозначены
Таблица 8.4.Подключения Arduino/BlinkM
Вывод Arduino Uno |
Вывод BlinkM RGB LED |
||
A2 |
(GND) |
PWR– |
|
A3 |
(PWR) |
→ PWR + |
|
|
|
→ |
|
A4 |
(SDA) |
|
→d (данные) |
A5 |
(SCL) |
|
→c (тактовые импульсы) |
На рис. 8.9 показаны эти соединения.
Рис.8.9.Мы можем соединить SDA и SCL без использования внешних резисторов, потому что выводы Arduino имеют встроенные резисторы
238 Глава 8
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Если у вас более одного периферийного устройства I C,подключите |
|
|
|
|
|
|
|||||
2 |
w Click |
|
|
|
|
|
|
m |
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
их к одним и тем же линиям SDA и SCL. Выберите одну соединительd-f-x chan |
.c |
|
|||||||||
|
|
. |
|
|
|
|
|
|
|||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
ную линейку макетной платы для линии SDA и другую для линии SCL; затем подключите устройства к этим линиям.Например,рис.8.10 по- казывает два подключенных светодиода BlinkM. Светодиоды BlinkM одноготипа по умолчанию имеютодин итотже адрес I2C (0x09),кото- рыйявляетсяпрограммируемым,какуказановтехническомописании продукта,доступном по адресу https://www.infinite-electronic.kr/datasheet/ e0-COM-09000.pdf.(Этопоказывает,почемувсегданеобходимосверять- ся стаблицей данных при наличиитаковой; информация,которую вы найдете,можетсэкономитьвашиусилияпореверс-инжинирингу.При исследовании «черного ящика» наобум вам может и не повезти.)
Рис.8.10.Шина I2C поддерживает до 128 периферийных устройств с 7-битными адресами
Послеподключенияконтроллера(Arduino)ипериферийногоустрой- ства (светодиод BlinkM) запрограммируйте Arduino на подключение кшинеI2Cиотправкунекоторыхкомандпериферийнымустройствам. Мы будем использовать Arduino IDE для написания программы. Смо- тритеглаву7дляознакомлениясArduino,атакжеинструкциипоуста- новке. В среде IDE выберите плату Arduino, которую вы используете, нажав Tools > Board > Arduino/Genuino UNO (Инструменты > Плата > Arduino/Genuino Uno),а затем загрузите код из листинга 8.1.
Листинг 8.1. Код контроллера I2C, который будет управлять светодиодом BlinkM RGB
#include <Wire.h>
void setup() {
pinMode(13, OUTPUT); //Отключить встроенный светодиод Arduino pinMode(A3, OUTPUT); //Настроить вывод A3 как выход
SPI И I2C 239
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
pinMode(A2, OUTPUT); //Настроить A2 как выход digitalWrite(A3, HIGH); //A3 в качестве источника питания digitalWrite(A2, LOW); //A2 в качестве GND
Wire.begin(); // Использовать шину I2C в роли контроллера
}
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
byte x = 0;
void loop() {
Wire.beginTransmission(0x09);
Wire.write('c');
Wire.write(0xff);
Wire.write(0xc4);
Wire.endTransmission();
x++;
delay(5000);
}
Код настраивает контакты Arduino для связи по протоколу I2C , подключаетсяк шинеI2Cвкачествеконтроллераи,используяцикл, периодически отправляет сообщение периферийным устройствам с адресом 0x09 . Код сообщения содержит команды для включения светодиодов .Более подробные описания этих команд можно найти вспецификацииBlinkM.Наконец,кодотправляетпоследовательность STOP, чтобы указать конец сообщения . Теперь подключите Ardui- no Uno к компьютеру и загрузите свой код. Светодиоды BlinkM RGB должныполучатькомандыимигатьвсоответствиисними(рис.8.11).
Рис.8.11.Светодиоды BlinkM получают сигналы через I2C от Arduino Uno
240 Глава 8
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
|
F |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
||
|
|
P |
D |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
NOW! |
r |
||||||
|
|
|
|
|
|
|
BUY |
|
|
||||
2 |
C с помощью Bus Pirate |
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w |
|
|
|
|
|
|
|
|
|
m |
|||
Атака на I |
w Click |
|
|
|
|
|
|
o |
|||||
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
|
|
p |
df |
|
|
|
|
e |
|
||
|
|
|
|
|
|
|
g |
|
|
|
|||
|
|
|
|
|
|
|
n |
|
|
|
|
||
|
|
|
|
|
|
-x cha |
|
|
|
|
|
Давайте подключим Bus Pirate к нашей шине I2C и начнем прослуши- вать коммуникации.
Прошивка Bus Pirate имеет встроенную поддержку I2C.В немтакже есть несколько полезных макросов, которые мы можем использовать для анализа и атаки I2C-коммуникаций. Мы будем использовать сле- дующие выводы на Bus Pirate: COPI (MOSI), которые соответствуют выводу I2C SDA; CLK, который соответствует контакту SCL; и GND. Подключите эти три линии от Bus Pirate к шине I2C (табл. 8.5) с помо- щью соединительных кабелей.
Таблица 8.5.Подключения между Bus Pirate и шиной I2C
Bus Pirate / Макетная→ плата
COPI→(MOSI) SDA
CLK →SCL
GND GND
После того как все контакты будут подключены, подключите Bus Pirate к компьютеру. Чтобы взаимодействовать с Bus Pirate, вам не- обходимо подключиться к порту последовательной связи (COM), ис- пользуяскоростьпоумолчанию115200бод.ВLinuxсделайтеэтоспо- мощью утилит screen или minicom:
$ screen /dev/ttyUSB0 115200
В Windows откройте Диспетчер устройств, чтобы увидеть номер
COM-порта.
Затем используйте PuTTY с конфигурацией, показанной на рис. 8.12.
После настройки параметров порта в PuTTY нажмите Open (От- крыть). Теперь у вас должно быть установлено соединение.
Обнаружение устройств I2C
Чтобы перечислить все устройства I2C, подключенные к шине, ис- пользуйте библиотеку I2C Bus Pirate для поиска по всему адресному пространству. Это дает все подключенные микросхемы I2C, а также недокументированные адреса доступа. Начнем с настройки режима Bus Pirate с помощью команды m:
I2C >m
1.HiZ
2.1-WIRE
3.UART
4.I2C
5.SPI
6.2WIRE
SPI И I2C 241
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
7.3WIRE
8.LCD
9.DIO
x. exit(without change)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.8.12.Настройка PuTTY для подключения к Bus Pirate
Выберите 4, чтобы выбрать режим I2C, а затем установите желае- мую скорость:
(1)>4
Set speed:
1.~5KHz
2.~50KHz
3.~100KHz
4.~400KHz
(1)>4 Ready
Мы устанавливаем скорость4,что соответствуетпримерно 400 кГц, или быстродействию I2C, потому что на этой скорости работает конт роллер Arduino Uno. Библиотека I2C поддерживает два макроса. Пер- вый – макрос поиска адреса, который автоматически пробует каждый адрес I2C. Затем он ищет ответ, чтобы определить, сколько перифе- рийных устройств подключено и можете ли вы использовать какие-
242 Глава 8
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
либо другие адреса, например широковещательные. Выполните мак |
|
|
|
|
|
m |
|||||
|
w Click |
|
|
|
|
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
рос, введя макрокоманду (1): |
|
w |
|
df-x chan |
|
o |
|
||||
|
. |
.c |
|
||||||||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
I2C >(1)
Searching I2C address space. Found devices at: 0x00(0x00 W) 0xFF(0x7F R)
Этот макрос отображает адреса, за которыми следует 7-битный адрес с битом, указывающим, предназначен ли адрес для чтения или записи.Вэтомслучаемывидимадреса0x00(W),широковещательный адрес BlinkM и адрес 0x7F, который принадлежит светодиоду BlinkM.
Анализ и отправка сообщений
Второй макрос, встроенный в библиотеку Bus Pirate I 2C, – это сниф- фер. Он отображает все последовательности START/STOP, биты ACK/ NACK и данные,совместно используемые через SPI и I2C 205 по шине I2C.Ещераз,намнужноперевестиBusPirateврежимI2C,выбратьско- рость, а затем выполнить макрос номер два, используя команду (2):
I2C >(2)
Sniffer
Any key to exit [0x12][0x12+0x63+]][0x12+0x63+0xFF+0xC4+][0x12+0x63+]][0x12+0x63+]] [0x12+0x63+]][0x12+0x63+]][0x12+0x63+0xFF+0xC4+][0x12+0x63+0xFF+0xC4+] [0x12+0xC6-0xFD-][0x12+0x63+0xFF+]]
Захваченные данные отображаются на экране в формате сообще- ния Bus Pirate для I2C, что позволяет нам скопировать и вставить со- общение, чтобы воспроизвести его при желании. В табл. 8.6 показан синтаксис, используемый Bus Pirate для представления символов I2C.
Таблица 8.6.Символы Bus Pirate,соответствующие компонентам сообщений I2C
Обозначения I2C |
Обозначения Bus Pirate |
Последовательность START |
[ или { |
Последовательность STOP |
] или } |
ACK |
+ |
NACK |
– |
Убедитесь, что ваш сниффер работает правильно, сопоставив дан- ные сниффера с данными, отправленными Arduino Uno.
Теперь, чтобы отправить данные на любое из периферийных устройств на шине, введите сообщение непосредственно в пригла- шении Bus Pirate или скопируйте любое сообщение, которое хотите воспроизвести. Мы можем увидеть структуру команд для изменения цвета в трафике I2C и, просмотрев техническое описание светодиода,
SPI И I2C 243