Инструкция
...во глубине сибирских руд
(А.С. Пушкин)
Введение. Про метод мозгового штурма.
Иногда бывает полезно, когда другие люди оценивают со стороны про ваши действия. Так и произошло на этот раз. В общем, мне намекнули ещё раз, что неплохо бы оживить старые легенды.
Проблема.
Есть векторный шрифт в цветных приборах, а его нет в чёрно-белых , допустим в легендах. Почему? Потому, что возникали (некие) проблемы при вставке этого русифицированного шрифта. Производитель сэкономил памяти (1 кб) и не дорисовал верхнюю таблицу (т.е. символы национальных алфавитов вовсе должны были бы не рисоваться, даже для Европы), тем более, не было маленьких строчных букв. Шрифт из цветных приборов имеет верхнюю таблицу, но и занимает памяти побольше.
Итак...
Смотрим.
Поступаем с файлом по пункам Дня 1. Вкратце - используя gunp получаем кучу
ресурсов на файле от легенды. Картинки нас пока не интересуют (хотя неплохо
было бы иметь что-то в стиле XP или MacOS на пиктограммах), текст тоже, шрифты
- с ними и так всё понятно. Хм. Но тогда что же, спросите вы. Аха! Читайте
внимательнее указания. Есть такой магический файл ew (мне просто удобно его
так называть, у вас он может называться как обзовёте). Открываем файл в обычном
текстовом редакторе и начинаем изучать.
Firmware image at 0000A684h
refStart = 0011CD04h
fwOffset = 02004000h
String Segment at offset 00080C4Ch
String Segment at segment 0207A5C8h
String Reference at offset 0011CD08h
String Reference at address 02116684h
Looking for fonts
Found2
....
Первая строчка - означает начало бинарного кода, который будет прошит в прибор
(начало файла rgn составляют служебные заголовки, загрузчик)
refStart - хм...
fwOffset - а вот это уже весьма интересная информация. Это тот начальный адрес, по которому и будет прошит бинарный код. При распаковке этот бинарный код называется fw_all.bin.
Открываем файл fw_all.bin и ищем в hex данных 24 00 00 ... 24 ... - это шрифт. Находим смещение относительно начала файла этой строки. Допустим, это A4780
Предполагаем, что компилятор расставляет "дальние" ссылки на объекты (почему - тут помогает космический разум обычно). Ещё вспоминаем из школьной азбуки "младшее по младшему адресу" - это принцип хранения информации длиннее одного байта на PC. (опять разум, догадки)
Из дальних ссылок будет следовать длина pointer: 4 байта.
из хранения - обратный порядок байт.
Что сие означает?
Сейчас, сейчас...
Вызываем калькулятор. В hex считаем сумму 02004000 и A4780 = 020A8780
Выписываем отдельно : 80 87 0A 02
Ищем в fw_all.bin в hex режиме эти выписанные данные. Нашлось, и причём ОДИН раз! И вдобавок рядом лежат данные похожего вида. Вот и всё. Указатель на векторный шрифт найден.
Смотрим по-другому.
Это для тех, кто дизассемблировал fw_all.bin. Хотя, они наверняка читать это
не будут :) Думаю, эти они знают, что означает 01 01 ... 01 01 04. Для остальных
поясняю - это магическая таблица описания типа шрифта. (шрифт бывает двух типов
- векторный и растровый, нам для вставки большого векторного шрифта нужен векторный).
Беда в том, что в прошивке это встречается более чем один раз. Как найти? Опять
же, интуитивно. (подсказка: рядом с этой таблицей обычно лежит искомая таблица
на указатели шрифтов) Однако, здесь уже не так важно первоначальное значение
fwOffset - его легко определить потом.
Т.е. где-то лежать будет что-то подобное
80 87 0A 02 01 01 01 01 ... 01 01 04 (угадайте, чем определяется количество
01?)
(* как выяснилось позднее, 04 иногда бывает и 05 :))
Делаем.
Чтобы вместить векторный шрифт с полной таблицей требуется 2.7 кб памяти. Прежний векторный шрифт занимает 1.6 кб. Соответственно, не влазит. Но указатель на векторный шрифт был найден. Почему бы его не указать в другое место?
Какое?
Проще всего указать его куда-нибудь внутрь прошивки (т.е. файла fw_all.bin). Что же поддаётся к освобождению места? Текст! Итак, берём любой непонравившийся нам текст (я предпочёл польский - не судите), убираем в нём все пробелы, буквы а, о, и уже можно жить - в упакованном виде он меньше на несколько кб.
Открываем в hex редакторе файл .rgn
Вставляем урезанный текстовый ресурс.
Вставляем при помощи hex редактора (или другим способом) векторный шрифт с русской таблицей в образовавшуюся нишу.
Снова напускаем gunp на полученный файл. Получаем новый fw_all.bin - теперь надо найти смещение в этом файле для нашего вставленного шрифта. Допустим, это 60A40.
Складываем 02004000 и 60A40.
Выписываем в обратном порядке.
Идём к месту, которое нашли на первом этапе.
Заменяем 4 байта нашими выписанными.
------
Далее можно вставлять текстовый ресурс (рус) и остальные шрифты, считать CRC
и
Прошивать.
Естественно, что описанная методика не совсем правильная по сути. Осуществляется замена, а не вставка. Вставка подразумевает увеличение размера rgn файла, коррекцию заголовков, констант длины. Сложнее? Но зато интереснее. Попробуйте сделать, может получится?
Опять же, возможен вариант убирания языков - достаточно изменить одну константу и последний язык можно использовать под свои нужды.
Заключение.
Метод справедлив для легенды (висты), 76, 76s. Возможно, что emap.
Получается испорченным один язык, но зато есть векторный русский шрифт. Вот
так.
Удачи всем!
Adrenalin
(при написании статьи ни одного прибора не пострадало)