Позвольте мне подытожить для вас многое. Когда вы загружаете библиотеку, например, Milad.dll, а затем пытаетесь вызвать функцию из нее, например MPrint, динамический загрузчик операционной системы Windows должен разрешить адрес функции MPrint и затем вызвать ее.

Как ОС может разрешить адрес этой функции?

Windows проходит через несколько действительно сложных вещей, и я хочу рассказать вам эти шаги простым языком. Динамический загрузчик ОС Windows для разрешения адреса функции в библиотеках DLL должен проверить таблицу имен импорта (INT), таблицу порядковых номеров импорта (IOT) и таблицу адресов импорта (IAT).

Эти таблицы указаны членами AddressOfNames, AddressOfNamesOrdinal и AddressOfFunction в каталоге экспорта PE-структуры (DLL).

После того, как ОС загрузит Milad.dll в адресное пространство целевого процесса с помощью LoadLibrary, она заполнит таблицы INT, IOT и IAT их RVA в целевом адресном пространстве процесса с помощью GetProcAddress и произведет некоторые вычисления.

В структуре процесса есть массив Import Directory, который имеет OriginalFirstThunk, TimeDateStamp, ForwarderChain, Name, FirstThunk, которые эти члены указывают на некоторые важные адреса.

  1. Имя в каталоге импорта (Image_Import_Descriptor) указывало на имя библиотеки DLL, которую процесс пытается вызвать, в этом примере этой DLL является Milad.dll.
  2. OriginalFirstThunk указывал на таблицу имен импорта, которая включает имена функций, экспортируемых Milad.Dll. Функции в этой таблице имеют уникальный индекс, который загрузчик берет этот индекс и переходит к следующему шагу и ссылается на Импорт порядковой таблицы с этим индексом и берет значение, которое есть в этом индексе Импортировать порядковую таблицу, которое является другим целочисленным значением.
  3. FirstThunk - еще один важный элемент, указывающий на IAT. на предыдущем шаге динамический загрузчик принимает целочисленное значение через IOT. это значение является порядковым номером, который динамический загрузчик обращается к IAT с этим значением. В этой таблице есть адрес в значении индекса, который динамический загрузчик получает от INT-IOT. После этих шагов, когда динамический загрузчик обнаруживает правильный адрес функции, он помещает этот адрес в таблицу адресов импорта для функции MPrint. Таким образом, процесс может вызывать эту функцию по ее адресу.

Это простое объяснение сложных вещей, которые загрузчик выполняет для разрешения адреса функций в библиотеках DLL через элементы Name, OFT (INT) и FT (IAT) в Image_Import_Descriptor.