Qt4: декомпиляция файла ресурсов rcc
Некоторое время ковырял файл ресурсов, получаемого с помощью компилятора ресурсов rcc (Qt4). При помощи исходников компилятора удалось восстановил для себя структуру файла, может быть кому-то понадобится.
Заголовок файла содержит 4 байта ключа 'qres', какое-то число (версия?) и смещения на сегменты данных data_blobs, имён data_names и структуры data_struct:
Сегменты идут подряд, ссылки на начало сегмента абсолютные от начала файла.
В сегменте data_structure каждая запись длиной 14 байт и содержит в себе dword относительное смещение на имя файла в сегменте имён (data_names) и флаги (is_directory или is_compressed). Если элемент является директорией ,- указано количество элементов в папке и смещение на первый вложенный элемент (child), если обычный,- вместо количества элементов стоят признаки локали(страны) и языка элемента (word+word), за которыми следует смещение на данные элемента.
В сегменте имён первые 2 байта,- длина соответствующего элемента в байтах, начиная со следующего байта.
В сегменте data_blobs'ов аналогично,- первое слово,- длина содержимого, за которым следует содержимое. Содержимое может быть упаковано (на это указывает флаг is_compressed в сегменте data_structure), в таком случае после 2-х байт длины ещё 2-байта,- предполагаемая длина распакованного содержимого, остальное,- сжатое с помощью zlib содержимое файла.
Заголовок файла содержит 4 байта ключа 'qres', какое-то число (версия?) и смещения на сегменты данных data_blobs, имён data_names и структуры data_struct:
// Qt4 RCC file struct
struct RCC_SIGNATURE { /* 12 bytes total */
Char[4] 'qres'
double version?;
double offset_segment_data_struct;
double offset_segment_data_blobs;
double offset_segment_data_names;
}
Сегменты идут подряд, ссылки на начало сегмента абсолютные от начала файла.
В сегменте data_structure каждая запись длиной 14 байт и содержит в себе dword относительное смещение на имя файла в сегменте имён (data_names) и флаги (is_directory или is_compressed). Если элемент является директорией ,- указано количество элементов в папке и смещение на первый вложенный элемент (child), если обычный,- вместо количества элементов стоят признаки локали(страны) и языка элемента (word+word), за которыми следует смещение на данные элемента.
struct RCC_ITEM_DIRECTORY { /* 14 byte's total */
double name_offset;
word flags;
double children_size;
double children_offset;
}
struct RCC_ITEM_FILE { /* 14 byte's total */
double name_offset;
word flags;
word country_code;
word locale_language;
double data_offset;
}
В сегменте имён первые 2 байта,- длина соответствующего элемента в байтах, начиная со следующего байта.
В сегменте data_blobs'ов аналогично,- первое слово,- длина содержимого, за которым следует содержимое. Содержимое может быть упаковано (на это указывает флаг is_compressed в сегменте data_structure), в таком случае после 2-х байт длины ещё 2-байта,- предполагаемая длина распакованного содержимого, остальное,- сжатое с помощью zlib содержимое файла.
Тоже понадобилось распаковать/декомпилировать ресурсы от qt. Но я пошёл другим путём: перекомпилировал сам компилятор rcc добавив к нему функцию декомпиляции. Вот тут можно найти этот перекомпилированный вариант: http://forum.vingrad.ru/forum/topic-318045.html
ОтветитьУдалитьХорошая работа, вероятно, поскольку ресурс требует регистрации для скачки файла, а мне не хочется регистрироваться ;-)
ОтветитьУдалитьУ Вас есть статистика,- сколько раз файл загружали? Интересно, насколько вообще востребована функция распаковки rcc?
Не знаю, что имел ввиду автор, но на самом деле структуры должны быть такими:
ОтветитьУдалитьstruct RCC_SIGNATURE { /* 20 bytes total */
signature char [4]; // 'qres'
unsigned int version;
unsigned int offset_segment_data_struct;
unsigned int offset_segment_data_blobs;
unsigned int offset_segment_data_names;
}
struct RCC_ITEM_DIRECTORY { /* 14 byte's total */
unsigned int name_offset;
unsigned short flags;
unsigned int children_size;
unsigned int children_offset;
}
struct RCC_ITEM_FILE { /* 14 byte's total */
unsigned int name_offset;
unsigned short flags;
unsigned short country_code;
unsigned short locale_language;
unsigned int data_offset;
}
Еще одна утилита для декопиляции rcc файла: http://radialix.ru/index.php/resource-tools-overview/239-rtrccdecompiler (из набора Resource Tools, платный, но на самом деле нет никаких ограничений и можно пользоваться без регистрации)
Там же есть шаблонный редактор для локализации RCС файлов: http://radialix.ru/index.php/forum/6-Обсуждение/1047-Re-Помогите-локализовать-файл?limit=10&start=30#1359