Самому стала интересна последовательность работ. Попробую описать.
1. Взять дизассемблер для AVR-микроконтроллера. Я использую ReAVR.
2. Дизассемблируем прошивку, т.е. получаем ассемблерную программу. В уме отмечаем, что косяков при дизассемблировании может быть куча, т.к. прошивка содержит и коды команд, и данные.
3. По электрической принципиальной схеме (благо она есть в протеусе) определяем кодировку символов.
бит 0 - это сегмент H (точка)
бит 1 - сегмент С
бит 2 - сегмент G
бит 3 - сегмент D
бит 4 - сегмент E
бит 5 - сегмент А
бит 6 - сегмент F
бит 7 - сегмент В
4. Программа выводит в бегущей строке первый символ P. Индикатор с общим катодом. Стало быть, чтобы высветить этот символ, нужно подать "1" на сегменты A,B,E,F и G. Подставим "1" на свои места в байте кодировки. Получается байт 11110100 или F4 в шестнадцатеричной системе.
5. Таким же образом находим буквы u, t для верности. Это 1A и 5D.
6. Ныряем в программу и ищем число F4, помятуя, что этот код длжен быть отправлен в порт через пересылку через регистр. А вот какой и как - тут самая интересная задача.
7. Ищем.
8. Перекур.
9. Ищем.
10. Перекур.
11. Ищем.
12. О, находим нечто похожее:
- Код:
L01F1:
cpi r30,k05
ldi r26,k00
cpc r31,r26
brne L01F7
; ----- branch on last line
ldi r30,k6E
rjmp L0575
13. Проанализировав этот кусок и иже с ним, видим, что это подпрограмма, начинающаяся с адреса L01D5. И в ней идет перекодировка содержимого регистра R30. Чтобы получить на выходе наш 6Е, на входе должна быть 05 и т.д.
14. Составляем таблицу перекодировки. Проверяем её по нашим P, u, t.
Спойлер
Кодировка символов (прошивка, сегменты - отображение):
00 (FA) - цифра 0
01 (82) - цифра 1
02 (BC) - цифра 2
03 (AE) - цифра 3
04 (C6) - цифра 4
05 (6E) - цифра 5
06 (7E) - цифра 6
07 (A2) - цифра 7
08 (FE) - цифра 8
09 (EE) - цифра 9
0A (04) - символ -, минус
0B (00) - символ пробел
0C (1E) - символ нижний квадрат
0D (10) - символ прописная i
0E (14) - символ прописная r
0F (5C) - символ прописная t
10 (F6) - символ заглавная А
11 (1A) - символ прописная u
12 (16) - символ прописная n
13 (74) - символ заглавная F
14 (9E) - символ прописная d
...
17 (F4) - символ заглавная Р
...
19 (1C) - символ прописная с
1A (58) - символ заглавная L
1B (78) - символ заглавная С
...
1D (E4) - символ верхний квадрат
...
22 (D6) - символ заглавная Н
23 (5E) - символ прописная b
24 (7A) - символ заглавная G
25 (DA) - символ заглавная U15. Ищем в прошивке последовательность 17110F, т.е. Put, памятуя, что строчка может иметь разрыв на байт контрольной суммы.
16. Жуткое везение - строчка целиком находится по адресу :10002600 в прошивке
17. Для себя отмечаем, что всё красиво, строка выводимых символов находится в начале прошивки/программы, как и подобает.
18. Проверяем рядом расположенные байты.
19. Ха! Обе строки здесь сидят. Первая 0C0D0E0B2510 - автор, вторая 17110F0D1A
:10003600120A22110D1A0C (вместе с контрольным байтом и адресом) - наша искомая.
20. Текс, таблица кодировки есть (п.14), нужный текст (Hi) есть. Осталось вбить в прошивку на место нужной строки. Что и делаем.
21. Осталось подкорректировать контрольные суммы. Можно пересчитать лапками, а можно запустить в протеусе - он сам всё просчитает и выдаст в виде ошибки - мол, ожидалась такая-то сумма, а обнаружилась такая-то. Корректируем.
22. Загоняем прошивку в протеус и смотрим. Радуемся.
23. Отправляем заказчику на тест.
24. Получаем положительную оценку.
25. Фуф.
Конечно, в описании опущены многие моменты, но суть отражена. И это только для случая, если программист не предпринял специальные приёмы защиты своего кода. Коих (я ещё со спектрума начинал) туева хуча.
Надеюсь, сейчас вы сможете попробовать вбить свою строку или совсем избавиться от неё, т.е. забить всё пробелами.