Как получить список экспортируемых функций DLL
Сегодня разберем, как получить список экспортируемых функций динамических библиотек. Лично я использую эти данные для формирования баз подсветки синтаксиса и автодополнения редактора Sublime Text. Наверняка можно придумать и другие применения.Формат PE-файлов, как и таблицы экспорта, неплохо документирован на многих языках, эту информацию легко найти в интернетах. Несмотря на это, FASM про нужные нам структуры ничего не знает. Это привычное явление.
Code (Assembler) : Убрать нумерацию
- struct LOADED_IMAGE
- ModuleName dd ?
- hFile dd ?
- MappedAddress dd ?
- FileHeader dd ?
- LastRvaSection dd ?
- NumberOfSections dd ?
- Sections dd ?
- Characteristics dd ?
- fSystemImage db ?
- fDOSImage db ?
- fReadOnly db ?
- Version db ?
- Links rd 2
- SizeOfImage dd ?
- ends
- struct IMAGE_EXPORT_DIRECTORY
- Characteristics dd ?
- TimeDateStamp dd ?
- MajorVersion dw ?
- MinorVersion dw ?
- Name dd ?
- Base dd ?
- NumberOfFunctions dd ?
- NumberOfNames dd ?
- AddressOfFunctions dd ?
- AddressOfNames dd ?
- AddressOfNameOrdinals dd ?
- ends
- IMAGE_DIRECTORY_ENTRY_EXPORT = 0
Экспорт будем обрабатывать по списку функций, которые экспортируются в том числе по имени, а не только по ординалу. Функцией ImageRvaToVa пересчитываем виртуальный адрес AddressOfNames относительно заголовка загруженного образа в виртуальный адрес, таким образом получая адрес в памяти, с которого начинается таблица имен экспортируемых функций.
Затем, узнав количество функций из поля NumberOfNames, поочередно перебираем в таблице указатели на строки с именами функций. Для каждого адреса также надо также выполнять пересчет RVA в VA. Перебор продолжается, пока не достигнем конца таблицы. В виде кода это выглядит примерно так:
Code (Assembler) : Убрать нумерацию
- ; Загрузить динамическую библиотеку в память
- invoke MapAndLoad,dllname,NULL,l_image,TRUE,TRUE
- invoke ImageDirectoryEntryToData,\
- [l_image.MappedAddress],FALSE,\
- IMAGE_DIRECTORY_ENTRY_EXPORT,\
- tmp
- or eax,eax
- jz loc_exit
- ; EAX -> ExportDirectory
- mov ebx,eax
- ; Получить адрес таблицы экспорта
- mov [tmp],0
- invoke ImageRvaToVa,[l_image.FileHeader],[l_image.MappedAddress],\
- [ebx+IMAGE_EXPORT_DIRECTORY.AddressOfNames],tmp
- ; EDI -> таблица экспорта
- mov edi,eax
- ; Начинаем с первого элемента
- xor esi,esi
- loc_loop:
- ; Вычислить указатель на имя экспортируемой функции
- mov eax,esi
- shl eax,2
- add eax,edi
- mov [tmp],0
- invoke ImageRvaToVa,[l_image.FileHeader],[l_image.MappedAddress],\
- [eax],tmp
- ; EAX -> имя экспортируемой функции
- ...
- ; действия с полученным именем
- ...
- ; Следующая запись
- inc esi
- ; Все записи обработаны?
- cmp esi,[ebx+IMAGE_EXPORT_DIRECTORY.NumberOfNames]
- jb loc_loop
- loc_exit:
- ; Выгрузить файл
- invoke UnMapAndLoad,l_image
Просмотров: 867 | Комментариев: 4
Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(28.08.2023 в 00:38):
Этак для каждой dll придется кусок msdn таскать :) Получится типа TypeLib, только еще заковыристей. Хотя соглашусь, было бы неплохо. Но MS изначально этот момент не стандартизировали, а сейчас уже, по прошествии стольких лет, время упущено.
Grey
(24.08.2023 в 14:54):
жаль только по аргументам инфы нет
ManHunter
(24.08.2023 в 12:13):
Да вообще 99,99% чего бы то ни было уже где-то и кем-то написано. Мне же интересно не "где взять готовое", а "как это работает".
Grey
(24.08.2023 в 12:09):
Прикольно!
П.С.
Такой функционал есть у FASM Editor 2.0
Автор уже лет как 10 забросил эту тему.
П.С.
Такой функционал есть у FASM Editor 2.0
Автор уже лет как 10 забросил эту тему.
Добавить комментарий
Заполните форму для добавления комментария