Имитатор касаний. Ч2: Железная часть

Вводить руками 10000 вариантов пароля неудобно и долго. Человек часто сбивается и пропускает варианты. Лучше сделать имитатор касаний, который быстренько переберёт все ключи сам. Его можно использовать и для других целей. А ещё это очень весело :)
В этой части выясним направление осей координат и займёмся железом.
❯ Касание цифр ввода пароля 1–9, 0
Для взлома пароля нам нужны координаты цифр.
Посмотрим по порядку все цифры. Координаты будем брать установившиеся (если будут небольшие изменения).
Файлы с записанным обменом можно найти здесь.
Цифра 1.
Пачка 1. Касание.
Ответ на 00
00 00 01 00 7B 01 71 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 80 7B 01 71 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 40 7B 01 71 00
Ответ на 08
00…
Пачки 4 — 8.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 2.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 1A 01 62 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 1A 01 62 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 1A 01 62 00
Ответ на 08
00…
Пачки 4 — 8.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Можно заметить интересную закономерность. Посмотрим на примере цифры 1.
В пачке 1 показано кол-во касаний 1. В третьем байте 01.
0×01=0b0000 0001
0001 — это XH. MSB of Touch X Position in pixels
Два старших бита старшей тетрады 0000 — Event Flag.
00 соответствует «Press Down» — начало касания.

В пачке 2 показано кол-во касаний 1. В третьем байте 81.
0×81=0b1000 0001.
Координаты не изменились, а вот Event Flag стал 10 «Contact» — удержание касания.
В пачке 3 кол-во касаний стало 0. В третьем байте 41. Остальные параметры не изменились.
0×41=0b 0100 0001.
Event Flag стал 01 «Lift Up» — отпускание касания.
Интересно, что касание уже отпущено, но его координаты сохраняются.
И только в следующей пачке №4 параметры касания заменяются значением регистров по умолчанию — FF.
По идее, на этом можно закончить передачу пачек. Ведь касаний-то нет. Но передаётся ещё 3 таких же пачки. То есть всего 8 пачек.
Возникает вопрос: 8 — это минимальное количество пачек, которое нужно передать при одном касании? Проверим это позже.
Цифра 3.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 B4 01 58 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 B4 01 58 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 B4 01 58 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 4.
Пачка 1. Касание.
Ответ на 00
00 00 01 00 85 01 E6 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 80 85 01 E6 00
Ответ на 08
00…
Пачка 3,4. Удержание. (2й раз, т к чуть дёрнули пальцем)
Ответ на 00
00 00 01 80 88 01 E7 00
Ответ на 08
00…
Пачка 5. Удержание. (3й раз, т к чуть дёрнули пальцем)
Ответ на 00
00 00 01 80 88 01 E8 00
Ответ на 08
00…
Пачка 6. Отпускание.
Ответ на 00
00 00 00 40 8B 01 E8 00
Ответ на 08
00…
Пачки 7 — 11. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 5.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 16 01 E9 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 16 01 E9 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 16 01 E9 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 6.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 AA 01 DD 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 AA 01 DD 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 AA 01 DD 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 7.
Пачка 1. Касание.
Ответ на 00
00 00 01 00 83 02 6C 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 80 83 02 6C 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 40 83 02 6C 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 8.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 20 02 5C 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 20 02 5C 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 20 02 5C 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 9.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 AF 02 75 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 B7 02 70 00
Ответ на 08
00…
Пачка 3. Удержание.
Ответ на 00
00 00 01 81 BE 02 6E 00
Ответ на 08
00…
Пачка 4. Удержание.
Ответ на 00
00 00 01 81 C4 02 6B 00
Ответ на 08
00…
Пачка 5. Удержание.
Ответ на 00
00 00 01 81 C2 02 6D 00
Ответ на 08
00…
Пачка 6. Удержание.
Ответ на 00
00 00 01 81 C1 02 6D 00
Ответ на 08
00…
Здесь получилась интересная ситуация. Общение с другим устройством (адреса 4D/4C) по I2C ещё не закончилось, но уже пришло прерывание от контроллера тача, и линия INT стала низкой. Потом закончилось общение с другим устройством и только после этого процессор начал обрабатывать тач.

Пачка 7. Отпускание.
Ответ на 00
00 00 00 41 C1 02 6D 00
Ответ на 08
00…
Пачки 8 — 12. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
Цифра 0.
Пачка 1. Касание.
Ответ на 00
00 00 01 01 1A 02 E1 00
Ответ на 08
00…
Пачка 2. Удержание.
Ответ на 00
00 00 01 81 1A 02 E1 00
Ответ на 08
00…
Пачка 3. Отпускание.
Ответ на 00
00 00 00 41 1A 02 E1 00
Ответ на 08
00…
Пачки 4 — 8. 5 Одинаковых пачек.
Ответ на 00
00 00 00 FF FF FF FF FF
Ответ на 08
FF…
При нажатии цифры 4 пачек больше 8. Скорее всего из-за того, что палец держал чуть дольше и немного сдвигал.
Видимо, минимальное число пачек не 8. Правило другое: пачку после отпускания нужно передать 5 раз.
❯ Выясняем направление осей координат
Прикинем по координатам цифр направление осей.

Разбираем коды цифр по косточкам. Сейчас интересуют копчёные рёбрышки.
Рёбрышки?!

Перерыв на обед… Чтобы мыслить рационально нужно сначала съесть печеньку.)
…
Мы снова здесь.
Ищем координаты касания Х и Y.
Цифра |
Координата Х |
Координата Y |
1 |
07B |
171 |
2 |
11A |
162 |
3 |
1B4 |
158 |
4 |
085 |
1E6 |
5 |
116 |
1E9 |
6 |
1AA |
1DD |
7 |
083 |
26C |
8 |
120 |
25C |
9 |
1BE |
26E |
0 |
11A |
2E1 |

Ещё можно усреднить значения координат. Например, Y у цифр одной строки должна быть одинаковой. Так же и Х у цифр одного столбца.
Цифра |
Координата Х |
Координата Y |
1 |
080 |
162 |
2 |
120 |
162 |
3 |
1B4 |
162 |
4 |
080 |
1E3 |
5 |
120 |
1E3 |
6 |
1B4 |
1E3 |
7 |
080 |
262 |
8 |
120 |
262 |
9 |
1B4 |
262 |
0 |
120 |
2E1 |
Для проверки посмотрим на координаты касания левого верхнего угла. X=082 Y=04С. Согласуется.
❯ Структура имитатора касаний
В смартфоне сенсорная панель (Capacitive Touch Panel) обрабатывается контроллером этой панели, который общается с процессором, сообщая о появлении касания и передавая его параметры.

Чтобы сымитировать касание, приложение с компьютера посылает микроконтроллеру координаты касаний, и он имитирует соответствующее поведение контроллера ёмкостного сенсора, которое мы изучили в процессе обратной разработки ранее.

Оконное приложение интересно попробовать написать на Питоне. Микроконтроллер возьмём STM32 (под рукой есть платы blue pill, WeACT, и другие).
Для автоматического включения смартфона и разблокирования экрана добавим транзистор, который будет замыкать контакты кнопки включения (PWR_KEY).
Для того, чтобы знать текущее состояние телефона и его реакцию на команды, нужны обратные связи:
- Если пароль неверный, то телефон фыркает ☺ (включается вибромотор). Предположительно, если пароль верный, то вибрации не будет. Будем наблюдать за смартфоном во время перебора паролей. Сигнал вибромотора удобно использовать в качестве обратной связи (линия Vibro).
- Сигнал Reset удобно использовать как ОС на команды включения, блокировки телефона.
Признаком включения будем считать изменение Reset с низкого уровня на высокий (нарастающий фронт).

Признаком разблокирования так же выступит нарастающий фронт.

У моторчика 2 провода: + и -. Минус, видимо, подключен не напрямую к земле, так как показывает сопротивление 0.4 Ом. Но это немного. Можно просто снимать сигнал с + мотора относительно земли.
Посмотрим, как подключается вибромотор в схемах телефонов.

Моторчик подключен к микросхеме управления питанием.

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

Самое простое — отключить тач вообще. Если будут два устройства с одинаковым адресом, то они будут мешать друг другу. Процессор ведь знает, по какому адресу контроллер сенсора, по нему и идёт общение.
❯ Согласование логических уровней
Уточним логические уровни контроллера сенсора и процессора телефона.
На линии INT видим 1,62 B. Похоже, уровни 1,6 В. Хотя, может и 1,8 В.

Заодно посмотрим, какого вида сигнал подаётся на вибромотор.
При включении смартфона сигнал длится 50 мс.

Если пароль неверный, то телефон фыркает ☺ (включается вибромотор). Длительность 800 мс, амплитуда 2,8 В — замечательный прямоугольный сигнал.

У нас есть двунаправленные сигналы. Хочется использовать какую-то простую схему. Например, резисторный делитель, который понизит 3,3 В до 1,6 В. В обратную сторону сигналы дойдут без изменения. Но нужно проверить, будет ли достаточно 1,6 В для надёжного формирования логической единички в нашем микроконтроллере.
Смотрим ДШ на мк (STM32F103C8) и находим стандарт, по которому работают порты.
«All I/Os are CMOS and TTL compliant (no software configuration required). Their characteristics cover more than the strict CMOS-technology or TTL parameters. The coverage of these requirements is shown in Figure 26 and Figure 27 for standard I/Os, and in Figure 28 and Figure 29 for 5 V tolerant I/Os.»

При Vdd 2,7 В нам нужно более 1,59 В (лучше с запасом) для формирования логической единички. У нас всего 1,6 В. Мало.
А тут вообще нужно больше двух вольт.
Значит будем делать преобразование уровня 1,6 В в 3,3 В.
Так же смотрим I/O port characteristics на стр. 61
2,8 В достаточно для формирования логической единички, поэтому просто подадим этот сигнал на вывод микроконтроллера.
Есть вариант уменьшить напряжение питания мк Vdd, чтобы снизить минимальное напряжение формирования единицы. Но проще и надёжнее сделать преобразование уровней.
Чтобы решить, по какой схеме будем делать преобразование уровней, нужно чётко выяснить, какие линии двунаправленные, а какие однонаправленные.

Линия INT может использоваться как вход, куда процессор присылает сигнал для выхода из сна. В нашем случае процессор выводит контроллер тача сигналом Reset.
Поэтому линия INT однонаправленная (в данном случае).
Двунаправленная у нас только линия SDA.
Итого, нужно согласовать линии:
- SDA, двунаправленная.
- SCL, RST, однонаправленные, повышение 1,6 –>3,3 В.
- INT, однонаправленная, понижение 3,3–>1,6 В.
Согласовать уровни проще для однонаправленной линии. Но существуют варианты и для двунаправленной.
Есть хорошая статья про согласование логических уровней.
В ней описана двунаправленная схема, прекрасно подходящая для линий с открытым коллектором (стоком) таких как 1-Wire, I2C.

Проблема такой схемы для уровня 1,8 В (у нас по измерениям вообще 1,6 В) в том, что пороговое напряжение открывания транзистора с логическим уровнем 0,8…2 В.
Если развернуть транзистор истоком и затвором на источник с большим напряжением, то внутренний диод всё время будет открыт. Так не пойдёт.
Лучше поставим биполярный транзистор вместо полевого.
Помоделируем схему, чтобы изменить некоторые параметры и лучше её почувствовать. На картинке показано состояние, когда устройство 3,3 В выставило 0.
Резистор подтяжки можно подключить и с эмиттера на + питания, а не на базу. Так тоже работает. В телефоне эта подтяжка, скорее всего, так и подключена. Не будем же мы искать её и переподключать, тем более она может быть внутри микросхемы.
Причём резистор подтяжки можно подключить не к тому плюсу питания, к которому подключено устройство 1,8 В, а к другому. Найти тот самый + мне не удалось, поэтому я подключил к питанию экрана. Главное, чтобы на момент работы I2C это питание уже было включено. С помощью логического анализатора можно убедиться, что это так.
Динамические параметры моделировать не будем, так как в исходной статье автор это уже сделал и фронты имеют хороший вид.
Данная схема безопасна только для выхода с открытым коллектором (стоком). Возможна аварийная ситуация, когда 3,3 В устройство по какой-то причине будет настроено как пуш-пулл выход. Например, ошибки в прошивке или состояние до настройки состояний выводов микроконтроллера. Тогда в 1,8 В устройство вкачается большой ток (более 100 мА) и оно сгорит.
Однонаправленные линии можно согласовать по-разному. Здесь больше свободы. Мне показалось лучше согласовать с помощью микросхем, которые оказались под рукой.
SN74LVC244A можно использовать на понижение. Питаем от 1,6 В. На вход 3,3 В. А вот на повышение не получается, так как нужно питать от 3,3 В, но для формирования лог 1 на выходе при питании 3,3 В нужно на вход подать минимум 2 В.
Для повышения подходит SN74ALVC164245. Раздельные источники питания (А и В) питаем от 1,6 и 3,3 В. Микросхема сдвоенная, поэтому можно использовать и на понижение (направление портов 1 и 2 можно выбирать независимо), стоит недорого. Для прототипа удобно использовать платку универсального преобразователя на SN74ALVC164245, который сделал раньше.

Решение:
SDA через последовательно включённый npn транзистор.
Остальные линии через SN74ALVC164245
Сигнал с вибромотора напрямую к выводу микроконтроллера.
Обязательно оставляем анализатор для отладки, поэтому для имитатора касаний припаяем параллельно ещё одну гребёнку.
Чтобы не забыть, где какой контакт, стоит сделать фото и подписать.
1,8 В возьмём с питания экрана, чтобы не искать, где питание именно линий I2C. Должно работать.
❯ Коротко о главном
Выяснив структуру посылок, отправляемых контроллером сенсорной панели процессору телефона по I2C, в Ч1 цикла статей, мы продолжили обратную разработку. Удалось узнать координаты цифр пароля и направление осей координат.
Далее мы разработали структуру имитатора касаний и выбрали схемы согласования логических уровней микроконтроллера (3,3 В) и процессора телефона (1,6 В).
Чтобы знать текущее состояние телефона и его реакцию на команды, нужны обратные связи:
- Сигнал вибромотора удобно использовать в качестве обратной связи на ввод пароля (линия Vibro).
- Сигнал Reset удобно использовать как ОС на команды включения и блокировки телефона.
Понравился проект, статья — поделитесь впечатлением!
Не стесняйтесь писать комментарии, интересно ваше мнение.
Продолжение следует…)
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩

Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.