Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Запись в архивы RAR5 без помощи архиватора

23.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня я расскажу, как можно добавить какой-нибудь файл в архив формата RAR5 без использования программ-архиваторов. Что это такое и для чего вообще надо, об этом можно почитать в предыдущих статьях.

Формат RAR5 появился с выходом 5-й версии архиватора WinRAR. Он очень сильно отличается от старого формата архивов RAR, изменились структуры заголовков, появились дополнительные поля, некоторые поля вовсе исчезли, превратившись в самостоятельные блоки данных. Одним из главных нововведений, которое приходится учитывать, это появление данных так называемого формата vint - "variable length integer". Это последовательности байт заранее неизвестной длины в количестве от 1 до 10, чего достаточно для манипуляций с 64-битными числами. Как написано в документации, если понадобится, то максимальная длина последовательностей может быть увеличена. Каждый байт последовательности vint имеет только 7 младших значащих битов, старший 8-й бит является информационным. Если он равен 1, то требуется обрабатывать следующий байт последовательности, если 0, то это последний байт данных в текущей последовательности. Оставшиеся значащие биты слепляются в полноценные байты, из которых формируется итоговое целочисленное значение.

100011010 01011011 => 000001101 01011011
В некоторых случаях я могу оправдать такой подход, например, размер файла может быть как несколько терабайт, так и несколько байт, длина vint-последовательности для хранения таких значений будет разной. Хотя и тут можно поспорить, я не думаю, что размер бытовых файлов не поместится в 64-битное число, а для архивирования петабайт данных этих ваших интернетов наверняка есть какие-то более другие решения. Если взять всякую мелочевку типа флагов, идентификатора заголовка, атрибутов файла и подобного, почему нельзя было оставить фиксированные значения? Вряд ли автор совершит столь большие прорывы в разработке WinRAR, что понадобится QWORD для флагов или WORD для типов заголовков. А в документации сплошь и рядом поля формата vint. Но это создает проблемы в основном при чтении имеющегося архива, тогда как при записи можно позволить себе определенные упрощения, зафиксировав размер некоторых полей.

Читать статью целиком »
Просмотров: 630 | Комментариев: 2

Как сделать, чтобы окно WinRAR закрывалось по Esc

29.08.2016 | Категория: Software | Автор: ManHunter

Как сделать, чтобы окно WinRAR закрывалось по Esc

Всем хорош архиватор WinRAR, но есть у него один недостаток. Этот недостаток заключается в том, что главное окно GUI-версии архиватора закрывается только по Alt-F4 или по нажатию на крестик. Очень неудобно, тем более, что архиватор не является программой, которая постоянно должна быть на экране. Отработал задачу - завершил работу. Автора уже просили сделать опциональным закрытие по Esc, но Евгений эту просьбу проигнорировал. Придется нам самим избавляться от этого неудобства.

Читать статью целиком »
Просмотров: 4588 | Комментариев: 22

Запись в архивы SAR, PRS и CAR без помощи архиватора

11.02.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
В предыдущих трех частях цикла статей о записи информации в архивы различных форматов без помощи архиваторов были рассмотрены как популярные форматы, так и более редкие. Настало время совсем экзотических архиваторов, результатов работы которых вы вообще нигде не встретите. Поэтому разбор их внутренних форматов можно рассматривать исключительно как разминку для ума, никакой практической пользы от этих исследований ждать не надо. Тем более, что документации по некоторым архиваторам нет, все данные пришлось получать на основании готовых архивов.

Первый и самый простой из виденных архивов - SAR, сокращенное название от "Streamline Arching Utility" производства компании Streamline Design. Единственная существующая версия датируется 1993 годом. Файлы в архиве предваряются небольшим заголовком, общего заголовка архива нет, признак завершения архива - нулевой байт вместо следующего заголовка.
  1. ;---------------------------------------------
  2. ; SAR Header
  3. ;---------------------------------------------
  4. shlen   db      ?         ; Header length
  5. shcrc   db      ?         ; CRC of header
  6. smeth   rb      5         ; Compression method (' LH0 ' = store)
  7. sosize  dd      ?         ; Original file size
  8. scsize  dd      ?         ; Compressed file size
  9.         db      ?         ; unknown
  10.         db      ?         ; unknown
  11.         db      ?         ; unknown
  12.         db      ?         ; unknown
  13. sunkn1  db      ?         ; File attribute? (20h)
  14. sunkn2  db      ?         ; unknown (01h)
  15. slen    db      ?         ; Filename size
  16. sfname  rb      (?)       ; Filename (ASCII)
  17. sfcrc   dw      ?         ; 16-bit CRC
  18. sunkn3  db      ?         ; unknown (20h)
  19.         db      ?         ; unknown
  20. shend   db      ?         ; unknown
Мнемокода "(?)" в FASM нет, просто таким образом я обозначил текстовую строку для записи имени файла неопределенной длины. В реальном проекте будет достаточно MAX_PATH или вообще фиксированного размера.
  1. ; Признак окончания архива - нулевой байт
  2. tail    db      0
  3. tail_length   = $-tail 
Некоторые поля мне не удалось идентифицировать, в заголовке они отмечены комментарием "unknown", они должны быть заполнены нулевыми значениями, если не указано другого.

Читать статью целиком »
Просмотров: 5309 | Комментариев: 12

Запись в архивы ACE, HA и LIM без помощи архиватора

22.04.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Предлагаю вашему вниманию третью, заключительную (надеюсь) статью про запись в архивы различных форматов без помощи архиваторов. Напомню, что в первой части были описаны наиболее популярные архиваторы, во второй части я начал рассказывать про более редкие и экзотические архиваторы, сейчас тему экзотики продолжу, а закончу исследования в четвертой части. Как и в предыдущей статье, к каждому примеру приложен сам архиватор и описание внутреннего формата его архивов, чтобы вам не пришлось их искать.

Начну с формата ACE. Это сравнительно свеженький продукт, по крайней мере есть версия под Windows, а сайт датирован 2000-м годом. Разработчики утверждают, что по степени сжатия чуть ли не превосходят архиватор RAR. Однако, в дикой природе я пока что не встречал чего-либо, упакованного этим архиватором, поэтому он и попал в категорию экзотических. Но внутренний формат архивных файлов .ACE очень простой. Не используются никакие "хвосты" в конце архива, есть только главный заголовок архива, после которого идут подряд упакованные файлы с заголовками. Формат заголовка следующий:
  1. ;---------------------------------------------
  2. ; ACE Header
  3. ;---------------------------------------------
  4. ahcrc   dw      ?                       ; CRC32x of the header
  5. ahsize  dw      ?                       ; Size of the header
  6. ahtype  db      ?                       ; Header type (01 = files)
  7. aflags  dw      ?                       ; Header flags (8001h)
  8. acsize  dd      ?                       ; Compressed file size
  9. aosize  dd      ?                       ; Original file size
  10. adtm    dd      ?                       ; Date/Time
  11. aattr   dd      ?                       ; File attributes
  12. afcrc   dd      ?                       ; CRC32x of the file
  13. ainfo   dd      ?                       ; Type and quality of compression
  14. ares    dw      ?                       ; Unknown
  15. aflen   dw      ?                       ; Filename size
  16. afname  rb      (?)                     ; Filename (ASCII)
Архиватор ACE поддерживает длинные имена файлов Windows, поэтому поле для хранения имени файла afname обозначено уже знакомым вам мнемокодом (?), то есть текстовая строка неопределенной длины. В нашем случае хватит MAX_PATH или другой фиксированной длины.

Читать статью целиком »
Просмотров: 6648 | Комментариев: 18

Запись в архивы ARC, ZOO и LHZ без помощи архиватора

20.02.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
В первой части статьи о записи в архивы без помощи архиваторов я разобрал внутренний формат наиболее популярных современных архиваторов. Как я понял, особого интереса статья не вызвала, но материал на новую статью уже был практически подготовлен. Не пропадать же добру. В этой части я расскажу о том, как внедряться в более редкие форматы архивов: ARC, ZOO и LHZ без использования сторонних приложений. Поскольку такие раритеты найти уже проблематично, к каждому примеру я приложил сам архиватор и описание внутреннего формата его архивов. Ну а совсем экзотические архиваторы рассмотрены в третьей и четвертой частях статьи.

ARC - формат архивов одноименного архиватора от компании System Enhancement Associates, который был достаточно широко распространен в 80-90-х годах прошлого века. Примечательно, что параметры его командной строки в последующем стали эталоном практически для всех других архиваторов с их появления и до нашего времени. Этот же формат архивов (но с расширением .PAK) также имеет архиватор PAK. Сейчас для операционных систем Windows появился архиватор FreeArc, который создает архивы с таким же расширением .ARC, но они имеют другой формат. Здесь я рассмотрю именно старый, DOS'овский формат архивов ARC.
  1. ;---------------------------------------------
  2. ; ARC/PAK Header
  3. ;---------------------------------------------
  4. csig    db      ?                       ; Sign
  5. cmeth   db      ?                       ; Compression method (2 = store)
  6. cfname  rb      13                      ; 12 char File name ASCIIZ
  7. ccsize  dd      ?                       ; Compressed file size
  8. cdtm    dd      ?                       ; Date/Time
  9. cfcrc   dw      ?                       ; 16-bit CRC
  10. cosize  dd      ?                       ; Original file size
Обратите внимание, что поле для хранения имени файла имеет фиксированный размер 13 символов (формат имени 8.3 + нулевой символ). Когда создавался этот архиватор, про длинные имена файлов никто даже не мечтал.
  1. ; Признак окончание архива
  2. tail    db      1Ah,00
  3. tail_length   = $-tail
Признаком окончания архива является двухбайтовый "хвост", который записан после последнего файла. Больше никаких особенностей нет, формат очень простой, многотомные архивы, блокировки от изменений и прочие новомодные штучки не поддерживаются, поэтому процесс внедрения также очень простой.

Читать статью целиком »
Просмотров: 8306 | Комментариев: 4

prev 01 02
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 3 (0.0016 сек.) / Память: 4.5 Mb
Наверх