Странное значение в заголовке EXE
Я видел странное значение, помещенное в заголовок EXE
00000000 :4D 5A 90 00 03 00 00 00 - 04 00 00 00 FF FF 00 00
00000010 :B8 00 00 00 00 00 00 00 - 40 00 00 00 00 00 00 00
00000020 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00
00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 <-
Я не знаю что A8
делать там, но если я заменю его нулями, моя программа не будет выполняться.
Одним словом: что это?
Кроме того, не могли бы вы дать мне ссылку на полный заголовок MS DOS?
3 ответа
DWORD со смещением 0x3c - это смещение нового EXE-заголовка, также известного как IMAGE_NT_HEADERS. Поэтому, если вы измените значение там, загрузчик PE не сможет найти новый заголовок EXE.
Я подозреваю, что это смещение к новому PE-заголовку, первые 30 нечетных байтов - это заголовок MS-DOS, который смещается в файл, в котором находится "A8", соответствует полю в структуре _IMAGE_DOS_HEADER
называется LONG e_lfanew; // File address of new exe header
; Это то, что значение "А8" будет частью нового IMAGE_NT_HEADER
который содержит эту информацию
- DWORD Подпись;
- _IMAGE_FILE_HEADER FileHeader;
- _IMAGE_OPTIONAL_HEADER OptionalHeader;
Самые первые два байта являются исходным заголовком MS-DOS в исполняемом файле, как показано этой константой: WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
; IMAGE_NT_HEADER имеет эту подпись, чтобы определить, что это исполняемый файл для платформ NT DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
;
Вы найдете всю эту информацию в заголовочном файле pe.h
,
Что случилось, вы уничтожили значение 'A8', загрузчик не смог найти IMAGE_NT_HEADER
и, следовательно, не удалось.
Первая часть PE - это заглушка MSDOS; в 0x3C (где ваш "A8") есть смещение к подписи файла PE. Если вы обнуляете его, загрузчик не сможет найти сигнатуру PE и откажется загружать ее (или загрузить как просто исполняемый файл MS-DOS, я не пробовал). Для получения дополнительной информации см. Спецификации формата PE.