Что влияет на работоспособность исполняемых файлов Microsoft Windows и хитрые трюки

автор | 21 Декабрь, 2008
рубрики Статьи Комментарии к записи Что влияет на работоспособность исполняемых файлов Microsoft Windows и хитрые трюки отключены

 

Сразу предупреждаю, что данное руководство предназначено только для людей, которые знают что "Portable Executable" — это не новый проигрыватель MP3- файлов.

Итак, побудило меня на написание этого документа то, что формат PE везде расписан, но что и как влияет на работоспособность программ — нигде и ничего! В результате, приходилось много времени тратить на то, чтобы устранить какую-либо ошибку из-за несовместимости той же защиты ORiEN с различными версиями операционной системы Windows.

Здесь Вы найдете перечень "проблемных мест" формата PE, на которые следует обращать внимание, когда соберетесь писать свое ПО, связанное с работой над форматом исполняемых файлов Microsoft Windows Portable Executable.

  1. Плоские диалоговые окна, отсутствует иконка приложения
    Это явно указывает на то, что поле SubSystemVersion (смещение +48h от начала заголовка PE) имеет значение, меньшее чем "4" или вообще обнулено. Часто грешит этим компилятор Watcom C/C++. Достаточно поставить поле SubSystemVersionMajor в значение равное "4", а SubSystemVersionMajor в значение равное "0", чтобы исправить эту ошибку.
  2. Приложение не загружается под Windows XP/2K, но под Windows 9x все работает
    Причин тут может быть много, и одна из них — некорректное значение поля SizeOfHeaders (смещение +54h от начала заголовка PE). Установите значение поля в значение, равное физическому смещению первого объекта из таблицы объектов.
  3. Загружаем функции из таблицы импорта по фиксированным адресам
    Очень интересная функция — можно так настроить таблицу импорта, что любые изменения в таблице импорта будет игнорироваться, а функции будут загружаться по фиксированным адресам. Дело в том, что если в структуре IMPORT_DESCTIPTION значение поля TimeDateStamp совпадает со значением указанным в заголовке импортируемой библиотеки, то считается, что импорт уже настроен. Используется эта функция операционной системой для того, чтобы сократить время загрузки приложений. Чтобы отключить данную функцию, достаточно поля TimeDateStamp в структурах IMPORT_DESCTIPTION обнулить или установить в значение 0FFFFFFFFh.
  4. Таблица объектов
    "Сколько людей — столько и мнений"... Вспоминаю эту поговорку каждый раз, когда начинаю разбирать формат файла очередного компилятора... Каждый норовит выкинуть что-нибудь свое... Некоторые компиляторы (к примеру, Watcom C/C++, некоторые версии Intel C/C++ и т.д.)  довольно интересно строят таблицу объектов, в результате, если не предусмотреть все возможные варианты, то можно потерять на совместимости с некоторыми приложениями. Типичные проблемы: обнулено поле виртуального размера объекта, виртуальный размер объекта меньше физического и т.д.
  5. Автоматическое выделение памяти
    Не понимаю, почему до этого еще никто не додумался, но смысл идеи таков — часто, для того, чтобы встроенный в программу загрузчик начал работу, его надо собрать из кусков, разбросанных по всему телу программы, но для этого надо еще как-то выделить память. В этом месте многие защиты/вирусы и прочий софт используют довольно грубые методы врезки в операционную систему и прочий бред. Хотя решение простое — увеличить виртуальный размер последнего объекта и сконфигурировать загрузчик так, чтобы он собирался в автоматически выделяемой операционной системой области памяти.
  6. Тип точки входа в программу
    Следует всегда помнить, что вход в EXE- и DLL- программы разный! В программах DLL, при инициализации, передаются дополнительные параметры и это обязательно надо учитывать, чтобы корректно вернуть управление операционной системе.
  7. Размеры типовых объектов
    В заголовке PE программы присутствуют такие интересные поля: SizeOfCode, SizeOfData, SizeOfUnData. Интересно то, что некоторые поля заносят в эти поля виртуальные размеры типовых объектов, а некоторые физические. На совместимости с различными операционными системами Windows корректность этих полей никак не сказывается.
  8. Защита ресурсов
    Если Вы планируете осуществлять защиту ресурсов своим приложением, то не забудьте, что не все ресурсы желательно защищать — предусмотрите пропуск иконок и версии программы.
    А вот еще и новая капля дегтя — в приложениях, предназначенных для работы в Windows XP, имеется специальный тип ресурсов — "манифест". Наличие этого ресурса позволяет программе использовать темы оформления XP. Для того, чтобы программа под Windows XP сохранила свою работоспособность, ресурсы типа "манифест" необходимо обходить третьей дорогой т.е. ни в коем случае их не изменять и не шифровать — иначе совместимости с XP Вам не видать.
  9. Скрытая точка входа в программу через TLS
    Да-да! Именно так! Приложение может получить управление еще до того, как произойдет нормальная передача управления в заданную току входа. Произойти это может в операционных системах Windows XP и 2000, а также, вероятно, и в будущих версиях. А достигается это простой установкой адреса функции в таблице через поле AddressOfCallback (смещение +Ch) в структуре TLS_DIRECTORY.
  10. Имена секций
    Обратите внимание, что практически все грамотные упаковщики и защиты оставляют имя секции ".rsrc". Это связано с тем, что в Windows 98 (о этой фишке в других версиях Windows мне ничего не известно) некоторые системные библиотеки находят и загружают ресурсы не на основании даннных, указанных в заголовке программы, а по имени секции. Имеет смысл учитывать этот факт, если Вы хотите сохранить работоспособность программы.
  11. Таблица импорта
    В Windows XP часто применяется многоуровневый импорт функций.(примером является программа "explorer.exe").

Автор: Фисун А.В.

Оценить эту тему:
1 звезда2 звезды3 звезды4 звезды5 звезд (1 голосов, средний: 4,00 из 5)
Loading...Loading...
Популярность: 3 238 просмотров
Вы можете следить за любыми ответами на эту запись через RSS 2.0 feed. Комментарии в настоящее время закрыты.