Запись в архивы SAR, PRS и CAR без помощи архиватора
В предыдущих трех частях цикла статей о записи информации в архивы различных форматов без помощи архиваторов были рассмотрены как популярные форматы, так и более редкие. Настало время совсем экзотических архиваторов, результатов работы которых вы вообще нигде не встретите. Поэтому разбор их внутренних форматов можно рассматривать исключительно как разминку для ума, никакой практической пользы от этих исследований ждать не надо. Тем более, что документации по некоторым архиваторам нет, все данные пришлось получать на основании готовых архивов.Первый и самый простой из виденных архивов - SAR, сокращенное название от "Streamline Arching Utility" производства компании Streamline Design. Единственная существующая версия датируется 1993 годом. Файлы в архиве предваряются небольшим заголовком, общего заголовка архива нет, признак завершения архива - нулевой байт вместо следующего заголовка.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; SAR Header
- ;---------------------------------------------
- shlen db ? ; Header length
- shcrc db ? ; CRC of header
- smeth rb 5 ; Compression method (' LH0 ' = store)
- sosize dd ? ; Original file size
- scsize dd ? ; Compressed file size
- db ? ; unknown
- db ? ; unknown
- db ? ; unknown
- db ? ; unknown
- sunkn1 db ? ; File attribute? (20h)
- sunkn2 db ? ; unknown (01h)
- slen db ? ; Filename size
- sfname rb (?) ; Filename (ASCII)
- sfcrc dw ? ; 16-bit CRC
- sunkn3 db ? ; unknown (20h)
- db ? ; unknown
- shend db ? ; unknown
Code (Assembler) : Убрать нумерацию
- ; Признак окончания архива - нулевой байт
- tail db 0
- tail_length = $-tail
Записываемый файл предварительно надо загрузить в память, после этого заполняем поля заголовка архива:
- shlen = длина заголовка архива от поля smeth до shend включительно;
- shcrc = контрольная сумма заголовка;
- smeth = строка " LH0 ";
- sosize = размер оригинального файла;
- scsize = размер сжатого файла (равен оригинальному);
- sunkn1 = 20h (неизвестное поле);
- sunkn2 = 01h (неизвестное поле);
- slen = длина имени файла;
- sfname = имя файла;
- sfcrc = CRC16 оригинального файла;
- sunkn3 = 20h (неизвестное поле);
После заполнения всех полей заголовка устанавливаем указатель на один байт от конца архивного файла, чтобы затереть существующий "хвост". Записываем сформированный заголовок, после него записываем наш файл и признак завершения архива в виде одного нулевого байта. Все, с внедрением в файлы .SAR разобрались.
PRS - формат архиватора PRESS отечественной разработки от Екатеринбургского СКБ "Контур". Единственная найденная в интернете версия датируется 1995 годом. Очень интересная разработка с неплохой степенью сжатия, возможностью создания многотомных архивов, обновлением файлов в архиве (например, для инкрементальных бэкапов) и многими другими полезными функциями. Хороший потенциал, но история распорядилась иначе. По всей видимости, этот архиватор так и остался для внутреннего использования в компании, не получив широкого распространения. Формат архивов на первый взгляд мне показался несложным, но потом пришлось провести несколько дней, медитируя на отладчик и дизассемблерный листинг, пока не удалось выяснить назначение и формат всех необходимых полей.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; PRS Header
- ;---------------------------------------------
- psign dd ? ; Signature ('GW',0,0)
- posize dd ? ; Original file size
- db ? ; unknown
- plen db ? ; Filename size
- db ? ; unknown
- db ? ; unknown
- pmeth dw ? ; Compression method (0 = store)
- pattr db ? ; File attribute
- pdtm dd ? ; Date/Time
- pcsize dd ? ; Compressed file size
- pfname rb (?) ; Filename (ASCII)
- pcrc1 dw ? ; CRC of header
Code (Assembler) : Убрать нумерацию
- pfcrc dd ? ; 32-bit CRC of file
- pcrc2 dw ? ; CRC of header +8000h
- psign = сигнатура заголовка файла "GW" и два нулевых байта;
- posize = размер оригинального файла;
- plen = длина имени файла;
- pmeth = метод сжатия (0 = store);
- pattr = атрибуты файла;
- pdtm = дата и время создания файла;
- pcsize = размер сжатого файла (равен оригинальному);
- pfname = имя файла;
- pcrc1 = CRC заголовка;
- pfcrc = CRC32 оригинального файла;
- pcrc2 = CRC заголовка и признак окончания архива
После заполнения всех полей заголовка устанавливаем указатель на один байт от конца архивного файла. В нем записан старший байт контрольной суммы заголовка предыдущего файла в архиве, и, чтобы не было ошибок целостности структуры, надо его откорректировать, уменьшив значение на 80h. После этого последний файл оригинального архива становится не последним, а последним будет наш файл. Далее в конец исправленного архива записываем первый сформированный заголовок, после него записываем наш файл и второй заголовок с признаком окончания архива. С внедрением в файлы формата .PRS тоже разобрались.
CAR, название которого происходит от двух слов "Compression/ARchive", - коммерческий архиватор, разработанный в 1996 году компанией MylesHi! Software. Как признаются сами разработчики, алгоритм архиватора повторяет алгоритм работы архиватора LHA, но часть служебных полей в заголовке архива изменены. Из-за этого программы, поддерживающие формат архивов LHA, почти успешно пытаются открыть архивы формата CAR, но просмотреть содержимое и извлечь файлы не могут. Зато в комплекте с архиватором идет подробная инструкция, в которой описан формат и значения всех полей заголовка архива. Было бы глупо не воспользоваться таким подарком.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; CAR Header
- ;---------------------------------------------
- csize db ? ; Header size
- chcrc db ? ; Header CRC
- cmeth rb 5 ; Packing method '-lh0-' = store
- ccsize dd ? ; Compressed file size
- cosize dd ? ; Original file size
- cnlen db ? ; Filename length
- cfname rb (?) ; Filename (ASCII)
- cfcrc dw ? ; File CRC16
- cflag dw ? ; File attribute
- cdtm dd ? ; Time/Date
- cres1 db ? ; Reserved 1 (20h)
- cres2 dw ? ; Reserved 2
Code (Assembler) : Убрать нумерацию
- ; Признак окончания архива - нулевой байт
- tail db 0
- tail_length = $-tail
- csize = размер заголовка от cmeth до cres2 включительно;
- cmeth = строка "-lh0-" - метод компрессии Store;
- cosize = размер оригинального файла;
- ccsize = размер сжатого файла (равен оригинальному);
- cdtm = дата и время создания файла;
- clflag = 20h - атрибуты файла;
- cnlen = длина имени файла с расширением;
- cfname = имя файла;
- cfcrc = CRC16 оригинального файла;
- cres1 = 20h - какое-то служебное поле;
После заполнения заголовка надо переместить указатель на 1 байт от конца файла, чтобы удалить существующий "хвост" архива. После этого записываем сформированный заголовок, за ним внедряемый файл и "хвост" архива, состоящий из нулевого символа. Как видите, работа с архивами .CAR мало чем отличается от внедрения в архивы .LZH и его аналогов.
В приложении примеры программ с исходными текстами, демонстрирующие все три описанных способа записи в архивы. При каждом запуске программа дописывает себя к архиву "example" соответствующего формата, выбирая случайное имя исполняемого файла.
Просмотров: 5246 | Комментариев: 12
Метки: Assembler, архиваторы
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Yellow
(17.04.2015 в 23:28):
Я так понимаю, речь всё-таки идёт о "rb (?)" а не просто о "(?)", что в fasm преспокойно существует. А то, что именно Вы этим обозначили, в данном случае не имеет значения. Ничего личного, просто попытался уточнить.
ManHunter
(17.04.2015 в 08:44):
Yellow
(16.04.2015 в 23:38):
А что значит "Мнемокода (?) в FASM нет"? Т.е. нельзя написать, к примеру:
db 12 dup (?)
? Да запросто можно, FASM без проблем "съест". Или Вы о чём-то другом?
db 12 dup (?)
? Да запросто можно, FASM без проблем "съест". Или Вы о чём-то другом?
brute
(11.02.2015 в 12:38):
Намек понял! Полезная вещь!!!
ManHunter
(11.02.2015 в 10:40):
В первой части все подробно расписано, что это такое и для чего нужно.
brute
(11.02.2015 в 09:26):
я правильно понял, что "программа дописывает себя к архиву "example"" без сжатия? То есть, имеется возможность просто записать в УЖЕ существующий архив? И, при необходимости, "извлечь" только наш неупакованный файл из архива. А самих алгоритмов сжатия\разжатия здесь нет.
п.с. просто думаю, где это можно использовать..
п.с. просто думаю, где это можно использовать..
ЖК
(11.02.2015 в 05:10):
Годная статья, хороший пример разбора заголовков различных форматов.
Зато прочитав про PRESS, подумалось, что в 90-х очень уж в России любили заниматься архиваторостроением =) А ведь до PRESS уже был RAR, а до RAR - BSA (1991 год), а до BSA - ChArc (1990 год). И все наши, отечественные.
Зато прочитав про PRESS, подумалось, что в 90-х очень уж в России любили заниматься архиваторостроением =) А ведь до PRESS уже был RAR, а до RAR - BSA (1991 год), а до BSA - ChArc (1990 год). И все наши, отечественные.
Doxtur
(10.02.2015 в 18:40):
Ну вот и весна пришла)))
ManHunter
(10.02.2015 в 18:15):
Наверное человек увидел незнакомые слова, испугался.
Vladimir
(10.02.2015 в 17:30):
Откуда в комментариях к узкоспециальным статьям берутся идиоты...
Спасибо, ManHunter, за любопытные статьи.
Спасибо, ManHunter, за любопытные статьи.
ManHunter
(10.02.2015 в 13:52):
Не пиши больше ничего, не надо.
flawiimark
(10.02.2015 в 12:56):
Я считаю, что эти архивы SAR, PRS и CAR не принадлежат к управлению информацией, а вдруг они опасны, тогда можно и с компьютером попрощаться, поэтому прошу удалить этот пост, спасибо.
Добавить комментарий
Заполните форму для добавления комментария