Какова байтовая подпись ZIP-файла, защищенного паролем?

Я читал, что ZIP-файлы начинаются со следующих байтов:

50 4B 03 04

Ссылка: http://www.garykessler.net/library/file_sigs.html

Вопрос: Существует ли определенная последовательность байтов, указывающая на то, что ZIP-файл защищен паролем?


person frankadelic    schedule 28.09.2009    source источник


Ответы (3)


Неправда, что ZIP-файлы должны начинаться с

50 4B 03 04

Записи в zip-файлах начинаются с 50 4B 03 04... ..и часто чистые zip-файлы начинаются с zip-записи как первой вещи в файле. Но нет необходимости, чтобы zip-файлы начинались с этих байтов. Все файлы, начинающиеся с этих байтов, вероятно являются zip-файлами, но не все zip-файлы начинаются с этих байтов.

Например, вы можете создать самораспаковывающийся архив, представляющий собой PE-COFF-файл, обычный EXE-файл, в котором на самом деле есть подпись для файла, а именно 4D 5A .... Затем, позже в exe-файле, вы можете хранить zip-записи, начинающиеся с 50 4B 03 04.... Файл является как .exe, так и .zip.

Самораспаковывающийся архив — не единственный класс zip-файлов, который не начинается с 50 4B 03 04. Таким образом вы можете «скрыть» произвольные данные в zip-файле. WinZip и другие инструменты не должны иметь проблем с чтением zip-файла, отформатированного таким образом.

Если вы найдете подпись 50 4B 03 04 в файле, либо в начале файла, либо где-то еще, вы можете просмотреть следующие несколько байтов, чтобы определить, зашифрована ли эта конкретная запись. Обычно это выглядит примерно так:

50 4B 03 04 14 00 01 00 08 00 ... 

Первые четыре байта являются входной подписью. Следующие два байта — это «версия, необходимая для извлечения». В данном случае это 0x0014, что равно 20. Согласно спецификации pkware, это означает, что для извлечения записи требуется версия 2.0 спецификации pkzip. (Последняя «функция» zip, используемая записью, описана в версии 2.0 спецификации). Вы можете найти там более высокие числа, если в zip-файле используются более продвинутые функции. Для шифрования AES требуется версия 5.1 спецификации, поэтому в этом заголовке вы должны найти 0x0033. (Не все zip-инструменты учитывают это).

Следующие 2 байта представляют битовый флаг общего назначения (в спецификации он называется «битовым флагом», хотя это битовое поле), в данном случае 0x0001. У него установлен бит 0, что указывает на то, что запись зашифрована.

Другие биты в этом битовом флаге имеют значение и также могут быть установлены. Например, бит 6 указывает на то, что использовалось сильное шифрование — либо AES, либо другое более сильное шифрование. Бит 11 говорит, что запись использует кодировку UTF-8 для имени файла и комментария.

Вся эта информация доступна в спецификации PKWare AppNote.txt.

person Cheeso    schedule 29.09.2009
comment
Хммм... Я хотел реализовать несколько простых C# IsZipFile(pathToFile) и IsPasswordProtectedZipFile(pathToFile). Я предполагал, что пароль применяется ко всему архиву. - person frankadelic; 01.10.2009
comment
Пароль обычно не применяется ко всему файлу, хотя существует такая вещь, как шифрование центрального каталога, определенное спецификацией, что близко к применению пароля ко всему архиву. Немногие инструменты поддерживают эту функцию. Можно создать метод IsZipFile() — вы сканируете до конца и ищете zip-каталог. IsPasswordProtected() аналогична, за исключением того, что вам нужно проверить наличие центрального каталога, а также проверить, защищены ли какие-либо записи. - person Cheeso; 01.10.2009
comment
Что ж, если у вас есть самораспаковывающийся архив, у вас технически больше нет ZIP-файла, у вас есть исполняемый файл PE. Какие части он содержит внутри, является дополнительной информацией. Например, исполняемый файл может быть установщиком, может быть самораспаковывающимся архивом, может быть обычной точкой входа в основную программу, может быть лаунчером, но все это просто отдельная таксономия, не связанная с типом рассматриваемого файла. - person hijarian; 25.09.2014

Это базовые файлы в zip-архиве, защищенные паролем. Вы можете иметь ряд защищенных паролем и незащищенных паролем файлов в архиве (например, файл readme, а затем его содержимое).

person Petesh    schedule 28.09.2009

Если вы перейдете по ссылкам, описывающим ZIP-файлы, в URL-адресе, на который вы ссылаетесь, вы обнаружите, что вот этот обсуждает бит, который указывает, зашифрован ли файл в ZIP-архиве или нет. Кажется, что каждый файл в архиве может быть независимо зашифрован или нет.

person Jonathan Leffler    schedule 29.09.2009