Ссылка Спецификация Microsoft PE и COFF была полезной, но немного сложной. Вот мой результат:
Каждая программа Windows имеет программный блок DOS, показывающий текст вроде «Эта программа не может быть запущена под DOS» или аналогичный текст. Длина блока DOS может быть разной. Раздел "настоящая Windows программа" начинается позже. Адрес начального смещения программы Windows закодирован в байтах смещения 0x3 c и 0x3d. 0x3d содержит значение hi, а 0x3 c значение lo. Таким образом, вам нужно вычислить 256 * (0x3d) + (0x3 c), чтобы получить адрес смещения реальной программы Windows.
Настоящая программа Windows начинается с четырех байтов: «PE» , за которым следуют два нулевых байта. Пятый и шестой байт - это 0x4c01, если это программа Win32, и 0x6486, если это программа Win64.
Чтобы проверить, является ли программа текстовой, вы должны прочитать байт смещения (отсчитывается от «PE» = 0x00 ) 0x5 c. Значение 3 означает текстовую, 2 означает оконную GUI программу.