|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Формат исполняемых PE-файлов
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | Общий размер заголовка |
Все прочие биты зарезервированы и желательно их установить в 0 значение, но можно этого и не делать ;-)
|
Опрос |
|
|
|
Конкурсы
|
|
|
| Реклама |
|
|
Web дизайн: Бурлаков Михаил
Web программирование: Бурлаков Михаил