Недавно снова столкнулся с похожей задачей, нужно было найти и извлечь сжатый кусок данных, а если их много, то автоматизировать процесс.
Для этого отлично подошла софтинка 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
где:
- мой файл, в котором я искал сжатые секции
- папка, в которую извлекать найденные данные
- текстовик, куда сохранить лог
На выходе я получил файл
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 и хекс-редактором.
позже продолжим...