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

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

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

Тези таблици, посочени от AddressOfNames, AddressOfNamesOrdinal и AddressOfFunction, членуват в директорията за експортиране на PE структура (DLL).

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

В структурата на процеса има масив от директория за импортиране, която има 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.