Вчера ко мне обратился один человек, который при помощи написанной мной несколько лет назад консольной программы scan пытался научить ГУ автомобиля разговаривать по-русски. Потратив некоторое время, я написал программу для распаковки и сборки обратно звукового файла из прошивки ГУ.
Сначала немного о самой программе Scan. Страшно подумать, она написана уже больше 10 лет назад! Эта консольная утилита умеет находить в составных файлах-контейнерах и извлекать внедренные в них файлы, находя их положение, размер и некоторые прочие характеристики по специфическим маркерам-идентификаторам, распознавая большое количество популярных в то время форматов файлов.
Обратившийся ко мне человек при помощи Scan обнаружил в файле-контейнере из прошивки для ГУ автомобиля KIA Sorento множество звуковых wav-файлов голосовых команд, и показал мне для этот файл. Имея многолетний опыт в распознавании формата и структуры файла «на глаз» (большая часть форматов в Scan была добавлена не по документации а на основе реверс-инженеринга доступных файлов), мне не составило труда определить структуру файлов прошивки, чуть больше времени ушло на написание программы для распаковки и обратной сборки. Формат у них такой:
Два файла — PROMPT.INDEX и PROMPT.CONTENTS. В *.INDEX-файле, как несложно догадаться находятся имена и индексы (смещения) звуковых файлов, которые хранятся в *.CONTENTS-файле, где просто следуют один за другим без всяких разделителей. Структура индексного файла такова: он состоит из 40-байтных записей, каждая из которых имеет следующую структуру:
байты 00..31
— дополненный в конце нулями идентификатор файла, например 5778, 9872, BEEP или EXIT.байты 32..35
— DWORD смещение положения данных от начала *.CONTENTS-файла. Интеловский little-endian порядок байтов.байты 36..39
— DWORD длина порции данных (и соответственно размер wav-файла)
*.INDEX-файл полностью состоит из таких записей от начала до конца без каких-либо заголовков или контроля целостности (соответственно, размер его кратен 40 байтам).
Имея эти данные, написать программу было делом техники. Вот так выглядит её окно:
В качестве исходных данных указываем путь до *.CONTENTS— и *.INDEX-файлов, и путь до папки с распакованными файлами. При нажатии на кнопку «Распаковать» все содержимое контейнера распаковывается в указанную папку, а идентификаторы преобразуются в имена файлов добавлением расширения wav. При нажатии на кнопку «Запаковать», как можно догадаться, процесс обратный — составляется список *.wav-файлов в указанной папке, сортируется, и из них собираются индексный и *.CONTENTS-файлы.
Так как программа писалась на скорую руку, есть некоторые ограничения — подразумевается что размер единичного wav-файла такой, что он может целиком поместиться в оперативную память компьютера. Вероятно, имеются и какие-либо ошибки, которые я мог не заметить. Какая же ранняя версия программы без ошибок? 😉
Скачать распаковщик можно здесь: unpacker.exe (прямая ссылка, 51 Кб, под Windows).
Если есть вопросы, дополнения или просьбы — пишите в комментариях. Даже если эта программа просто вам пригодилась — отпишитесь, я буду знать, что делал её не зря.
Пригодится вам https://kaitai.io/ отличный генератор бинарных парсеров на основе описания структруры