[FAQ] GZIP-сжатие модулей с помощью консоли 7z.exe
Сжатие в GZIP с помощью консольных 7-ZIP
Как известно, файлы кастомных прошивок, программ, игр и т.п. пожаты в архивы GZIP. Поэтому часто приходится упаковывать таким образом файлы, чтобы они занимали меньше места, а самое важное то, что после кастомизации часто бывает необходимость вернуть файл на строго определённое место, ограниченное размером, когда нельзя делать сдвиг последующего кода.
Как мы знаем, сжимать в GZIP прекрасно умеет архиватор 7-ZIP. Но его GUI интерфейс имеет скромный потенциал и не позволяет гибко манипулировать сжатием. Зато набор консольных команд того же самого модуля архиватора 7z.exe имеет более расширенный функционал, где мы можем по своему желанию сжать файл до нужного нам размера, выбирая нужные нам параметры сжатия.
Какие параметры командной строки нам даёт архиватор 7-ZIP
7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
[<@listfiles...>]
<Commands>
a: Add files to archive
b: Benchmark
d: Delete files from archive
e: Extract files from archive (without using directory names)
l: List contents of archive
t: Test integrity of archive
u: Update files to archive
x: eXtract files with full paths
<Switches>
-ai[r[-|0]]{@listfile|!wildcard}: Include archives
-ax[r[-|0]]{@listfile|!wildcard}: eXclude archives
-bd: Disable percentage indicator
-i[r[-|0]]{@listfile|!wildcard}: Include filenames
-m{Parameters}: set compression Method
-o{Directory}: set Output directory
-p{Password}: set Password
-r[-|0]: Recurse subdirectories
-scs{UTF-8 | WIN | DOS}: set charset for list files
-sfx[{name}]: Create SFX archive
-si[{name}]: read data from stdin
-slt: show technical information for l (List) command
-so: write data to stdout
-ssc[-]: set sensitive case mode
-ssw: compress shared files
-t{Type}: Set type of archive
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options
-v{Size}[b|k|m|g]: Create volumes
-w[{path}]: assign Work directory. Empty path means a temporary directory
-x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames
-y: assume Yes on all queries
Итак, для выполнения сжатия, из списка команд видно, что нам потребуется <Commands>
a: Add files to archive (Добавить файлы в архив) - буква ы зачёркнута, т.к. в GZIP нельзя архивировать более 1-го файла!
Далее нам нужны будут следующие <Switches>:
-t{Type}: Set type of archive (установить тип архива) - т.к. нас интересует архивирование в GZIP, то и выставляем тип: -tgzip
-m{Parameters}: set compression Method (установка метода сжатия) - для GZIP существует только метод Deflate и только 3 параметра, об этом ниже...
Сразу приведу пример демонстрации сжатия в архив GZIP с максимально возможным набором команд:
7z a -tgzip arhive.gz file.prx -mx=5 -mfb=4 -mpass=2
Разложим команды сжатия по запчастям...
Команда
Описание
7z
соответственно вызов 7z.exe (расширение обычно не пишут в командах вызова)
a
добавить в архив (от слова add), соответственно e - извлечение (Extract)
-tgzip
параметром -t указываем, что архив gzip, иначе, если не указывать, будет 7z.
archive.gz
название будущего архива
file.prx
название архивируемого файла.
-mx=5
параметром -m указываем сжатие и следом x=5 уровень сжатия (от 1 до 9)
-mfb=4
параметром -m указываем сжатие и следом fb=4 число быстрых байтов (от 3 до 258)
-mpass=2
параметром -m указываем сжатие и следом pass=2 число проходов (от 1 до 15)
Теперь более подробнее о параметрах:
GZip использует те же самые параметры как Zip, но GZip сжимает только с методом Deflate.
Таким образом GZip поддерживает только следующие параметры: x, fb, pass.
Параметр
Значение по-умолчанию
Описание
x=[0|1|3|5|7|9]
5
Устанавливает уровень сжатия
fb={NumFastBytes}
32
Устанавливает число быстрых байтов для Deflate кодера
pass={NumPasses}
1
Устанавливает число проходов для Deflate кодера
Разберём из 1-го столбика таблицы эти параметры поподробнее:
x=[0|1|3|5|7|9]
Устанавливает уровень сжатия. x=0 - означает режим Copy (никакого сжатия).
Установки Deflate/Deflate64:
Уровень
Число быстрых байтов
Число проходов
Описание
1
32
1
Самый быстрый
3
Быстрый
5
Нормальный
7
64
3
Максимальный
9
128
10
Ультра
x=1 и x=3 с Deflate методом устанавливают быстрый режим для сжатия.
fb={NumFastBytes}
Установка числа быстрых байтов для Deflate/Deflate64 кодера. Оно может быть в диапазоне от 3 до 258 (257 для Deflate64). Обычно большее число дает немного лучшую степень сжатия и более медленный процесс сжатия. Большие числа параметра быстрых байтов может значительно увеличить степень сжатия в случае, когда файлы содержат длинные идентичные последовательности байтов.
pass={NumPasses}
Установка числа проходов для Deflate кодера. Оно может быть в диапазоне от 1 до 15 для Deflate.
Обычно большее число дает немного лучшую степень сжатия и более медленный процесс сжатия.
P.S. Есть ещё чисто консольная версия 7za.exe (разница видимо только в том, что в ней нету GUI-интерфейса)
Ну и есть другие консольные утилиты именно для gzip.
У меня с б0льшим сжатием, чем дефолтное игра не захотела запускаться
Где-то значит допустил ошибку.
Уж поверь мне, уровень сжатия никак не влияет на запускаемость.
Уже сотни раз пережимал файлы, бывало по максимуму, ни разу такого не было, чтобы что-то не запускалось.
Не запустится может только при не правильной упаковке, проставления размеров.
lupus, как я говорил, уже сотни раз сжимал со всевозможными параметрами сжатия всякие VSH, Recovery и что только ни жал, ни разу такого не было, чтобы GZ вдруг становился не рабочим. Такого никаким образом быть не может. Я просто не пойму, что у тебя, что у lis5131, постоянно что-то не работает, а Лис ваще жал через Гуи 7-Zip, потом нашёл какой-то доисторический BZIP компрессор ))) и вдруг что-то получилось
Вот сегодня опять сжал ваще с неимоверными параметрами в GZIP и даже заснял видео
Параметры были такие: 7z a -tgzip PROUpdater.gz "ErikPshat PSPx Team" -mx=5 -mfb=4 -mpass=3
lupus, а какая разница. Чем отличается GZIP от GZIP?
Тут просто более сильное сжатие - будет дольше расжиматься. Все эти параметры сжатия используются только в процессе сжатия, а при распаковке только распаковывается.
Это аналогично, когда кодируешь видео в 1 проход или 2 прохода и с фильтрами. Чем больше проходов и доппараметров, тем дольше будет происходить кодировка. Но вот проигрывать видео по-любому будет проигрыватель, даже не задумываясь о том, сколько проходов было использовано или какие там суперпродвинутые параметры кодирования были использованы.
И это, PROUpdater установщика прошивки сжимать в 3 прохода - это тебе не с игровыми ресурсами баловаться
Сообщение от ErikPshat
7z a -tgzip PROUpdater.gz "ErikPshat PSPx Team" -mx=5 -mfb=4 -mpass=3
Недавно снова столкнулся с похожей задачей, нужно было найти и извлечь сжатый кусок данных, а если их много, то автоматизировать процесс.
Для этого отлично подошла софтинка offzip: Ссылка
Offzip 0.4 (offzip / Offset file unzipper) .image.
a very useful tool to unpack the zip (zlib/gzip/deflate) data contained in any type of file like raw files, packets, zip archives, executables and everything else.
it's needed only to specify the offset where the zip data starts or using the useful -S search option able to scan the file for possible deflate (-z -15) and zlib data.
there are also other options for extracting all the compressed streams (-a) or dumping them compressed (-A).
it's also possible to choose a windowBits value for scanning both the zlib (RFC1950) and deflate (RFC1951) blocks.
the -c option allows to work with chunked files and trying to build the original files.
the files will be dumped with a guessed extension that can be useful for their quick identification.
the tool has also a reimport option (-r) like QuickBMS.
how to dump all the zlib compressed files in an archive:
- offzip.exe -a input_archive output_folder 0
how to dump all the deflate compressed files in an archive:
- offzip.exe -z -15 -a input_archive output_folder 0
нам нужна команда
offzip.exe -z -15 -a input_archive output_folder 0
я использовал такую:
offzip.exe -z -15 -a orig_tr.nax temp 0 > tr_nax.txt
где:
orig_tr.nax
- мой файл, в котором я искал сжатые секции
temp
- папка, в которую извлекать найденные данные
> tr_nax.txt
- текстовик, куда сохранить лог
На выходе я получил файл 000003ae.lxc в папке temp и лог в текстовом файле tr_nax.txt рядом с offzip.exe
Файл 000003ae.lxc - содержимое того самого gz архива, который я искал. Обращаю внимание, что это уже распакованные данные!
Откуда имя файла:
000003ae - Поскольку заголовок gzip архива в данном конкретном случае не содержал имени сжатого файла, в качестве имени использовался адрес с которого в orig_tr.nax начинался поток сжатых данных.
.lxc - приложение offzip пытается по заголовкам извлечённых данных определить их MIME содержимое, что бывает очень полезно для стандартных типов файлов. Очень удобно, когда на выходе вы получаете всякие .png, .wav и т.п. В данном конкретном случае файл начинается с сигнатуры LXCE, отсюда и расширение.
Если хотите вырезать архив в исходном виде, то:
1. открываем исходный файл orig_tr.nax в хекс редакторе
2. переходим по адресу 0x000003ae т.е. к началу потока сжатых данных
3. с помощью поиска ищем значение hex 1f8b (magic сигнатура gz), направление поиска (обязательно!) назад от текущего положения курсора. Первое же совпадение должно быть началом нашего архива.
NB! Размер заголовка gzip архива может отличаться в зависимости от заданных при сжатии аргументов. Но его минимальная длина всегда равна 0x0A (10 байт)
Более подробно о заголовке (и не только) gzip прочитать здесь: http://www.forensicswiki.org/wiki/Gzip
Упражнение для начинающих
В данном конкретном случае мой заголовок размером, как раз 10 байт и выглядит так:
1F 8B 08 00 00 00 00 00 00 0B
Привёл его в качестве примера и для того, чтобы дать начинающим "копателям кода" возможность поупражняться и понять, какие данные хранятся в том заголовке.
Все данные, выше заголовка можно отбросить и сохранить файл, дав ему имя %filename%.gz (самый простой путь, о нём выше говорил Эрик), после чего извлечь данные с помощью того же 7zip.
Если всё сделано верно, то бинарное сравнение подтвердит идентичность данных извлечённых offzip и хекс-редактором.
позже продолжим...
Количество сообщений на форуме далеко не всегда пропорционально умственным способностям человека. >>>Silent Hill: Genesis<<<
Другие консоли: Все PSP, все PSV, SCPH-1002, SCPH-102, SCPH-77008, CECH-4208C, SCPH-1000R
Регистрация: 19.03.2008
Адрес: Россия
Сообщений: 5,744
Вы сказали Спасибо: 819
Поблагодарили 3,854 раз(а) в 2,022 сообщениях
Сила репутации: 1
Репутация: 3854 
(репутация неоспорима)
А ещё программа для обработки заголовка gzip (0x1f8b...) от меня.
Использование: кинуть файл на программу или передать 1-ым параметром.
Версия 0.1 (31.01.18): первый релиз
Версия 0.2 (01.02.18): отображение времени из заголовка, добавлено значение 0 для поля сжатия
Версия 0.3 (03.02.18): исправлено отображение времени, когда оно не задано
Yoti, вообще родная утилита от линукс - это tar.exe, она и в составе Windows 10 включена по умолчанию и пакует в gzip, bzip2.
Набери в консоли tar --help.
Compression options:
-a, --auto-compress use archive suffix to determine the compression program
-I, --use-compress-program=PROG
filter through PROG (must accept -d)
-j, --bzip2 filter the archive through bzip2
-J, --xz filter the archive through xz
--lzip filter the archive through lzip
--lzma filter the archive through lzma
--lzop filter the archive through xz
--no-auto-compress do not use archive suffix to determine the ompression program
-z, --gzip, --gunzip, --ungzip filter the archive through gzip
-Z, --compress, --uncompress filter the archive through compress
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram