Утилита-распаковщик звуковых файлов автомобильных ГУ

Вчера ко мне обратился один человек, который при помощи написанной мной несколько лет назад консольной программы 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).

Если есть вопросы, дополнения или просьбы — пишите в комментариях. Даже если эта программа просто вам пригодилась — отпишитесь, я буду знать, что делал её не зря.

Share

Михаил Соколов

Автор - Соколов Михаил Борисович, город Киров. Эколог, работаю в химической лаборатории областного природоохранного центра. Фото и видео, если не указано иное, сняты мною. При использовании фото в интернете обязательно указание авторства и активной ссылки на этот сайт. Условия использования в печатной продукции можете узнать, связавшись со мной одним из способов, указанных в разделе «Контакты». Для некоммерческих и бесплатных проектов обычно разрешаю безвозмездное использование фото.

Также может быть интересно...

1 ответ

  1. xor:

    Пригодится вам https://kaitai.io/ отличный генератор бинарных парсеров на основе описания структруры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *