64-битный PE-файл без таблицы поиска импорта - PullRequest
0 голосов
/ 14 мая 2019

У меня есть 64-битное приложение Hello World для Windows. Он был создан с использованием плоского ассемблера (fasm). У меня больше нет исходного кода, но это очень простой пример, который вызывает:

  1. MessageBoxA ()
  2. ExitProcess ()

Я открыл файл в редакторе PE (CFF Explorer) и увидел: RVA для «Import Lookup Table» в «Import Directory Table» равно 0x0. Тем не менее RVA «Import Address Table» существует, содержит указатели на имена API, и Windows 10 запускает программу без нареканий.

Мой вопрос: существует ли спецификация PE, которая определяет этот тип двоичного файла? У других компиляторов такое же поведение? Это вещь PE +?

Технически, отсутствующая «Таблица поиска импорта» не является большой проблемой, потому что те же данные доступны в «Таблице адресов импорта» (хотя и перезаписываются загрузчиком PE). Но документация Microsoft (https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-idata-section) не относится к разделу .idata такого рода.

1 Ответ

1 голос
/ 15 мая 2019

Я писал какой-то инструмент, который анализирует .EXE-файлы, и я тоже видел такие .EXE-файлы.

Причина, по которой такие файлы существуют, указана в документации Microsoft, которую вы связали:

RVA таблицы поиска импорта.... (Название "Характеристики" используется в Winnt.h, но больше не описывает это поле.)

Для меня предложение в скобках и слова "«больше не означает», что более старые версии Windows использовали поле «RVA таблицы поиска импорта» для хранения различного рода информации, и поэтому файлы .EXE, написанные для этих версий Windows, не имели таблицы поиска импорта.

И поскольку более новыеВерсии Windows должны иметь возможность запускать старые исполняемые файлы, последние версии Windows по-прежнему принимают исполняемые файлы, которые используют это поле для получения другой информации.

А с другой стороны, некоторые компоновщики или компиляторы, похоже, по-прежнему заполняют это поленоль, потому что Windows по-прежнему принимает значение ноль здесь.

Однако, насколько я понимаю, только 32-разрядные версии Windows использовали это поле для хранения различного рода информации.Если это так, то должны быть действительными только 32-битные .EXE-файлы (записанные для более старых версий Windows) с нулевым значением этого поля.

Это означает, что Microsoft может отключить поддержку 64-битных .EXE-файлов.которые имеют это поле в ноль в будущем.А это значит, что 64-битный компоновщик или компилятор, устанавливающий это поле в ноль, глючит.

...