Образ PE-программы хранящийся в дисковом файлеОбраз PE-программы, хранящийся в дисковом файле, разделен на логические секторы. Размер такого сектора указан в поле «File — Alignment» заголовка. Каждый структурный элемент программы размещается с начала некоего логического сектора, и под него всегда выделяется целое число секторов. Даже если содержимое какого-нибудь структурного элемента реально занимает мало места, под этот элемент все равно будет выделен целый логический сектор. После загрузки программы в память она также оказывается разделена на логические секторы, но размер этих секторов другой. Он указывается в поле «SectionAlignment» заголовка, и его типичные значения — 4096 или 65 536 байтов. Все структурные элементы программы, включая «область заголовков» , присутствуют и в файле, и в памяти, причем если программный файл сгенерирован «нормальным» компоновщиком, то размещаются в одном и том же порядке. Адрес, соответствующий началу программы в памяти, обычно соответствует значению поля «Image — Base», но может и отличаться от него. В этом случае становится актуальной таблица перемещаемых ссылок, на которую указывает поле «FixupsTableRVA» таблицы объектов. Впрочем, не без оснований считается, что таблица перемещаемых ссылок присутствует только у динамических библиотек, которым «гулять» по памяти сам Билл Гейтс велел. А обычные исполняемые программы такой таблицы просто не содержат, и если по какой-либо причине у них не получается загрузиться по адресу, указанному в поле «ImageBase», то они не загружаются вообще. Для программ, ориентированных исключительно на Windows NT, в поле «ImageBase» может быть указано какое-нибудь «маленькое» значение, и поэтому в Windows 9X они не запустятся. Таких программ очень мало, чаще всего это системные утилиты, входящие в дистрибутивную поставку Windows NT. Напротив, «универсальные» программы обычно имеют в этом поле значение, большее или равное 400000h, и такие программы смогут стартовать в любой операционной системе.

Еще интересные статьи :