Qt4: декомпиляция файла ресурсов rcc

Некоторое время ковырял файл ресурсов, получаемого с помощью компилятора ресурсов rcc (Qt4). При помощи исходников компилятора удалось восстановил для себя структуру файла, может быть кому-то понадобится.



Заголовок файла содержит 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 содержимое файла.

Комментарии

  1. Тоже понадобилось распаковать/декомпилировать ресурсы от qt. Но я пошёл другим путём: перекомпилировал сам компилятор rcc добавив к нему функцию декомпиляции. Вот тут можно найти этот перекомпилированный вариант: http://forum.vingrad.ru/forum/topic-318045.html

    ОтветитьУдалить
  2. Хорошая работа, вероятно, поскольку ресурс требует регистрации для скачки файла, а мне не хочется регистрироваться ;-)
    У Вас есть статистика,- сколько раз файл загружали? Интересно, насколько вообще востребована функция распаковки rcc?

    ОтветитьУдалить
  3. Не знаю, что имел ввиду автор, но на самом деле структуры должны быть такими:
    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

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения