И вправду, игры, серьезные (и не очень) программы, так сказать, используют этот формат и без него обойтись не могут. Попробуйте-ка запустить программу под Windows, у которой нет EXE-файла нонсенс. Это во многих случаях, по сути дела, может означать, что нет и самой программы. Сколько уже говорилось о многочисленным графических, звуковых форматах, а о том, в каком формате содержатся данные в файле с расширением .exe, ни слова. И поэтому просто так, не корысти ради, я полез в Сеть, чтобы узнать побольше о том, с чем каждый день приходится работать. И теперь хочу поделиться полученными сведениями с Вами, многоуважаемые читатели. Честно скажу, я не системный программист и не писатель вирусов, чтобы знать все о содержимом этих файлов, поэтому в моем материале вы не найдете детальной спецификации EXE (PE), а лишь только описание темы с точки зрения пользователя, максимум прикладного программиста.
Несмотря на то, что файлы имеют расширение .exe, данные, хранящиеся в них, могут быть представлены в структуре различных форматов. Один из таких форматов называется PE Portable Executable (переносимый исполняемый). Изначально он появился в ОС Windows NT, а затем перекочевал и в Windows 9x. Выполнен он в соответствии со спецификацией COFF (общего формата объектных файлов), распространенной в Unix-системах, но сохранил некоторую совместимость с форматом ДОС (об этом далее). В упрощенном виде его структура представлена на Рис. 1. Рассмотрим по порядку ее элементы. Первым идет, как ни странно, заголовок (MZ) MS-DOS. Он предназначен для определения совместимости с используемой ОС. Вы, может быть, замечали, что при запуске exe-файла в формате PE из ДОС выводится текст: «This programm must be run under Win32». Это результат работы так называемой stub-программы. Она представляет собой программу реального времени, совместимую с ДОС и вносимую в EXE(PE) при компиляции (вернее, при линковке). Если б ее не было, ДОС пытался бы прочесть данные, что могло привести к ошибке или сбою. При запуске же под Windows stub-программа пропускается. Далее в структуре следует заголовок PE. Он определяет начало PE-файла и содержит в себе общую информацию о нем (наличие отладочной информации, тип машины, на которой было создано приложение, и пр.). После этого в PE идут заголовки сегментов и собственно сегменты. Именно в сегментах и хранится все содержимое файла. Вы можете увидеть названия некоторых сегментов, открыв EXE(PE) в текстовом вьювере (в FAR, VC). Приложения могут иметь 9 сегментов: .text (сегмент исполнимого кода); .bss (содержит данные приложения, в том числе и переменные); .rdata (информация только для чтения константы и пр.); .data (содержит глобальные переменные); .rsrc (сегмент ресурсов объектов (рисунков, строк, курсоров, иконок и пр.), внедряемых при компиляции в exe-файл и используемых программой из этого файла); .edata (сегмент экспортируемых данных); .idata (сегмент импортируемых данных); и .debug (сегмент отладочной информации, которая может храниться и в отдельных файлах). Думаю, из названий сегментов ясно, что и для чего. Более детальное описание этих сегментов займет много места и будет интересно разве что системным программистам и вирусописателям. Для последних, кстати, в Интернете даже существуют специальные описания PE и возможностей его заражения, одна из которых состоит в том, что тело вируса частями распределяется по свободному пространству сегментов, при запуске оно собирается воедино программой, находящейся, например, в месте stub, и передает управление основной программе exe-файла. Это, конечно, общеизвестная информация. Но надеюсь, вы не займетесь написанием вирусов. А то известны такие «герои» нахватались кой чего в вузах, и давай валять всякую гадость с точки зрения программирования полнейший примитив, только людям нервы треплет… Теперь, после небольшого рассказа о формате PE и о содержании EXE-файлов в этом формате, логично перейти к рассмотрению способов коррекции и трансформации этого самого содержания.
Редакторы ресурсов
Как уже говорилось выше, в EXE-файле (а также и в DLL) могут содержаться ресурсы. Обычно в профессиональных коммерческих проектах все данные (текстовые сообщения, курсоры, диалоговые окна и пр.), используемые в программе, хранятся именно в них. Это позволяет, к примеру, не прибегая к перекомпиляции исходного текста, создавать версии программы на различных языках. Достаточно лишь перевести тексты и сообщения в ресурсах и все. Это в состоянии сделать даже человек, далекий от программирования. Для такой коррекции используются редакторы ресурсов. В Интернете развелось много программ подобного рода. Предлагаю вашему вниманию одну из них. Зовут ее Resource Hacker (работает под 9х, про 2000/ХР ничего не знаю). Обитает по адресу http://rpi.net.au/~ajohnson/resourcehackerи в других не столь отдаленных местах Сети. Это один из наиболее простых в использовании и достаточно функциональных редакторов ресурсов. И сразу, без лишних слов, давайте перейдем к делу издевательству над сообщениями горячо любимой ОС Windows. Предлагаю изменить текст диалогового окна, возникающего (иначе это не назовешь :-)) при удалении группы файлов. Он, как и все окно, находится в файле shell32.dll (Windows/System). Предупреждаю: за возможные последствия автор статьи ответственности не несет! Так вот, загрузите его в редактор ресурсов, перейдите в секцию Dialog, а в ней, в разделе 1049 (по крайней мере у меня он находится там), щелкните по единственному значку появится то самое диалоговое окошко. Далее щелкните по его элементу (тексту или кнопке), и в редакторе ресурсов в секции, содержащей параметры и текст окна, соответствующая этому элементу строчка выделится красной звездочкой (слева). Измените текст на свой, нажмите кнопку Compile Script (чтобы увидеть внесенные изменения) и сохраните все в файл с таким же именем (shell32.dll), но в другом месте. Теперь необходимо скопировать этот файл в директорию Windows/System и заменить тот, что там уже находится. Что, кричит система, понимаешь ли, сопротивляется? Но ничего мы ее сейчас через ДОС… Постарайтесь с помощью загрузочного диска или еще как-нибудь перезагрузиться в ДОС там все скопируется и заменится без проблем. Теперь перезагрузитесь в Windows и попробуйте удалить группу файлов (Shift+Del)… Лично у меня выводится такое окошко (Рис. 2).
Сжатие EXE
Еще с того же ДОС'а известны программы, сжимающие данные внутри EXE-файла и при этом сохраняющие его способность запускаться и исполняться. Под Windows такие программы тоже есть. Называются UPX (Ultimate Packers for eXecutables). Они позволяют сжимать данные внутри EXE (различных форматов, в т.ч. и PE) и DLL . Это очень хорошо, например, при создании Autorun'ов к дискам (быстрее ведь загружается и в то же время занимает меньше места) и в других целях, где обычный архиватор не подходит. Кстати, может быть, вы видели потрясающие демо-программы размером до 64 Кб, но притом вытворяющие чудеса при помощи OpenGL или Direct3d и сопровождающие это все музыкой (посмотрите демку SQWISH на http://www.intercon.ru/~and). Так вот, они тоже сжаты UPX'ом. Можете поискать этого рода программы в Интернете по слову «UPX» или на сайте http://www.torry.ru(поиск по слову «UPX»). Мне приглянулась программка, расположенная по адресу http://upx.sourceforge.net. Она работает с командной строки, поддерживает очень большое количество форматов EXE, относительно долго сжимает, зато сверхбыстро распаковывает (что и требуется).