A V P A C K версия 1.22 Программа сжатия исполняемых файлов (.EXE и .COM) Программа AVPACK позволяет уменьшать размер, занимаемый на диске файлами исполняемых программ, в то время как они продолжают оставаться работоспособными. При сжатии в файл добавляется небольшая (ок. 0.5К) программа, обеспечивающая восстановление исходного кода прямо в памяти и запуск программы на счет. Процесс сжатия не влияет на работу исходной программы, за исключением некоторых специальных случаев, оговоренных ниже, однако для нормальной работы программы, сжатой AVPACK-ом, может потребоваться некоторое количество дополнительной памяти. Для того чтобы полностью использовать возможности AVPACK-а, а также избежать возможных неприятностей, внимательно ознакомьтесь с данным руководством. AVPACK запускается при досовском промпте, и вся необходимая для его работы информация передается в командной строке, имеющей следующий вид: C:\>avpack [{-|/}ключи] [входной файл] [выходной файл] Все параметры командной строки могут быть набраны как заглавными так и строчными буквами. Параметр "входной файл" задает имя исходного (несжатого) программного файла. Это имя может включать путь (напр. c:\dos\fdisk.exe), а также неявную спецификацию (напр. a*.exe - все файлы с расширением .EXE, начинающиеся на 'a'). Параметр "выходной файл" задает имя сжатого файла. Если этот параметр опущен, имя выходного файла определяется именем исходного. Если имя входного файла задано в неявном виде (т.е. содержит '*' или '?'), имя выходного файла должно быть "*.*" или опущено, иначе AVPACK выдаст ошибку Can't write several files into one Тем не менее, можно указать другой путь, т.е. допустима следующая команда: AVPACK c:\util\*.com d: Имя директории при этом должно обязательно заканчиваться '\': AVPACK c:\util\*.com d:\pk\ Если в исходном имени опущено расширение, AVPACK по очереди использует .EXE и .COM. Если путь или расширение опущены в выходном файле, они будут определяться именем входного файла. Файлы, имеющие структуру .EXE, могут иметь любые расширения, в то время как COM-файлы обязаны иметь расширения .EXE или .COM. Ключи, задаваемые всегда перед именем входного файла, должны начинаться одним из символов '/' или '-'. Их можно комбинировать, напр. "-xb" эквивалентно "-x -b". При запуске AVPACK-а без параметров он выдаст на экран подсказку - общий вид командной строки, список ключей и примеры командной строки. Ниже дано подробное описание использования всех ключей AVPACK-а. -E Compress and encrypt file(s) Помимо сжатия, исходный файл зашифровывается с использованием случайного числа в качестве ключа. Это значительно затрудняет его реассемблирование или трассировку с помощью отладчиков, т.е. "взлом". Такой файл уже НЕ может быть восстановлен с помощью ключа "-x" AVPACK-а. Если заданы одновременно ключи "-E" и "-X", ключ "-E" игнорируется. -R Encrypt file(s) so that they'll be able to start on your PC only То же самое, что "-E", но в качестве ключа для шифровки берется контрольная сумма участка ROM-BIOS Вашего PC, поэтому программы, сжатые с ключом "-R", становятся неработоспособными на других машинах (разве что это машины из той же самой серии). При запуске такие программы выдают сообщение CRC error и возвращают управление в DOS. Данный ключ можно использовать для защиты от копирования Ваших собственных программ. Соблюдайте крайнюю осторожность при использовании этого ключа! -B Create backup (.BAK) copy of target file(s) if exist(s) Если AVPACK обнаружил уже существующий файл с таким же именем, как у выходного файла, он переименует его в файл с расширением ".BAK", а под старым именем запишет сжатый файл. Этот ключ можно использовать, если Вы не уверены, что сжатые файлы будут нормально работать (напр., файлы с оверлеями), или же в выходной директории существуют файлы с теми же именами, но не имеющие никакого отношения к исходным, и Вы опасаетесь их случайно затереть. -O Overwrite output file(s) if exist(s) Когда AVPACK обнаруживает существующий файл с именем, совпадающим с именем выходного файла, но отличным от имени исходного, то если не задан ключ "-O", он запрашивает пользователя, можно ли этот файл затереть: File "D:\PK\fdisk.exe" exists; Overwrite? (Y/N): Пользователь в ответ должен нажать 'Y' (Да) или 'N' (Нет). (При этом в случае отказа пользователя файл пропускается.) Если же этот ключ задан, AVPACK ничего не спрашивает, а просто затирает и все (разумеется, если задан ключ "-B", старый файл сохраняется с расширением ".BAK"). -W Enable write to read-only file(s) Если выходной файл имеет атрибут "R/O" (только чтение), то перед записью AVPACK спрашивает: File "D:\PK\fdisk.exe" is readonly; Overwrite? (Y/N): Опять таки, если пользователь отвечает 'N', данный файл пропускается. Если же задан ключ "-W", то AVPACK снова ничего не спрашивает, а сразу же записывает. Выходной файл при этом создается с тем же атрибутом, а файл .BAK (если задан ключ "-B") - без него. -S Skip .EXE files with overlays Некоторые .EXE-файлы помимо загружаемого модуля содержат дополнительную информацию, чаще всего это оверлеи, то есть участки кода, которые загружаются в память при работе программы - по мере необходимости. Обычно оверлейные службы, имеющиеся в таких программах, ищут оверлеи в определенных местах файла. После сжатия такого файла AVPACK-ом оверлеи оказываются передвинутыми в другое место, оверлейные службы их не находят и часто программа становится неработоспособной. Когда AVPACK обнаруживает входной файл такого формата, он запрашивает пользователя, нужно ли сжимать такой файл: File "C:\C600\BINB\link.exe" may contain overlays; It is 142015 bytes long, while it should be 20402 bytes long. Do you wish to continue? (Y/N): Если же задан ключ "-S", AVPACK ничего не спрашивает, а просто пропускает такой файл. Поскольку файлы, у которых длина .EXE-модуля не совпадает с длиной файла, не обязательно содержат оверлеи, Вы все же можете попробовать сжать такой файл, задав на всякий случай ключ "-B", или указав другое имя выходного файла. Если полученный файл не работает, его можно восстановить из сжатого, задав ключ "-X", или переименовать .BAK-файл обратно в .EXE. -D Remove extra data (overlays) from output file(s) При обработке файла с оверлеями сжимается только корневой модуль, вся дополнительная информация пишется в конец файла без изменений. Некоторые программы записывают туда статус или рабочую информацию - такие программы в сжатом виде будут работать без изменений. Некоторые .EXE-файлы содержат в конце символьные таблицы и отладочную информацию, которая становится бесполезной после сжатия. Другие файлы могут содержать в конце несколько лишних байтов, оставшихся, например, после вирусолечения. Если задан ключ "-D", эта дополнительная информация НЕ копируется в выходной файл, что экономит дисковое пространство, но программы с оверлеями могут оказаться безнадежно испорченными, т.е. не могут быть восстановлены с помощью ключа "-X". Поэтому вместе с ключом "-D" старайтесь задавать ключ "-B". -X Expand compressed file(s) Программы, сжатые AVPACK-ом без ключей "-E" и "-R", могут быть возвращены в "первоначальное" несжатое состояние с помощью задания ключа "-X". Этот ключ также позволяет восстанавливать программы, сжатые другими подобными программами: EXEPACK (Microsoft Corp.), LZEXE (Fabrice BELLARD) и PKLITE (PKWARE Inc.). Когда AVPACK встречает такие программы при сжатии, он выдает сообщение File "C:\UTIL\unlzexe.exe" is already compressed by LZEXE ver. 0.91 Use -X option to expand it first Вы можете сначала распаковать такие файлы AVPACK-ом с ключом "-X", а после этого сжать. Известны программы с оверлеями, корневой модуль которых сжат EXEPACK-ом. При восстановлении таких программ AVPACK выдает запрос насчет оверлеев. В этом случае убедитесь, что сохранена .BAK-копия исходного файла, так как часто такой файл после распаковки такие программы становятся неработоспособными, причем восстановить их уже нельзя. -Q Quiet mode (no messages, assume 'Yes' on all queries) Если задан ключ "-Q", AVPACK не выдает на экран никаких сообщений и считает что на все его возможные запросы получен ответ 'Y' (Да). Эта опция полезна, если AVPACK запускается из командного файла или какой-либо другой программой, которой не хотелось бы портить с трудом построенный и тщательно поддерживаемый экран. Примечания. Работу AVPACK в любой момент можно остановить нажатием Ctrl-C, но Ctrl-Break не воспринимается при ожидании ответа на какой-либо из запросов. AVPACK никогда не записывает в выходной файл непосредственно, а создает временный файл под именем "AVPACK$$.TMP" на том устройстве, где находится выходной файл, а в случае успешного завершения работы переименовывает его в нужный файл - чтобы свести к минимуму вероятность случайного повреждения данных при отказе питания и т.п. При сжатии имеют смысл все опции, совместно с "-X" могут употребляться опции -B, -O, -W, -D. Опция -S имеет смысл только при распаковке программ, запакованных EXEPACK-ом. Если заданы конфликтующие опции, учитывается заданная последней. AVPACK возвращает ERRORLEVEL = 0 при успешном завершении, 1 - предупреждение (заданы опции, но отсутствуют имена файлов), 2 - ошибка (напр., неправильно заданы параметры), 3 - тяжелая ошибка (напр., дисковая или нехватка памяти). Сообщения, выдаваемые AVPACK-ом Warning: Ignoring unknown option "-..." - задан ключ, отсутствующий в приведенном выше списке. No input file(s) specified - Задайте имя входного файла (по крайней мере) Fatal Error: C:B*.EXE -- Illegal wildcards in output filespec - Имя выходного файла должно быть явным (без '*' и '?'), "*.*" или опущено. Fatal Error: Can't write several files into one - Если входное имя содержит '*' или '?', выходное должно быть "*.*" или опущено. Fatal Error: Not Enough memory - Нехватка памяти. Попробуйте удалить из памяти резидентов, выйти из Norton-а, удалить из CONFIG.SYS лишние драйверы устройств или перегрузить DOS в High Memory. Warning: Too many files in source directory - AVPACK обнаружил более 500 файлов с подходящим именем. Обрабатываются только первые 500. Задайте более конкретную спецификацию входного файла или пакуйте оставшиеся файлы по отдельности. Fatal Error: "D:\PK\*.exe" -- No file(s) found - Подходящих файлов не обнаружено вообще Группа дисковых ошибок, возникающих при различных операциях, но имеющих общие свойства, начинается сообщением: Error reading directory "A:\" -- (ошибка чтения директории) Fatal Error: Can't open file "D:\PK\myprog.exe" -- (ошибка открытия) Fatal Error: Can't read file "D:\PK\myprog.exe" -- (ошибка чтения) Fatal Error: Can't write file "D:\PK\myprog.exe" -- (ошибка записи) Далее следует конкретизация: Can't write to write protected unit - Запись на защищенное устройство Unknown device - Неизвестное устройство Device not ready - Нет готовности устройства CRC check error - Ошибка верификации данных с помощью CRC Seek error - Ошибка позиционирования Unknown media - Неизвестный носитель Sector not found - Сектор не найден Write fault - Отказ записи Read fault - Отказ чтения The disk may not be formatted - Диск, возможно, не отформатирован File not found - Файл не найден Invalid path specified - Указан неправильный путь Can't write into directory file - Попытка записи в файл директории Too many open files - Слишком много открытых файлов Disk full - Нет места на диске Unknown error - Неизвестная ошибка QQ.BIN -- The extension must be .EXE or .COM - Если вы уверены, что данный файл действительно имеет .COM-формат, переименуйте его в файл с расширением .EXE или .COM и повторите команду. File "C:\UTIL\t.exe" may be compressed by Microsoft's EXEPACK Sorry, decompressing is not available for that version - Скорее всего, попался файл, сжатый какой-то неизвестной автору версией EXEPACK-а. Просьба выслать копию этого файла автору, взамен Вы скорее всего получите новую версию AVPACK-а, способную распаковывать такие файлы. Это же самое касается неизвесных версий PKLITE и LZEXE, а также других подобных программ. File "C:\UTIL\big.com" can't be compressed - Скорее всего, файл слишком большой или уже чем-то сжат File "C:\UTIL\ff.exe" can't be compressed -- Relocation table is too big - Таблица релокаций файла занимает более 32К, сделать ничего нельзя Skipping: "C:\CHIWR\cw.exe" -- File may contain overlays - Данный файл содержит оверлеи, в то время как задан ключ "-S" Error: Packed file is corrupt - При распаковке файла, сжатого EXEPACK-ом, произошла ошибка контроля данных. Попробуйте запустить эту программу на счет - если будет выдано сообщение "Packed file is corrupt", сделать ничего нельзя - поврежден код файла, а если все нормально - просьба выслать эту программу автору. Отличия AVPACK-а от других подобных программ (LZEXE by Fabrice BELLARD и PKLITE by PKWARE Inc.) AVPACK в целом позволяет получить более короткий файл, так как он сочетает преимущества сжатия кода PKLITE (хотя сам по себе метод упаковки AVPACK-а существенно отличается от других) и более совершенный инкрементальный метод сжатия таблицы релокаций LZEXE. Предельный "коэффициент сжатия" таблицы релокаций LZEXE и AVPACK-а составляет 4, в то время как у PKLITE - максимум 2. Кроме того, LZEXE имеет небольшую ошибку в этом алгоритме и делает неработоспособными программы, содержащие в таблице релокаций "0:0" (восстановить такие программы очень сложно, поэтому данная реализация AVPACK-а при распаковке таких программ тоже сработает неправильно). Эта ошибка устранена в AVPACK-е. Похоже что при сжатии файлов AVPACK работает несколько быстрее, чем PKLITE или LZEXE. AVPACK, как и PKLITE, имеет опцию шифрования выходных файлов, однако в нем применен более совершенный метод, в то время как Вы сами можете убедиться в том, что некоторые файлы, сжатые PKLITE с опцией "-e", благополучно распаковываются AVPACK-ом. Кроме этого, AVPACK имеет оригинальную опцию "-R", позволяющую защитить Ваши программы от бесконтрольного распространения. По сравнению с существующими распаковщиками (UPACKEXE by Fabrice BELLARD и UNLZEXE by Kou, Japan) AVPACK работает значительно быстрее, кроме того он более корректно восстанавливает количество памяти, необходимой программам при запуске (поле Minimum Memory в заголовке .EXE-файлов). Если, например, какую-либо программу несколько раз сжать с помощью LZEXE, а затем распаковать с помощью UNLZEXE, она в конце концов перестанет запускаться на счет из-за нехватки памяти. В AVPACK-е эта неточность устранена. AVPACK поддерживает некоторые версии EXEPACK-а, неизвестные UPACKEXE, например, в программах MS-DOS 5.00. Дальнейшее развитие В последующие версии AVPACK-а предполагается ввести возможность включения в сжатые файлы кода, обеспечивающего самотестирование и самовосстановление на случай заражения вирусом, возможность сжатия файлов драйверов устройств, а также увеличить простоту и дружелюбность по отношению к пользователю. Все замечания и предложения по работе программы приветствуются автором. _________________________________________________________________________ ВОЛКОВ Андрей Иванович, Институт Теплофизики, Новосибирск Тел. 35-07-35