Архивы ZLIB

Небольшое руководство с описанием формата Zlib-архивов, методике их ручного поиска, извлечения и замены в файлах
  1. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Обновил информацию в шапке.;

    pp0312, Программа TrIDNet немного не из той оперы. Во-первых, сигнатура 1F8B080000000000000B - это архив GZIP (GNU ZIP), который хоть и разработан авторами архиватора Zlib, но имеет совершенно другую структуру данных. Во-вторых, программа не показывает что внутри исследуемого файла, а пытается методом сопоставления с базой сигнатур различных форматов определить возможный тип файла. smile 

    У нас задача другая:определение наличия в исследуемом файле запакованных Zlib-данных, их извлечение, распаковка, перевод (при необходимости), а затем обратная операция по внедрению в файл модифицированных данных.biggrin
    Сообщение отредактировал 23 января 2023 - 09:33

    Кто ищет, тот всегда найдет!

    14 июня 2013 - 01:16 / #11
  2. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

    Новый Zlib-архив, размер файла - 908 872 байт.

    Ребята, я хочу вернуться к Zlib (программа Streaming Audio Recorder). Распаковать вроде-как по написанному получается. Но не получается получить архив переведенного файла меньшего размера, чем оригинальный. В итоге архив невозможно заменить в файле программе на новый. Как это сделать?

    Nexus написал, что файлы достаточно распаковать и кинуть в папку с программой. Да, так работает. Но это исключительный случай. С SysTracer такое не прокатывает. Нужно именно заменить архив на новый. Но в обеих случаях, хоть одно слово переведешь и после упаковки архив больше оригинального. Horna там писал о мастерстве, но не написал как этого добиться (да и пропал куда-то, с февраля не появлялся, в личку не отвечает)sad

    А можно подробнее, что вы там переводили и как вы получили архив меньшего размера, чем оригинальный? Если просто взять распаковать архив, а потом тут же запаковать полученный файл обратно, то новый архив получается больше.wacko
    16 июня 2013 - 17:06 / #12
  3. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Но не получается получить архив переведенного файла меньшего размера, чем оригинальный.


    Значит надо в переводимом файле что-то кастрировать - или уменьшать битность иконок в ресурсах, или упрощать русский перевод, что не есть гуд. В общем, надо как-то выкручиваться. Можно еще через отладчик в конце файла добавить пустые секции и впихнуть туда архив, но это далеко не все умеют, да и геморрно все это. Это, конечно, хорошо с Streaming Audio Recorder вышло - вытащил файлы и впихнул в паку, заработало - ну и ладноbiggrin . В SysTracer так дело не прокатило - выкинули нафиг описание лицензии, сжали и впихнули - заработало! С XLtoEXE так номер не прокатил вообще, там надо еще что-то придумать, чтобы прога нормально функционировала... Вот так вокруг "бедовых" программ и вьемся - что ни перевод, то изысканная головоломка, сегодня ты локализаторщик, а завтра ты уже хакер - долбишь упрямую утилиту и зубилом, и пилой режешь, лишь бы она работала так, как тебе нужно...
    Кстати, интересный экземпляр этот XLtoEXE. Запакована сама в себя, при запуске разархивируется в папку TEMP и оттуда уже выполняется. Для перевода пришлось ее хакнуть и прикрутить ZLIB библиотеку, так как копия утилиты отказывалась работать, чего только не придумают...
    17 июня 2013 - 00:42 / #13
  4. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

    В SysTracer так дело не прокатило - выкинули нафиг описание лицензии, сжали и впихнули - заработало!

    Ах вот как ларчик открывается!agree
    Теперь надо смотреть, что в Streaming Audio Recorder выкинуть, уменьшить, упростить? Это блин не локализация получается, а тюнинг...biggrin
    17 июня 2013 - 01:07 / #14
  5. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    На опенсорсе всегда нужно указывать автора.

    Недолго думая, я полез на форумы по программированию и раскопал исходный код простейшего архиватора с использованием библиотеки Zlib. Автор программы Andrea Russo, Italy, 2005 год.
    19 июня 2013 - 16:43 / #15
  6. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Цитата: MOVIC
    всегда нужно указывать автора



    Автор программы в новости указан и поверьте, не задним числом. К тому же, если вы посмотрите свойства файла, то я честно вписал туда авторские права.
    Цитата: MOVIC target="_blank" rel="noopener external"> И сайт с размещением этих сырков.[/quote


    Так как у нас сайт не занимается вопросами программирования, то я не счел нужным добавлять ссылку на исходный код программы. Но если нашим читателям это интересно, то исходники утилиты я брал здесь: [url=http://www.torry.net/authorsmore.php?id=5846]TorryNet. Когда материал будет полностью завершен, я постараюсь указать все источники информации.
    Моя вина состоит в том, что я немного переработал интерфейс программы, перевел её на русский и добавил ссылку на этот сайт. Если нашим пользователям нужна оригинальная версия программы, то я могу выложить и её.
    [quote author=Krig] А можно подробнее, что вы там переводили и как вы получили архив меньшего размера, чем оригинальный?[/quote]


    Я переводил только то, о чем спрашивал пользователь vaka61 ниже.

    Работал в шаблоннике Radialix. При этом, страничку HTML, которая отображается в указанном окошке, я сохранил в отдельный файл и переводил в текстовом редакторе, затем загрузил её обратно в редактор.
    Касаемо размера файла. В каждом конкретном случае нужно проанализировать ресурсы программы. В частности в первую очередь я обращаю внимание на файлы изображений. Разработчики не уделяют должного внимания их оптимизации. К примеру, в программе Streaming Audio Recorder есть изображение, которое используется в качестве фонового в окне "О программе":

    Это изображение в формате PNG и размером 75 750 байт. Причем, этих изображений в ресурсах программы почему-то два! Если выполнить оптимизацию этого изображения, например с помощью программы RIOT, то мы получим файл размером 57 849 байт. С учётом замены двух изображений суммарная экономия получается 35 802 байт. Этого более чем достаточно, чтобы после создания локализованного файла и его последующей архивации в Zlib, размер полученного архива получился меньше оригинального, что позволило безболезнено выполнить его замену в оригинальном файле.
    Сообщение отредактировал 23 января 2023 - 09:33

    Кто ищет, тот всегда найдет!

    20 июня 2013 - 00:16 / #16
  7. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Leserg, скажи, а ты вот упоминал о XLtoEXE, ты ее переводил? Как умудрился перевести, обратно сжать и втиснуть назад переведенный файл? Что-то вот размер никак не получается уменьшить... Просто интересно.
    20 июня 2013 - 10:17 / #17
  8. Оффлайн

    vaka61

    Звание: Бывалый

    Знаток

    Сообщений: 156

    Создано тем: 16

    Рейтинг: 4

    Репа: (12|12|0)

    Баллы: 121

    Страна: не указана!

    Был: 2024-09-18 09:35

    Лайков: 4

    В общем, из статьи “Поиск и извлечение Zlib-данных” вреди бы всё понятно. Перехожу к практическим действиям, и тут всё идёт как по маслу, до определённого места. И место это, сжатие до размера. Размер изображения эффекта не дал. Сокращал перевод, лишнее забивал нулевыми байтами. Но результата нет. Очевидно я чего-то не догоняю, как добиваться желаемого размера. Nexus пишет. (Это, конечно, хорошо с Streaming Audio Recorder вышло - вытащил файлы и впихнул в паку, заработало - ну и ладно. Можно еще через отладчик в конце файла добавить пустые секции и впихнуть туда архив, но это далеко не все умеют, да и геморрно все это.) Может об этом статейку забабахали, лишним не будет. Учиться так, учиться.
    20 июня 2013 - 19:19 / #18
  9. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Цитата: Nexus
    Leserg, скажи, а ты вот упоминал о XLtoEXE, ты ее переводил?




    Да, я её переводил.



    Цитата Nexus" data-quote="1">Как умудрился перевести, обратно сжать и втиснуть назад переведенный файл? Что-то вот размер никак не получается уменьшить...
    Все очень просто. В данном случае не нужно морочить голову с размером получаемого Zlib-архива. Почему? Потому что Zlib-данные находятся в конце файла и после них идет всего лишь 16 байт, где прописан размер файла, который находится в архиве, т.е. 331776 байт. Поэтому просто вставляем новый архив на место старого, а в конце добавляем эти 16 байт.

    Мои действия для перевода этой программы:
    1) В оригинальном файле программы по сигнатуре 78DAEC нашел архив и сохранил его в отдельный файл.
    2) Распаковал содержимое архива и узнал что это за файл.
    3) Программа оказалась написана на Visual Basic 5/6.0. Поэтому дизассемблировал её до исходного кода (чтобы получить исходный код форм).
    4) В компиляторе Microsoft Visual Basic 6.5 перевел все формы программы и скомпилировал программу-пустышку. Она запускается и отображает диалоговые формы программы, но ничего функционально не делает. Таким образом я проверяю, как ложится перевод в интерфейсе.
    5) После завершения отладки интерфейса, начинается работа в НЕХ-редакторе. Из программы-пустышки переношу НЕХ-код форм в оригинальный файл программы.
    6) Затем начинается работа по переводу жестко-закодированных строк. Благо в этой программе оказалось два языка: английский и испанский. Так как испанский язык нигде в программе не активируется, то если переведенные строки русский не помещались на место английских, я их переносил на место испанских и корректировал соответствующим образом смещения.
    7) Когда локализация была готова, запаковал файл обратно в Zlib-архив. Новый архив получился больше исходного, но так как он находится в конце файла, то нет нужды предпринимать меры по его уменьшению.
    8) Так как программа каким-то образом проверяет размер архивных данных, и если они не соответствуют действительности, то отказывается работать. Поэтому выполнив анализ НЕХ-кода, я обратил внимание на интересную запись:



    Если сложить этим данные (36864 + 80722 + коррекция), то получится размер Zlib-архива. Корректируем эти данные с учётом нового размера архива, сохраняем и... программа великолепно работает.

    Вот и все.

    Цитата: vaka61
    до определённого места. И место это, сжатие до размера. Размер изображения эффекта не дал.




    Сокращал перевод, лишнее забивал нулевыми байтами. Но результата нет.
    Обращай внимание на размер создаваемого локализованного файла. Если он больше размера оригинального файла, то никоим образом не получится получить новый размер архива меньше исходного. Например, я работал с версией Streaming Audio Recorder v.2.8. Размер оригинального файла программы - 2 225 152 байт. После описанных выше действий в редакторе Radialix, размер локализованного файла у меня получается 2 163 712 байт. Как видишь новый размер меньше оригинального (за счет замены двух изображений на оптимизированные!), соответственно и архив получится меньше оригинального.

    Очевидно я чего-то не догоняю, как добиваться желаемого размера.



    Если ты работаешь в Radialix"e, то в нем есть небольшой нюанс: те ресурсы, которые не будут переводиться или изменяться, необходимо переключить в режим "только для чтения".

    Проведи небольшой эксперимент:
    1) Создай новый проект локализации файла Streaming-Audio-Recorder.exe. Radialix выдаст огромный список ошибок (по крайней мере у меня это так).



    Ничего не переводи, а создай локализованный файл. Посмотри размер полученного файла. Например у меня получился 2 378 240 байт, т.е. больше оригинального, а мы еще ничего не переводили.

    2) Теперь в менеджере ресурсов установи всем режим "Только для чтения", кроме ресурсов StreamingAudioRecorder.Resources.resources, StreamingAudioRecorder.frmAbout.resources (в них находятся изображения), StreamingAudioRecorder.help-xp.html (документ HTML).



    Ресурс #US - это жестко-закодированные строки, где у каждой из них признак "Только для чтения" установлен индивидуально. Сохрани проект и закрой редактор полностью.

    3) Снова запусти Radialix и открой только что созданный проект локализации. Ошибок быть не должно.



    Ничего не переводи, создай локализованный файл. Его размер должен быть в пределах оригинального, например у меня получился 2 230 784 байт. Т.е. всего лишь на 5 Кб больше оригинального.

    4) Если теперь заменить те два изображения на оптимизированные и создать новый локализованный файл, то его размер будет меньше оригинального, например у меня - 2 163 712 байт (это зависит от суммарного размера оптимизированных изображений). После этого можно переводить документ HTML и необходимые жестко-закодированные строки.
    Сообщение отредактировал 23 января 2023 - 09:33

    Кто ищет, тот всегда найдет!

    21 июня 2013 - 00:04 / #19
  10. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    ПРОДОЛЖЕНИЕ ТЕМЫ

    6. Утилита Offset file unzipper v0.3.5
    -----------------------------------------------------
    Автор:Luigi Auriemma
    Домашняя страница: http://aluigi.altervista.org
    Лицензия: Freeware.
    Скачать OffZip

    Уникальная утилита для извлечения и распаковки ZIP-данных (в том числе и Zlib/gZip/Deflate), которые могут находиться внутри файлов (исполняемых, DLL, архивах, изображениях и прочих). Программа выполняет поиск Zip/Zlib/gZip/Deflate архивов в указанном файле по всем известным сигнатурам с заданного смещения. При нахождении блока с архивными данными, сохраняет их в отдельные файлы с именами смещений, по которым они были найдены, и при необходимости распаковывает архивы. Язык - английский.

    Программа является консольной, поэтому с ней необходимо работать в интерпретаторе командной строки (cmd.exe).



    Синтаксис команд следующий:

    offzip [параметры] <имя_файла> <папка_сохранения> <смещение>


    Описание:
    ------------
    offzip - имя исполняемого файла утилиты (offzip.exe);
    <имя_файла> - полный путь к файлу, в котором необходимо выполнить поиск Zip/Zlib/gZip/Deflate архивов. Если в строке пути имеются пробелы, то её необходимо заключить в двойные кавычки;
    <папка_сохранения> - полный путь к папке, в которую необходимо сохранить/извлечь/распаковать все найденные архивные данные. Если в строке пути имеются пробелы, то её необходимо заключить в двойные кавычки;
    <смещение> - адрес смещения, с которого следует начать поиск архивных данных в исследуемом файле;
    [параметры] - параметры сканирования, поддерживаются следующие команды:
    ..................-s - поиск всех Zip/Zlib/gZip/Deflate данных.
    .........................После нахождения первого архива сканирование завершается.
    .........................Параметр <папка_сохранения> игнорируется, поэтому можете указать любые данные;
    ..................-S - все тоже самое, что и команда -s, но сканирование продолжается
    .........................(на экран выводится список смещений всех найденных архивов);
    ..................-a - распаковка содержимого всех найденных архивов в указанную папку <папка_сохранения>.
    .........................Имена файлов будут содержать адреса смещений, где были найдены архивы;
    ..................-A - извлечение всех найденных архивов в указанную папку <папка_сохранения>.
    .........................Имена файлов будут содержать адреса смещений, по которым были найдены архивы;
    ..................-1 - этот параметр используется совместно с командами -a/-A и позволяет
    .........................генерировать одно уникальное имя файла вместо нескольких;
    .........-m SIZE - размер блока ZIP-данных, который подтверждает достоверность архивов.
    .........................По умолчанию используется значение 32 (-m 32).
    .........................Используйте большие значения для уменьшает числа ложных срабатываний утилиты и
    .........................меньшие значения для, например 16 (-m 16), для выявления очень маленьких архивов;
    ...........-z NUM - величина выделенной памяти (windowBits) для сжатых данных.
    .........................По умолчанию используется значение 15.
    .........................Значения от -8 до -15 используются для поиска RAW Deflate данных.
    .........................Значения от 8 до 15 используются для поиска Zlib данных;
    ..................-q - отключение каких-либо сообщений об ошибках;
    ..................-r - не удалять поврежденные архивы, полученные при помощи команд -a/-A;
    ..................-x - вывод данных о размерах сжатых/распакованных данных в шестнадцатеричном формате;
    ..........-L FILE - сохранение отчета с результатами сканирования в указанный файл (FILE).


    Пример применения утилиты Offset file unzipper v0.3.5. Допустим мы хотим проверить наличие Zlib-архивов в исполняемом файле Streaming Audio Recorder.exe программы Streaming Audio Recorder (я рассматриваю версию 2.8). Запускаем интерпретатор командной строки (от имени Администратора!) и вводим следующие команды:

    offzip -S "d:TEMP_SOFTSAR_ZlibStreaming Audio Recorder.exe" d:TEMP_SOFTSAR_Zlib 0


    Параметр -S только поиск архивов, затем путь к файлу (т.к. в имени файла есть пробелы, то строку заключаем в двойные кавычки), потом папка вывода (в данном случае этот параметр игнорируется, но указывать его нужно обязательно), наконец начальный адрес поиска - 0 (т.е. с самого начала файла). Все. Нажимаем [Enter]. Утилита отработает и покажет результаты своей работы:



    Найдено 10 архивов: адреса, размеры сжатых/распакованных данных. Один из архивов не удалось распознать и утилита предлагает изменить параметры, чтобы проверить, действительно ли это архив.

    Так, архивы есть. Теперь давайте их извлечём в папку "Zlib". Для этого укажем следующие команды:

    offzip -A "d:TEMP_SOFTSAR_ZlibStreaming Audio Recorder.exe" d:TEMP_SOFTSAR_Zliblib 0


    После работы утилиты в заданной папке мы получем файлы с найденными архивами:



    Валидным архивам утилита дала расширения DLL, а неизвестному - DAT (файл 00120186.dat). На самом деле все полученные файлы с расширением DLL - это Zlib-архивы. Чтобы выполнить их распаковку, например, при помощи программ Simplyzip или Архиватор Zlib, файлам необходимо дать расширение *.zlp. Что из себя представляет архив 00120186.dat я не разбирался. Если вам интересно, то можете провести самостоятельное исследование :) .

    Наконец, утилите можно дать команду, чтобы она сразу выполняла распаковку данных из найденных в исследуемом файле архивов, например в папку "Un_Zlib":

    offzip -a "d:TEMP_SOFTSAR_ZlibStreaming Audio Recorder.exe" "d:TEMP_SOFTSAR_ZlibUn_Zlib" 0


    Вы получим тот же список файлов с такими же именами и расширениями, но это уже будут файлы, которые находились внутри архивов.

    РАСПАКОВКА




    ФАЙЛЫ




    О том, как выяснить настоящие имена полученных файлов написано в разделе "3. Поиск и извлечение Zlib-данных." данного руководства (при помощи программы Exeinfo PE). С этим вопросом вы уже должны справиться сами.

    Так, благодаря утилите Offset file unzipper, всю рутинную работу с Zlib-данными можно выполнить за считанные секунды.
    Сообщение отредактировал 23 января 2023 - 09:34

    Кто ищет, тот всегда найдет!

    24 июня 2013 - 01:35 / #20

Статистика форума, пользователей онлайн: 1 (за последние 20 минут)

Создано тем
1191
Всего сообщений
15721
Пользователей
17967
Новый участник
olkavv