00h |
DOS 2 Header
Совместимый заголовок (форматированная часть), будем считать, что его формат всем известен. |
1Ch |
4 байта, выравнивающие форматированную область заголовка с 1Ch до 20h,
никто не мешает им там не присутствовать ;-) но у Микрософта они описаны. Это позволяет заголовку файла иметь красивый размер в 2 параграфа... |
20h |
OEM Identifier & OEM Info
Другими словами, информация о программе, практически никогда не присутствует, однако место должно быть зарезервировано. Я встречал файлы с заполненным полем, наверное их делали люди буквально соблюдающие требования документации от Microsoft. |
3Ch |
Offset to PE Header
Смещение реального PE заголовка в файле, DWord, присутствует именно здесь, ? заголовок выравнивается на 8 байтовую границу относительно начала файла. |
min 40h |
релокейшены программы-заглушки, у стандартного STUB'а их нет.
На это поле указывает ReloOfs заголовка DOS 2 Header, соответственно его значение должно быть >=40h иначе такой файл как кандидат в PE рассматриваться вообще не будет. ;-) Но на самом деле загрузчику безразлично фактическое их положение. |
min 40h + XXh |
собственно говоря, тело DOS программы, иначе говоря STUB'a.
Чаще всего говорит о невозможности запуска, но может содержать в себе очень разрушительные вещи, как то поиск в PATH и запуск файла WIN.COM с указанием имени данного файла, причем без предупреждений, что конечно-же весьма неприятно. 40h есть нижняя граница данного поля, может, собственно говоря, находиться сколь угодно выше, зависит от размера заголовка. |
XXh |
PE Header
Туточки находится заголовок PE файла и, другими словами, начинается сама 32-битная программа, по идее он должен быть выровнен на 8-байтовую границу, пусть так и будет. |
XXh |
Object Table табличка описаний секций файла, подробнее далее. |
XXh |
Image Pages (import info, export info, fixup info, resource info,
debug info, etc...) Остальная часть запускаемого файла... |
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 | Общий размер заголовка |
Base | Size or Type | Name Of field | Brief description |
00h | 08h | Object Name | Имя объекта, остаток заполнен нулями, если имя объекта имеет длину 8 символов, то заключительного 0 нет. Некоторые PE дамперы падают на этом факте. Имя - штука отфонарная и никого ни к чему не обязывает. |
08h | DWord | Virtual Size | виртуальный размер секции, именно столько памяти будет отведено под секцию. Если Virtual Size превышает Physical Size, то разница заполняется нулями, так определяются секции неинициализированных данных (Physical Size = 0) |
0Ch | DWord | Section RVA | размещение секции в памяти, виртуальный ее адрес относительно Image Base. Позиция каждой секции выравнена на границу Object align (степень 2 от 512 до 256М включительно, по умолчанию 64К) и секции упакованы впритык друг к другу, впрочем, можно это не соблюдать. |
10h | DWord | Physical Size | размер секции (ее инициализированной части) в файле, кратно полю File align в заголовке PE Header, должно быть меньше или равно Virtual Size. Играя с этим полем можно добиться некоторых результатов ;-) загрузчик по идее хлопает всю секцию в отведенное ОЗУ |
14h | DWord | Physical Offset | физическое смещение относительно начала EXE файла, выровнено на границу File align поля заголовка PE Header. Смещение используется загрузчиком как seek значение. |
18h | 0Ch | Reserved | зарезервировано для OBJ файла, в экзешниках смысла не имеет |
28h | DWord | Object Flags | битовые флаги секции, см.ниже |
Total Structure size | 2Ch | Общий размер описателя секции |
.text | - сюда Микрософт бросает выполнимый код |
CODE | - а Борланд любит это делать здесь |
.icode | - переходники импорта старых версий TLINK32 |
.data | - Микрософт швыряет данные сюда |
DATA | - а Борланд сюда |
.bss | - неинициализированные данные (равна 0 в файле) |
.CRT | - инициализированные данные C/C++ от Борланда |
.rsrc | - ресурсы |
.idata | - секция импорта |
.edata | - секция экспорта |
.reloc | - таблица настроек |
.tls | - данные на базе которых Windows запускает цепочки |
.rdata | - отладочная информация |
_FREQASM | - посмотрите в KERNEL32, я думаю, и так понятно |
PROTECTED | - это взято из Хасповского сервера, вот так |
. . . . . | - и так далее |
Таблица собственно экспорта | Export Directory Table |
Адресная таблица | Export Address Table |
Таблица указателей на имена | Export Name Table Pointers |
Таблица ординалов | Export Ordinal Table |
Таблица самих имен | Export Name Table |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Flags | зарезервировано на будущее = 0 |
04h | DWord | Time/Date Stamp | время и дата создания экспортных данных |
08h | Word | Major Version |
опять для нас, блин, старший номер версии таблицы экспорта
как хочешь, так и используй |
0Ah | DWord | Minor Version | аналогично, младший |
0Ch | DWord | Name RVA | RVA строки указывающей на имя нашей библиотеки |
10h | DWord | Ordinal Base | начальный номер экспорта, для функций нашей библиотеки, обычно установлено в 1, но не факт |
14h | DWord | Num of Functions | количество функций экспортируемых нашим модулем, является числом элементов массива Address Table см.ниже |
18h | DWord | Num of Name Pointers | число указателей на имена, обычно равно числу функций, но это не так, если у нас есть функции экспортируемые только по номеру |
1Ch | DWord | Address Table RVA | указатель на таблицу адресов (RVA) экспорта |
20h | DWord | Name Pointers RVA | указатель на таблицу указателей на имена экспорта |
24h | DWord | Ordinal Table RVA | указатель на таблицу ординалов экспорта, данный массив по индексам параллелен Name Pointers, элементами являются слова |
Total Structure size | 28h | Общий размер таблички экспорта |
Каталог импорта | Import Directory Table |
Таблица ссылок на имена | LookUp Table |
Таблица имен | Hint-Name Table |
Таблица адресов импорта | Import Address Table |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Import LookUp | Содержит ссылку на табличку RVA указывающих на соответствующие Hint-Name's или непосредственно ординал ипортируемого входа |
04h | DWord | Time/Date Stamp | Отметка о времени создания, часто содержит 0 (У-уф) |
08h | DWord | Forward Chain | ? связано с возможностью передачи экспорта в другие библиотеки. Обычно равно 0FFFFFFFFh |
0Ch | DWord | Name RVA | Ссылка на библиотеку с которой нам необходимо поиметь вызовы представлена в виде ASCIZ. |
10h | DWord | Addres Table RVA | Ссылка на табличку адресов импорта, заполняется системой при связывании |
Total Structure size | 14h | Общий размер таблички импорта |
Word Hint |
Размер произвольный ASCIZ Service Name |
Byte PAD |
Строка закрывается нулевым байтом, и при необходимости ее длинна выравнивается до четной границы еще одним 0 |
Таблица разделов цепочек | TLS Directory Table |
Данные цепочек | TLS Data |
Индексные переменные | Index Variables |
Адреса обратных вызовов | CallBack Addresses |
Base | Size or Type | Name Of field | Brief description |
00h | Dword | Start Data Block VA | Виртуальный адрес начала блока данных цепочки |
04h | Dword | End Data Block VA | Виртуальный адрес конца блока данных цепочки |
08h | Dword | Index VA | Виртуальный адрес индексной переменной, используемой для доступа к локальному блоку данных цепочки |
0Ch | Dword | CallBack Table VA | Виртуальный адрес таблицы обратных вызовов |
Total Structure size | 10h | Общий размер таблички TLS |
Каталог ресурсов | Resources Directory Table |
Данные ресурсов | Resources Data |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Flags | Пока не используются, должны быть сброшены в 0 |
04h | DWord | Time/Date Stamp | Дата и время подключения ресурсов от ресурсного компилятора |
08h | Word | Major Version | Уугу, опять для нас номер версии, старший по счету |
0Ah | Word | Minor Version | --//-- и младший |
0Ch | Word | Name Entry | Количество входов в таблицу имен ресурсов, таблица располагается в самом начале массива входов и содержит строковые имена ассоциируемые с ресурсами |
0Eh | Word | ID_Num Entry | Количество 32-битовых идентификаторов ресурсов |
Total Structure size | 10h | Размер каталога ресурсов |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Name RVA or Res ID | Поле содержит либо идентификатор ресурса, либо указатель на его имя в таблице имен ресурсов |
04h | DWord | Data Entry RVA or SubDirectory RVA | Указывает либо на данные, либо на еще одну таблицу входов ресурсов, 31-бит сброшенный в 0 указывает на то, что это ссылка на данные и наоборот |
Total Structure size | 08h | Размер ресурсного входа |
File Name: File Type: |
Length Word |
Unicode String unpredictable |
длинна строки должна быть кратна 2 (это очевидно) Все такие строковые объекты часто хранят вместе |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Data RVA | Указатель на реально расположенные данные относительно Image Base |
04h | DWord | Size | Размер ресурсных данных |
08h | DWord | CodePage | Кодовая страница |
0Ch | DWord | Reserved | Не используется и устанавливается в 0 |
Total Structure size | 10h | Размер указателя данные ресурса |
Тип | Имя | Язык | Данные ресурса |
00000001 | 00000001 | 0 | 00010001 |
00000001 | 00000001 | 1 | 10010001 |
00000001 | 00000002 | 0 | 00010002 |
00000001 | 00000003 | 0 | 00010003 |
00000002 | 00000001 | 0 | 00010001 |
00000002 | 00000002 | 0 | 00020002 |
00000002 | 00000003 | 0 | 00020003 |
00000002 | 00000004 | 0 | 00020004 |
00000009 | 00000001 | 0 | 00090001 |
00000009 | 00000009 | 0 | 00090009 |
00000009 | 00000009 | 1 | 10090009 |
00000009 | 00000009 | 2 | 20090009 |
Смещение | Данные |
0000: | 00000000 00000000 00000000 00030000 (3 входа в этом каталоге) |
0010: | 00000001 80000028 (Тип #1, Подкаталог по смещению 0x28) |
0018: | 00000002 80000050 (Тип #2, Подкаталог по смещению 0x50) |
0020: | 00000009 80000080 (Тип #9, Подкаталог по смещению 0x80) |
0028: | 00000000 00000000 00000000 00030000 (3 входа в этом каталоге) |
0038: | 00000001 800000A0 (Имя #1, Подкаталог по смещению 0xA0) |
0040: | 00000002 00000108 (Имя #2, дескриптор данных по смещению 0x108) |
0048: | 00000003 00000118 (Имя #3, дескриптор данных по смещению 0x118) |
0050: | 00000000 00000000 00000000 00040000 (4 входа в этом каталоге) |
0060: | 00000001 00000128 (Имя #1, дескриптор данных по смещению 0x128) |
0068: | 00000002 00000138 (Имя #2, дескриптор данных по смещению 0x138) |
0070: | 00000003 00000148 (Имя #3, дескриптор данных по смещению 0x148) |
0078: | 00000004 00000158 (Имя #4, дескриптор данных по смещению 0x158) |
0080: | 00000000 00000000 00000000 00020000 (2 входа в этом каталоге) |
0090: | 00000001 00000168 (Имя #1, дескриптор данных по смещению 0x168) |
0098: | 00000009 800000C0 (Имя #9, Подкаталог по смещению 0xC0) |
00A0: | 00000000 00000000 00000000 00020000 (2 входа в этом каталоге) |
00B0: | 00000000 000000E8 (Язык 0, дескриптор данных по смещению 0xE8) |
00B8: | 00000001 000000F8 (Язык 1, дескриптор данных по смещению 0xF8) |
00C0: | 00000000 00000000 00000000 00030000 (3 входа в этом каталоге) |
00D0: | 00000001 00000178 (Язык 0, дескриптор данных по смещению 0x178) |
00D8: | 00000001 00000188 (Язык 1, дескриптор данных по смещению 0x188) |
00E0: | 00000001 00000198 (Язык 2, дескриптор данных по смещению 0x198) |
00E8: |
000001A8 (По смещению 0x1A8, для Тип #1, Имя #1, Язык #0)
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
00F8: |
000001AC (По смещению 0x1AC, для Тип #1, Имя #1, Язык #1)
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0108: |
000001B0 (По смещению 0x1B0, для Тип #1, Имя #2,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0118: |
000001B4 (По смещению 0x1B4, для Тип #1, Имя #3,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0128: |
000001B8 (По смещению 0x1B8, для Тип #2, Имя #1,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0138: |
000001BC (По смещению 0x1BC, для Тип #2, Имя #2,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) 0 |
0148: |
000001C0 (По смещению 0x1C0, для Тип #2, Имя #3,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0158: |
000001C4 (По смещению 0x1C4, для Тип #2, Имя #4,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0168: |
000001C8 (По смещению 0x1C8, для Тип #9, Имя #1,
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0178: |
000001CC (По смещению 0x1CC, для Тип #9, Имя #9, Язык #0
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0188: |
000001D0 (По смещению 0x1D0, для Тип #9, Имя #9, Язык #1
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
0198: |
000001D4 (По смещению 0x1D4, для Тип #9, Имя #9, Язык #2
00000004 (4 байта данных) 00000000 (кодовая страница) 00000000 (зарезервировано) |
01A8: | 00010001 |
01AC: | 10010001 |
01B0: | 00010002 |
01B4: | 00010003 |
01B8: | 00020001 |
01BC: | 00020002 |
01C0: | 00020003 |
01C4: | 00020004 |
01C8: | 00090001 |
01CC: | 00090009 |
01D0: | 10090009 |
01D4: | 20090009 |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Page RVA | Указатель на страницу применения настроек перемещений |
04h | DWord | Block Size | Размер блока настроек (с заголовком) |
08h | Word | TypeOffset Record | Массив записей настроек, их переменное количество |
Total Structure size | ... | таблица имеет переменный размер |
15 . . . 12 Type |
11 . . . 0 Offset |
Биты слова, Type указывает на тип настройки, а Offset на ее смещение внутри 4-килобайтового блока применимости настроек. |
0h - | адрес абсолютный и никаких изменений производить не требуется. |
1h - | добавить старшие 16 битов Дельты к 16 битовому полю находящемуся по смещению Offset. 16 битовое поле представляет старшие биты 32-битового слова. |
2h - | добавить младшие 16 битов Дельты по смещению Offset. 16-битовое поле представляет младшую половину 32-битового слова. Данная запись настройки присутствует только на RISC машине когда Object align не является по умолчанию 64К. |
3h - | прибавляет 32-битовое Дельта к 32-битовому значению. |
4h - | настройка требует полного 32-битового значения. Старшие 16-бит берутся по адресу Offset, а младшие в следующем элементе TypeOffset Все это объединяется в знаковую переменную, затем добавляется 32-битовое дельта и DWord 8000h. Старшие 16 бит получившегося значения сохраняются по адресу Offset в 16-битовом поле. |
5h - | ? что-то связанное с MIPS. |
Base | Size or Type | Name Of field | Brief description |
00h | DWord | Debug Flags | Не используются и установлены в нулевое значение |
04h | DWord | Time/Date Stamp | Дата и время создания отладочной информации |
08h | Word | Major Version | Старший номер версии отладочной информации |
0Ah | Word | Minor Version | Младший номер версии --//-- |
0Ch | DWord | Debug Type | Тип информации для отладчика |
10h | DWord | Data Size | Размер в байтах данных для отладки без размера заголовка |
14h | DWord | Data RVA | Адрес расположения отладочных данных в ОЗУ |
18h | DWord | Data Seek | Смещение к отладочным данным в файле |
Total Structure size | 1Ch | Размер элемента каталога отладки |