Адреса -dbgbase либо посмотреть в документации, либо сделать так: подключиться с каким попало конфигом, прочитать ROM table командой dap info, найти в ней интересующие ядра. Кусочек ROM table процессора из примера выше:
...
[L01] ROMTABLE[0x4] = 0x10003
Component base address 0xf4310000
Peripheral ID 0x04001bbc05
Designer is 0x4bb, ARM Ltd.
Part is 0xc05, Cortex-A5 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
...
[L01] ROMTABLE[0x1c] = 0x20003
Component base address 0xf4320000
Peripheral ID 0x04004bbc15
Designer is 0x4bb, ARM Ltd.
Part is 0xc15, Cortex-R5 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
Через SWD видится (в том числе и) отладочная шина APB, выглядящая как отдельная 32-битная шина памяти, через которую видны компоненты CoreSight — доступ к ядрам (останов/пуск/шаг/регистры), точки останова, буферы трассировки итд. Каждое ядро представлено блоком регистров по отдельному адресу на APB, в конфиге OpenOCD нужно для каждого интересующего ядра задать этот APB-адрес (сами адреса узнаются из ROM Table, видимой на той же APB, в ней начальные адреса всех компонентов и их типы). Позже с рабочей машины допишу точный пример конфига, не помню синтаксис из головы.
Идея со связью через сектора, кстати, живее всех живых — т.н. SmartSD карты. В с виду нормальную MicroSD дополнительно встроен чипик смарт карты с доступом через первый сектор файла с определённым именем (там всё чуть продвинутее — номер сектора не фиксирован, а выясняется встроенным контроллером через разбор FAT, т.е. форматирование не портит, создали снова файл с нужным именем и работаем).
А сами мы как-то к IDE порту подключали devboard USB хоста ISP1161. У него как раз параллельная 16-битная шина была, а ISA уже отмерла. Windows 9x, прямой доступ к I/O с помощью giveio.sys, и всё, кроме прерывания, заработало.
Сталь там никелированная, паяется она на ура. Сам не сторонник пайки (купить/собрать сварку и делать всё по уму нынче не проблема), но чужой повидал немало, ни один автор ещё не пострадал. В запущенных случаях страдала ёмкость (сепаратор местно нагрелся до запуска в нём защитных процессов — закрытия «пор», сделав невозможным обмен ионами в части рулона).
А общая «по отрасли» (хоббийно вращаюсь в группах по тюнингу электросамокатов) статистика вообще веселит:
ни одного возгорания 18650 (а чего только с ними не делали некоторые товарищи)
несколько возгораний самих BMS (пробои, перегревы при больших, но рабочих токах)
целая гора безнадёжно испорченных полным разрядом ячеек опять таки из-за проблем в BMS (привет, Xiaomi)
поддельные TP4056 (они вроде вообще все уже поддельные, оригинал снят с производства) с разнообразными отклонениями (не защищают, не ограничивают, не прекращают)
Главный факт о местном рынке: Nemame radi platit :)
Местный партнёр, далеко не бедный человек, с грустью признавался, что убив пол дня на поиск товара на пол евро дешевле, чувствует удовлетворение.
Да, но как это спасёт от атаки из статьи? Там проблема вообще не в стойкости алгоритма ключей, это по сути «удлинитель» канала связи машина-брелок — атакующий заставил брелок в кармане владельца выдать ему очередной разовый ключ и отправил его машине. Вычислялся этот ключ, или был взят из «одноразового шифроблокнота», роли не играет. Тут нужно что-то делать с протоколом взаимодействия машина-брелок, например чувствительность к задержкам вводить.
Так в статье и не взламывали сам алгоритм вычисления ключа, а получали доступ к его исполнению и брали результат. С тем же успехом можно было бы получить и следующий одноразовый ключ.
Как-то разбирался с лидаром пылесоса с картинки. Мотор программно остановить не проблема (он там управляется внешне по отношению к лидару), однако лидар в таком случае данные выдавать перестаёт (в нём самом есть датчик вращения). "Учёные" видимо подавали импульсы, имитирующие вращение.
Предвидя возможный вопрос "а нельзя ли как-то перепрограммировать лидар чтобы он работал без вращения?" — нельзя, связь с ним — однонаправленная.
В рамках одного большого проекта по пересборке дизассемблированного кода получился вот такой эксперимент:
прошивку размером порядка 28КБ, изначально собранную неизвестной версией IAR, отдизассемблировали в большой монолитный asm и «доработали напильником» до сборки средствами gcc/ac5/ac6/свежего IAR байт в байт (само собой, под каждый компилятор выходной файл генерировался специфическим для него способом, синтаксис разный, особенно у IAR)
затем из получившегося asm полностью выкорчевали STM32 SPL, объявили всё пропавшее как extern и включили в сборку исходники SPL.
собрали каждым компилятором (уже как asm + C, SPL компилировалась из С, а остальное было неизменным из asm, включая стандартную библиотеку, стартовый код и упакованную секцию данных)
Результаты были такие: свежий IAR выдал ещё немного меньший код, чем оригинал, а остальные в старые размеры не поместились несмотря ни на какие игры с настройками.
Помнится, у IAR был как-то отдельно включаемый агрессивный multi-file compilation режим, рассматривающий все файлы проекта как единое целое и инлайнящий всё и вся.
Вдогонку: можно и кнопку опросить в startup вообще до всего и заснуть назад, не тратя электроэнергию (оно же наверное от батареи, судя по L серии и сну?) на полноценную инициализацию, если срабатывание было ложным. Насколько понимаю (конкретно с STM32L4 не знаком), раз пин кнопки в состоянии пробуждать, то он и во сне остаётся настроен в нужном направлении и как-то тактируется, т.е. можно сразу смотреть его состояние в регистре ввода.
Как-то встречались реализации копирования /заполнения через LDM/STM именно в стартовом коде, причём без проверок на некратные размеры, что и логично — в отличие от «нормальных» memcpy/memset, эти размеры известны уже на этапе компоновки и можно выбрать наиболее эффективные реализации (и вот кстати, например у IAR этот код вынесен в отдельные модули и компоновщик может выбрать из нескольких вариантов, например с RLE-сжатием .data — это ещё поднимет скорость, т.к. чтений памяти будет меньше).
С нехорошим стартовым кодом от авторов IDE тоже сталкивались, у Keil ещё на AT91SAM7 в их «готовой» инициализации PLL был race condition, когда одной записью в регистр параллельно включался осциллятор и тут же на него переключались — у нас всё работало, а уже после массовых продаж у некоторых клиентов вылезли безнадёжно глухие зависания прямо на старте (такие что и JTAG не работал, а куда ему?).
Непременно нужно именно написание кода в UI части? Предполагаются какие-то динамические действия, которые нужно описывать именно как алгоритмы, причём настолько уникальные от объекта к объекту, что их не заложить готовыми в библиотеку самой SCADA?
Так то и в обсуждаемой статье ни слова о программировании, она больше о дизайне, и где-то там основная проблема и кроется — дизайн UI возлагают на тех же людей, кто программировал PLC ("они ж лучше знают что там внутри"), а им после месяцев глядения в технологическую схему ничего другого уже не видится — получаем "чёрно-зелёную консоль всевластия".
Насчёт разделения управления и индикации — обеими руками за. Периодически общаемся с другом детства, ушедшим в "умные дома" — постоянно мат и жалобы на нестабильность работы новомодных "хабов", по сути совмещающих в себе PLC и web UI (да ещё и в виде какой-нибудь Raspberry внутри DIN-коробочки) — ребята, извините, но у Honeywell и для "гражданских" зданий PLC выглядели как нечто на RTOS, с интерфейсными цепями на керамике, и работало оно так, что на очередном техобслуживании разблокируешь панель и видишь то самое подменю, в котором оставил систему квартал назад. А на отдельном SCADA PC скучающие операторы тем временем втихаря от начальства в Doom играть могли.
Что за место такое страшное? Не Торревьеха часом? :)
Каждое "тухлое" железо/софт имеет автора — forward инженера :)
Обещанный пример:
Адреса -dbgbase либо посмотреть в документации, либо сделать так: подключиться с каким попало конфигом, прочитать ROM table командой dap info, найти в ней интересующие ядра. Кусочек ROM table процессора из примера выше:
Через SWD видится (в том числе и) отладочная шина APB, выглядящая как отдельная 32-битная шина памяти, через которую видны компоненты CoreSight — доступ к ядрам (останов/пуск/шаг/регистры), точки останова, буферы трассировки итд. Каждое ядро представлено блоком регистров по отдельному адресу на APB, в конфиге OpenOCD нужно для каждого интересующего ядра задать этот APB-адрес (сами адреса узнаются из ROM Table, видимой на той же APB, в ней начальные адреса всех компонентов и их типы). Позже с рабочей машины допишу точный пример конфига, не помню синтаксис из головы.
Зачем роутеры? На Али сейчас управляющие платы майнеров на Xilinx Zynq по 12€ распродают :)
Идея со связью через сектора, кстати, живее всех живых — т.н. SmartSD карты. В с виду нормальную MicroSD дополнительно встроен чипик смарт карты с доступом через первый сектор файла с определённым именем (там всё чуть продвинутее — номер сектора не фиксирован, а выясняется встроенным контроллером через разбор FAT, т.е. форматирование не портит, создали снова файл с нужным именем и работаем).
А сами мы как-то к IDE порту подключали devboard USB хоста ISP1161. У него как раз параллельная 16-битная шина была, а ISA уже отмерла. Windows 9x, прямой доступ к I/O с помощью giveio.sys, и всё, кроме прерывания, заработало.
С вашей железкой так и ещё более дерзкое устроить поди можно — запустить линукс прямо в отображённой памяти хоста :)
Сталь там никелированная, паяется она на ура. Сам не сторонник пайки (купить/собрать сварку и делать всё по уму нынче не проблема), но чужой повидал немало, ни один автор ещё не пострадал. В запущенных случаях страдала ёмкость (сепаратор местно нагрелся до запуска в нём защитных процессов — закрытия «пор», сделав невозможным обмен ионами в части рулона).
А общая «по отрасли» (хоббийно вращаюсь в группах по тюнингу электросамокатов) статистика вообще веселит:
Главный факт о местном рынке: Nemame radi platit :)
Местный партнёр, далеко не бедный человек, с грустью признавался, что убив пол дня на поиск товара на пол евро дешевле, чувствует удовлетворение.
А мне "Битва" Шекли вспомнилась — роботы-солдаты выигрывают за людей Армагеддон и, внезапно, возносятся.
Да, но как это спасёт от атаки из статьи? Там проблема вообще не в стойкости алгоритма ключей, это по сути «удлинитель» канала связи машина-брелок — атакующий заставил брелок в кармане владельца выдать ему очередной разовый ключ и отправил его машине. Вычислялся этот ключ, или был взят из «одноразового шифроблокнота», роли не играет. Тут нужно что-то делать с протоколом взаимодействия машина-брелок, например чувствительность к задержкам вводить.
Так в статье и не взламывали сам алгоритм вычисления ключа, а получали доступ к его исполнению и брали результат. С тем же успехом можно было бы получить и следующий одноразовый ключ.
Как-то разбирался с лидаром пылесоса с картинки. Мотор программно остановить не проблема (он там управляется внешне по отношению к лидару), однако лидар в таком случае данные выдавать перестаёт (в нём самом есть датчик вращения). "Учёные" видимо подавали импульсы, имитирующие вращение.
Предвидя возможный вопрос "а нельзя ли как-то перепрограммировать лидар чтобы он работал без вращения?" — нельзя, связь с ним — однонаправленная.
В Британии при Тэтчер так и было (poll tax).
В рамках одного большого проекта по пересборке дизассемблированного кода получился вот такой эксперимент:
Результаты были такие: свежий IAR выдал ещё немного меньший код, чем оригинал, а остальные в старые размеры не поместились несмотря ни на какие игры с настройками.
Подтверждаю, причём алгоритм тот же, самодельный скрипт для IDA Pro распаковывает данные от обоих компиляторов.
Помнится, у IAR был как-то отдельно включаемый агрессивный multi-file compilation режим, рассматривающий все файлы проекта как единое целое и инлайнящий всё и вся.
Вдогонку: можно и кнопку опросить в startup вообще до всего и заснуть назад, не тратя электроэнергию (оно же наверное от батареи, судя по L серии и сну?) на полноценную инициализацию, если срабатывание было ложным. Насколько понимаю (конкретно с STM32L4 не знаком), раз пин кнопки в состоянии пробуждать, то он и во сне остаётся настроен в нужном направлении и как-то тактируется, т.е. можно сразу смотреть его состояние в регистре ввода.
Как-то встречались реализации копирования /заполнения через LDM/STM именно в стартовом коде, причём без проверок на некратные размеры, что и логично — в отличие от «нормальных» memcpy/memset, эти размеры известны уже на этапе компоновки и можно выбрать наиболее эффективные реализации (и вот кстати, например у IAR этот код вынесен в отдельные модули и компоновщик может выбрать из нескольких вариантов, например с RLE-сжатием .data — это ещё поднимет скорость, т.к. чтений памяти будет меньше).
С нехорошим стартовым кодом от авторов IDE тоже сталкивались, у Keil ещё на AT91SAM7 в их «готовой» инициализации PLL был race condition, когда одной записью в регистр параллельно включался осциллятор и тут же на него переключались — у нас всё работало, а уже после массовых продаж у некоторых клиентов вылезли безнадёжно глухие зависания прямо на старте (такие что и JTAG не работал, а куда ему?).
Непременно нужно именно написание кода в UI части? Предполагаются какие-то динамические действия, которые нужно описывать именно как алгоритмы, причём настолько уникальные от объекта к объекту, что их не заложить готовыми в библиотеку самой SCADA?
Так то и в обсуждаемой статье ни слова о программировании, она больше о дизайне, и где-то там основная проблема и кроется — дизайн UI возлагают на тех же людей, кто программировал PLC ("они ж лучше знают что там внутри"), а им после месяцев глядения в технологическую схему ничего другого уже не видится — получаем "чёрно-зелёную консоль всевластия".
Насчёт разделения управления и индикации — обеими руками за. Периодически общаемся с другом детства, ушедшим в "умные дома" — постоянно мат и жалобы на нестабильность работы новомодных "хабов", по сути совмещающих в себе PLC и web UI (да ещё и в виде какой-нибудь Raspberry внутри DIN-коробочки) — ребята, извините, но у Honeywell и для "гражданских" зданий PLC выглядели как нечто на RTOS, с интерфейсными цепями на керамике, и работало оно так, что на очередном техобслуживании разблокируешь панель и видишь то самое подменю, в котором оставил систему квартал назад. А на отдельном SCADA PC скучающие операторы тем временем втихаря от начальства в Doom играть могли.