2008-06-02

Формат Zip

Для создания архивов пришлось реверснуть формат Zip :) Никаких сложностей не вызвало - только вот, к сожалению, в отличие от рара (там где формат и алгоритмы кодирования заголовков прописаны в документации) значение некоторых полей непросто угадать. Да и не требовалось пока. Целью данного исследования стали архивы avvdat-xxx.zip с обновлениями мкафи. Внутри файл с текстом лицензии на 4 килобайта и три файла avv*.dat положенных без сжатия (ибо шифр не ксор как было раньше - хоть немного, но они тогда жались - теперь файлы реальный мусор). Надо всего лишь скачать заголовки файлов - можно обойтись одной tcp сессией менее полукилобайта.

Качаем Range: -22, Получаем - размер файла и адрес заголовка. (22 байта)
Качаем Range: заголовок. Получаем список и адреса заголовков (около 200 байт).
Качаем Range: 0-74,ххх-ууу,ааа-ббб - (ещё 200 байт).

Собираем вместе заголовки (которые придут нам в chunked-encoding) и файлы - проверяем сумму. Проблема в том, что сумма есть внутри зашифрованного каба. Ну cabextract то в никсах есть - но вот расшифровать без вайна (не реверся алгоритм) не получится. Опять хостинг в пролёте.

Кстати, хостинг переехал на 6 фряху :) а то задолбали своей 4.11 - ничё не пускалось. Теперь 7zip должен ожить. Да. Вот интересно, а если солид архивы рара содержат один и тот же файл в начале.. Обновления консультанта можно было бы ещё уменьшить :)

Обновления переехали на шахту. Небольшая доработка скрипта McUpdate, parse, Delta.ini - и ещё один скрипт на шахте - пересчёта контрольных сумм файлов.
Придумать бы как заставить апдейтера скушать gem файл.. хм.

3 комментария:

Gimly комментирует...

Кстати - совершенно не обязателен пункт 2.. Если размер заголовка примерно известен, то можно сразу скачать последний кусок (байт так на 285 как у меня сейчас) - тогда траффику уменьшется как раз на 500-200 байт - заголовки-ответы второй части..

Интересно, для битторрента можно сделать такую хитрую докачку :)
И вообще регет надо глянуть - он кажется всё это должен уметь..

Gimly комментирует...

И по поводу обновлений консультанта.
Ну сделал я сборку солид архивов рара..
Только не помогло оно. Добрые люди из консультанта умудряются разные CONS#DD0000#0000.ANS пихать в одно обновление. То есть у одного архива - этот файл один, у другого другой.. Архивов штук 5 - так там обязательно парочка разных этих файлов будет.
Но скрипты забавные - один собирает архивы в одну пачку (может когда пригодится) - другой заменяет повторяющиеся секции на ссылки на предыдущие куски, и третий - меняет эти ссылки на нормальные куски - так что архив прекрасно кушает штатный архиватор.

Мне же помогло то, что архиватор P7Zip - таки скомпилился на 6 фряхе хостинга - и там успешно теперь работает..

Gimly комментирует...

С недавнего времени (с месяц назад) сей механизьм обновлений приказал долго жить.
Небольшое исследование показало, что теперь файлы avv*.dat которые получаются после инкрементальных апдейтов не совпадают с теми же файлами avv*.dat, идущими в архивах zip.. В смысле у них даже размер разный. Чё может быть за фигня непонятно. Мкафи после обновлений не ругаются на имеющиеся файлы - и замечательно обновляются до той-же версии что с файлами из архива, что с файлами инкрементально эволюционировавшими.
Правда сравнения до и после обновлений этих разных версий я не проводил.. :(