До недавних пор я не знал (да и вы наверное тоже), что при программировании ПО можно воспользоваться услугами архиватора ZLIB. Это свободная кроссплатформенная библиотека для сжатия данных, которая поставляется вместе с различными пакетами разработки программного обеспечения. Используется в основном для для сжатия сетевых протоколов передачи потоковых данных между Клиентом и Сервером. Особенностью архиватора ZLIB является возможность быстрой (на лету) работы с данными в памяти ПК (сжатие-распаковка) и очень малая загрузка процессора на выполнение этих операций. Некоторые программисты используют его для сжатия ресурсов программы. При запуске данные распаковываются в память ПК и уже оттуда программа считывает необходимые ей данные. Этот факт можно использовать как простейшую защиту от любопытных глаз.
Чем полезна эта информация для нас?
Вам, наверное, уже неоднократно попадались программы, которые вроде как и не защищены ничем, не запакованы, но ресурсы их недоступны. Ярким примером, например, является программа SysTracer. Вот теперь, зная про архивацию данных, можно выполнить проверку таких программ на наличие в них архивов ZLIB.
Сигнатура архива ZLIB - 78DAEC. Эти три байта всегда и везде одинаковы (я в этом убедился на других программах) и указывают на начало потока. Особенностью ZLIB является то, что ему не нужно знать окончание архива, он работает только с потоком данных. Встретив сигнатуру архива, движок просто начинает распаковку данных до следующей сигнатуры, если она есть, или пока распаковывать станет нечего. Если, к примеру, поток будет обрезанным, то он все равно будет распакован, но открыть полученный после распаковки файл не получится, т.к. он будет просто неполным.
Итак, технология поиска и извлечения данных из ZLIB-архива, которые находятся в интересуемой нас программе, мне видится такой. Для начала инструменты:
1) НЕХ-редактор. Подойдет любой, в котором вы себя уверенно чувствуете. У меня это WinHex и далее, в примерах, я буду использовать его.
2) Программа для работы с архивами Zlib - Simplyzip, оффсайт - http://www.paehl.de/cms/simplyzip.
На примере программы SysTracer (уже русифицированной) начнем.
Откройте программу в НЕХ-редакторе и задайте поиск сигнатуры ZLIB-архива - 78DAEC:
Если эта сигнатура в файле есть, то она будет показана. Если нет, то и архива в файле такого нет. В нашем случае, с программой SysTracer, редактор перейдет к началу сигнатуры, вот она:
Теперь наша задача скопировать все данные архива в отдельный файл. Начало у нас есть, это байт 78, а вот конца архива нет. Ничего страшного, мы уже знаем, что при распаковке архиватору не нужно знать конец архива. Если размер потока превышает размер запакованных данных, то лишние байты просто игнорируются и вы получите чистый файл. Поэтому можно поступить так: выделить в НЕХ-редакторе все байты начиная с байта 78 и до самого последнего байта программы. Это можно сделать вручную, установите курсор на байт 78, нажмите левую кнопку мышки и поведите курсор вниз, до самого последнего байта, а затем отпустите кнопку. Но можно это проще, представьте, что файл большой, тогда выделять байты будет утомительно. Поэтому, поставьте курсор в позицию байта 78 и нажмите правую кнопку мышки. В контекстном меню выберите команду "Beginning of block":
Готово. Теперь прокрутите листинг в самый конец, установите курсор на последний байт программы и нажмите правую кнопку мышки. В контекстном меню выберите команду "End of block":
У нас получился выделенный блок с данными. Теперь необходимо их скопировать в новый файл. Копировать необходимо значения HEX! Для этого в меню редактора "Edit" надо выбрать команду "Copy Block -> Hex Values":
Блок НЕХ-значений мы скопировали в буфер обмена. Теперь, тут же в НЕХ-редакторе, создадим новый файл, а размер файла укажем 1 байт:
В полученный файл необходимо записать данные из буфера обмена. обращаю ваше внимание, что НЕ вставить, а ЗАПИСАТЬ. Для этого в меню "Edit" выберите команду "Clipboard Data -> Write":
Редактор переспросит о ваших намерениях - подтвердите их, нажав ОК. Проверьте, чтобы в нулевой позиции, по адресу 00000000, находился байт 78. Теперь сохраним наш новый файл. По сути говоря, это архив ZLIB, но еще "грязный", ведь мы не знаем какого размера в нем запакованные данные. Итак, сохраняем:
Желательно давайте названия архивам по имени программы, из которой вы его извлекли. Указываете имя и место сохранения, а расширение файл обязательно zlp, иначе программа Simplyzip не будет с ним работать. Готово.
Займемся излечением данных из архива. Окно НЕХ-редактора не закрывайте, оно еще пригодится, просто сверните его пока.
Откройте программу Simplyzip. Она поддерживает русский язык, правда перевод оставляет желать лучшего. В меню "Внешние прогр." выберите пункт "ZLIB (pack/unpack)" (упаковка/распаковка ZLIB):
Откроется небольшое окошко, где необходимо указать путь к файлу. В нашем случае это файл SysTracer_Pack.zlp. Выберите опцию Decompress и нажмите Start:
После распаковки мы получим файл SysTracer_Pack без расширения. На самом деле мы не знаем, что из себя представляет этот файл, или это ЕХЕ, или DLL. Это можно выяснить в том же НЕХ-редакторе по сигнатуре файла.Я например давал этому файлу расширение DLL, но оказалось, что это ЕХЕ. Я думаю вы разберетесь, что вы получили. Сейчас не это важно. Необходимо выяснить сколько места этот файл занимает в нашей программе, когда он запакован. Нам это необходимо знать, чтобы после его модификации можно было вставить его обратно. Если размер архива получится больше, то на не удастся сделать эту операцию. Для этого полученному файлу дайте расширение, загрузите его в программу Simplyzip, вызвав инструмент ZLIB, выберите опцию Compress и нажмите Start. Получим архив. Вы хорошо увидите, что его размер намного меньше объема тех данных, которые мы извлекли первоначально.
Вернемся к редактору НЕХ. Откройте в нем полученный файл архива. Будем искать в файле программы конец нашего архива. На первой позиции вы увидите уже знакомые нам три байта - сигнатура ZLIB-архива. Перейдите в конец файла и выделите несколько последних байт. Скопируйте их как НЕХ-значения:
Переключитесь на вкладку с программой SysTracer.exe и вызовите инструмент поиска НЕХ-данных. Скопированные нами НЕХ-значения автоматически подставятся в окошко поиска. Останется только нажать кнопку ОК:
Мы тут же окажемся там, где находятся эти значения:
Если помните, то последний байт нашего архива в этой последовательности - 49. Если вы не закрывали НЕХ-редактора и вкладку с программой, то там осталась выделенной часть байт с начальной позиции архива и до последнего байта программы. Теперь установите курсор на байт 49, нажмите левую кнопку мышки и выберите в контекстном меню команду "End of block":
После этого мы точно знаем позицию архива в теле программы - начальный и конечные адреса:
Теперь от вашего мастерства зависит модификация данных таким образом, чтобы после сжатия они поместились в найденных границах.