Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Формат исполняемых PE-файлов
Заголовок PE-файла (PE header)


Заметки:

  • VA есть виртуальный адрес, который уже базирован на смещение Image Base, прочитанное из PE Header'а. RVA есть относительный адрес ссылающийся на Image Base.
  • RVA в PE Header имеющий нулевое значение указывает на то, что соответствующее поле не используется (что многие не проверяют IMHO).
  • Все используемые страницы (Image pages) выравнены дополнением нулями до границы File align (опять же, выравнивать можно чем угодно, и не только нулями :-). Базы всех прочих таблиц и структур должны быть выравнены на DWord (4 байта) границу. Таким образом, все VA и RVA должны находиться на 32-битной границе [имеется ввиду на границе размещения двойных слов, начиная от 0 в файле, так что читайте смело DWord'ами ;-) в жизни не все так просто - прим. мое]. Все таблицы и структурные поля должны быть выравнены на их "родную" границу, за возможным исключением Debug Info.
А теперь поехали...
PE Header
Base Size or Type Name Of field Brief description
00h DWord Signature Bytes Сигнатурка того, что этот файл собственно говоря является PE - должна быть 4550h, иначе - 'PE',0h,0h; два последних байта под что-то-там Микрософт зарезервировала (и проверяет их равенству на 0!).
04h Word CPU Type это поле указывает на предпочтительный ;-) тип процессора, на котором желательно запускать данную программу, вы редко увидите что-либо отличное от 14Ch -> i386
06h Word Num of Objects это поле указывает на число реальных входов в Object Table
08h DWord Time/Date Stamp используется для хранения даты и времени создания/модификации линкером
0Ch DWord Pointer to COFF table дополнительный указатель определяющий местонахождение отладочной COFF таблицы в файлах, отладочную информацию лучше всего искать по другому
10h DWord COFF table size кол-во символов в COFF таблице
14h Word NT Header Size размер заголовка PE файла начиная с поля Magic, название взято у программы Hiew, таким образом, общий размер заголовка PE файла составляет NT Header Size + 18h
16h Word Flags указывает на предназначение программы, конкретное значение флагов см.ниже
18h Word Magic поле указывает на основное предназначение программы. абсолютно всем наплевать в него
1Ah Byte Link Major старший номер версии использовавшегося при создании линкера
1Bh Byte Link Minor младший номер версии использовавшегося при создании линкера (эти 2 поля загрузчик пока игнорирует)
1Ch DWord Size of Code размер именно программного кода в файле, KERNEL использует это значение для фактического отведения памяти под загружаемую программу, установка этого значения слишком маленьким приведет к выдаче идиотского сообщения о нехватке памяти, хотя ее может быть валом
20h DWord Size of Init Data размер секции инициализированных данных, очевидно не используется в Windows'95, но используется в NT, назначение аналогично приведенному выше
24h DWord Size of UnInit Data размер секции неинициализированных данных, сложно сказать, как эти 3 поля корреспондируют между собой, но лучше с ними по честному ;-) явно видно, что формат разрабатывали одни, а реализовывали его другие. Рекомендую изучить регионы памяти и VirtualXXX функции
28h DWord Entry point RVA адрес, относительно Image Base по которому передается управление при запуске программы или адрес инициализации/завершения библиотеки
2Ch DWord Base of Code RVA секции, которая содержит программный код (как будто бы она одна единственная ;-) ) судя по всему никем не используется (но установлено верно)
30h DWord Base of Data RVA секции содержащей якобы данные, в реальных экзешниках указывает и на .data и на .bss и еще бог знает куда, вряд ли кем-нибудь используется
34h DWord Image Base виртуальный начальный адрес загрузки программы (ее первого байта). Должен быть на границе 64 Кб (связано с системой памяти Windows'95)
38h DWord Object align выравнивание программных секций, должен быть степенью 2 между 512 и 256М включительно, так же связано с системой памяти. При использовании других значений программа не загрузится.
3Ch DWord File align фактор используемый для выравнивания секций в программном файле. В байтовом значении указывает на границу на которую секции дополняются 0 при размещении в файле. Большое значение приводит к нерациональному использованию дискового пространства, маленькое увеличивает компактность, но и снижает скорость загрузки. Должен быть степенью 2 в диапазоне от 512 до 64К включительно. Прочие значения вызовут ошибку загрузки файла. Я так думаю, что размер файла штука более важная.
40h Word OS Major старший номер версии операционки необходимый для запуска программы. (нулевое значение не позволяет запустить программу, остальные игнорируются проверялось на OSR2)
42h Word OS Minor младший номер версии операц.
44h Word USER Major пользовательский номер версии, задается пользователем при линковке программы и им же и используется
46h Word USER Minor аналогично, младший номер
48h Word SubSys Major старший номер версии подсистемы, черт его знает как он использается, по моему всяких версий уже через край
4Ah Word SubSys Minor аналогично, младший номер
4Ch DWord Reserved судя по всему так оно и есть
50h DWord Image Size виртуальный размер в байтах всего загружаемого образа, вместе с заголовками, кратен Object align
54h DWord Header Size общий размер всех заголовков: DOS Stub + PE Header + Object Table
58h DWord File CheckSum контрольная сумма всего файла, опять же как и в DOS'е ее никто не контролирует, а линкер ее ставит в 0 при линковке Предполагалось ее рассчитывать как инверсию суммы всех байтов файла.
5Ch Word SubSystem операционная подсистема необходимая для запуска данного файла (GUI, консоль...)
5Eh Word DLL Flags указывает на специальные потребности при загрузке, начиная с NT 3.5 устарел и не используется
60h DWord Stack Reserve Size память требуемая для стека приложения, память резервируется, но выделяется только Stack Commit Size байтов, следующая страница является охранной. Когда приложение достигает этой страницы, то страница становится доступной, а следующая страница - охранной, и так до достижения нижней границы, после чего Windows'95 убивает программу с воплями об исключении у нее в стеке
64h DWord Stack Commit Size объем памяти отводимой в стеке немедленно после загрузки
68h DWord Heap Reserve Size максимальный возможный размер локального хипа
6Ch DWord Heap Comit Size отводимый при загрузке хип
70h DWord Loader Flags ? начиная с NT 3.5 объявлено неиспользуемым, назначение неясно, но в целом связано с поддержкой отладки
74h DWord Num of RVA and Sizes указывает размер массива VA/Size который следует ниже, данная фича зарезервирована под будущие расширения формата. В данный момент его значение всегда равно 10h
78h DWord Export Table RVA RVA адрес таблицы экспорта
7Ch DWord Export Data Size размер таблицы экспорта
80h DWord Import Table RVA RVA адрес таблицы импорта
84h DWord Import Data Size размер таблицы импорта
88h DWord Resource Table RVA RVA адрес таблицы ресурсов
8Ch DWord Resource Data Size размер таблицы ресурсов
90h DWord Exception Table RVA RVA адрес таблицы исключений
94h DWord Exception Data Size размер таблицы исключений
98h DWord Security Table RVA ? адрес таблицы безопасности
9Ch DWord Security Data Size ? размер таблицы безопасности
A0h DWord Fix Up's Table RVA RVA адрес таблицы настроек
A4h DWord Fix Up's Data Size размер таблицы настроек
A8h DWord Debug Table RVA RVA адрес таблицы отладочной инфы
ACh DWord Debug Data Size размер таблицы отладочной инфы
B0h DWord Image Description RVA RVA адрес строки описани модуля
B4h DWord Description Data Size размер строки описания модуля
B8h DWord Machine Specific RVA ? адрес таблицы значений специфичных для микропроцессора
BCh DWord Machnine Data Size ? размер таблицы значений специфичных для микропроцессора
C0h DWord TLS RVA указатель на локальную область данных цепочек
C4h DWord TLS Data Size размер области данных цепочек
C8h DWord Load Config RVA ?
CCh DWord Load Config Data Size ?
D0h 08h Reserved ?
D8h DWord IAT RVA ? мною это поле обнаружено только в мультимедийных файлах системы Windows'95, это SNDREC32, CDPLAYER, MPLAYER. оно указывает на таблицу адресов импорта в файле (помимо структуры импорта) писал эти программы один человек и чего он хотел...
используется в NT, в Windows'95 судя по всему нет
DCh DWord IAT Data Size ? размер описанного поля
E0h 08h Reserved ?
E8h 08h Reserved ?
F0h 08h Reserved ?
Total Structure size F8h Общий размер заголовка

CPU Type имеет следующие значения:
  • 0000h - а черт его знает
  • 014Ch - i386
  • 014Dh - i486
  • 014Eh - i586
  • 0162h - MIPS Mark I (R2000, R3000)
  • 0163h - MIPS Mark II (R6000)
  • 0166h - MIPS Mark III (R4000)
Flags имеет следующие битовые значения:
  • 0000h - это программа
  • 0001h - файл не содержит перемещений и таблицы перемещаемых элементов
  • 0002h - образ в файле можно запускать
    Если этот бит не установлен, то это обычно указывает на ошибку обнаруженную на этапе линковки, или же на то, что код был инкрементально отлинкован и, следовательно, не может быть запущен. [инкрементальная линковка - частичная линковка кода при изменении участка программы, а не тотальная перекомпиляция проекта, что подразумевается здесь - сказать очень трудно, скажем так - ОШИБКА!]
  • 0200h - грузить фиксированно
    Указывает на то, что программу можно грузить только по адресу, записанному в Image Base, если это невозможно, то такой файл лучше вообще не запускать.
  • 2000h - это библиотека
Magic имеет следующие значения:
  • 0107h - программа должна выполняться в ПЗУ (что за черт?)
  • 010Bh - нормальная программа для ОЗУ
(на самом деле можно ставить любое значение, программа грузится нормально)

SubSystem имеет следующие значения:
  • 0000h - а черт его знает
  • 0001h - Native, пошли вы все к такой-то матери, никто не нужен
  • 0002h - Windows GUI, т.е. окошечная
  • 0003h - Windows Character (консольное приложение)
  • 0005h - OS/2 Character
  • 0007h - Posix Character (формат PE с юниховского передран, вот и. . .)
DLL Flags имеет следующие битовые значения:
  • 0001h - инициализация библиотеки на процесс
  • 0002h - завершение библиотеки на процесс
  • 0004h - инициализация библиотеки на нить (цепочку)
  • 0008h - завершение библиотеки на нить (цепочку)

Все прочие биты зарезервированы и желательно их установить в 0 значение, но можно этого и не делать ;-)

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz