2010-02-02 3 views
3

Я видел странное значение помещается в 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?

+2

Почему вы обманываете программные заголовки? Это может помочь, если мы поймем, почему вам все равно, что там. И что это за платформа? –

+0

EXE = платформа Windows? – tur1ng

+0

Вот документ, который может вам помочь: http://www.thehackerslibrary.com/?p=377 –

ответ

3

DWORD со смещением 0x3c - это смещение нового заголовка EXE, иначе IMAGE_NT_HEADERS. Поэтому, если вы измените значение там, загрузчик PE не сможет найти новый заголовок EXE.

+0

Я думаю, что Matteo Italia дал ссылку в своем ответе: http://www.microsoft.com/whdc/system/platform /firmware/PECOFFdwn.mspx. – Atempcode

4

Первая часть PE - заглушка MSDOS; при 0x3C (где находится ваш «A8») есть смещение к сигнатуре файла PE. Если вы его обнуляете, загрузчик не сможет найти подпись PE и откажется загрузить его (или загрузить его как исполняемый файл MS-DOS, я не пытался). Для получения дополнительной информации см. PE format specifications.

3

Я подозреваю, что это смещение нового PE-заголовка, первые 30 нечетных байтов - это заголовок MS-DOS, который смещается в файл, в котором находится «A8», соответствует полю в структуре _IMAGE_DOS_HEADER, называемому LONG e_lfanew; // File address of new exe header ; Это то, что значение «A8» будет частью нового IMAGE_NT_HEADER, который содержит эту информацию

  • DWORD Signature;
  • _IMAGE_FILE_HEADER FileHeader;
  • _IMAGE_OPTIONAL_HEADER ДополнительноHeader;

Первые два байта - это исходный заголовок MS-DOS в исполняемый файл, как показано этой константой: WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ; IMAGE_NT_HEADER имеет эту подпись, чтобы определить, что она является исполняемым для платформ NT DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00;

Вы найдете всю эту информацию в файле заголовка pe.h.

Что произошло, вы уничтожили значение «A8», загрузчик не смог найти IMAGE_NT_HEADER и, следовательно, не удалось.

 Смежные вопросы

  • Нет связанных вопросов^_^