Подготовка загружаемых сегментов ELF-образа для создания процесса (elf_api.h)
API определен в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK.
API позволяет использовать ELF-образ, чтобы создать буферы MDL с загружаемыми сегментами для последующего отображения этих сегментов на виртуальную память нового процесса.
Сведения о функциях API приведены в таблице ниже.
Использование API
Типовой сценарий использования API включает следующие шаги:
- Создать объект, описывающий ELF-образ вызовом функции
KnElfOpen().ELF-образ нужно поместить в буфер, указатель на который функция
KnElfOpen()принимает через параметрimg. Если ELF-образ некорректен, функция завершится с ошибкой, и объект, описывающий ELF-образ, не будет создан. Также корректность ELF-образа можно проверить до выполнения этого шага вызовом функциюKnElfValidate(). - Создать буферы MDL с загружаемыми сегментами ELF-образа для последующего отображения этих сегментов на виртуальную память нового процесса.
Чтобы выполнить этот шаг, нужно вызвать функцию
KnElfCreateVmSegEx(), задавая через входной параметрdescrобъект, описывающий ELF-образ.При использовании функции
KnElfCreateVmSegEx()нужно учитывать, что таблица символов.symtabи таблица строк .strtabсчитаются отдельными загружаемыми сегментами ELF-образа. То есть в массиве структур, адрес которого передается через выходной параметрsegs, и в числе загружаемых сегментов, передаваемом через выходной параметрsegsCount, таблица символов и таблица строк учитываются наряду с сегментами типаLOAD. Функция может создать буфер MDL с таблицей символов и буфер MDL с таблицей строк для последующего отображения на память нового процесса независимо от того, находятся секции.symtabи .strtabв загружаемом сегменте ELF-образа или нет.Чтобы не создавать буфер MDL с таблицей символов, нужно указать значение
RTL_NULLв параметреsymTabIndex. Чтобы не создавать буфер MDL с таблицей строк, нужно указать значениеRTL_NULLв параметреstrTabIndex. Если в этих параметрах указаны значения, отличные отRTL_NULL, то буферы MDL с таблицей символов и таблицей строк будут созданы при условии наличия секций.symtabи .strtabв ELF-образе. При отсутствии секции.symtabили .strtabпередается значениеSEG_IDX_INVALIDчерез параметрsymTabIndexилиstrTabIndexсоответственно.Через параметр
relocBaseфункцияKnElfCreateVmSegEx()принимает смещение загрузки ELF-образа. Смещение загрузки ELF-образа рассчитывается функциейKnTaskVmReserveForElf()из API task_api.h. Если ELF-файл имеет типDYN, функцияKnTaskVmReserveForElf()передает через выходной параметрrelocBaseслучайное смещение с целью поддержки ASLR, для ELF-файла другого типа передает нулевое смещение. ФункцияKnElfCreateVmSegEx()использует смещение загрузки ELF-образа, чтобы рассчитать адрес точки входа в программу (выходной параметрentry). Также с учетом смещения загрузки ELF-образа функцияKnElfCreateVmSegEx()рассчитывает адрес загрузки каждого загружаемого сегмента, кроме таблицы символов.symtabи таблицы строк .strtab. Для таблицы символов и таблицы строк функцияKnElfCreateVmSegEx()указывает нулевые адреса загрузки, поэтому фактические адреса загрузки таблицы символов и таблицы строк будут определены автоматически механизмом управления виртуальной памятью при отображении буферов MDL, содержащих эти таблицы, на виртуальную память нового процесса. Адреса загрузки сегментов сохраняются функциейKnElfCreateVmSegEx()в полеloadAddrструктур, адрес массива которых передается через выходной параметрsegs. - Отобразить буферы MDL с загружаемыми сегментами ELF-образа на виртуальную память нового процесса.
Этот шаг выполняется при использовании функции
KosTaskInitFromSeg(),KosTaskInitFromSegEx()илиKosTaskLoadSegments()из API task.h. - Освободить ресурсы, выделенные при успешном выполнении функции
KnElfCreateVmSegEx().Чтобы выполнить этот шаг, нужно вызвать функцию
KnElfFreeVmSeg(). - Удалить объект, описывающий ELF-образ, вызовом функции
KnElfClose().После удаления объекта, описывающего ELF-образ, можно удалить буфер с ELF-образом.
Функция KnElfGetLoadInfo() позволяет получить данные, которые используются, чтобы зарезервировать в новом процессе регион виртуальной памяти для последующего отображения буферов MDL с сегментами ELF-образа типа LOAD. Эта функция предназначена для использования библиотекой libkos.
Сведения о функциях API
Функции elf_api.h
Функция | Сведения о функции |
|---|---|
| Назначение Проверяет, является ELF-образ корректным. Параметры
Возвращаемые значения В случае успеха возвращает Если ELF-образ некорректен, возвращает |
| Назначение Создает объект, описывающий ELF-образ. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Удаляет объект, описывающий ELF-образ. Параметры
Возвращаемые значения Нет. |
| Назначение Позволяет получить данные, используемые для резервирования региона виртуальной памяти, в который будут загружены сегменты ELF-образ. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Создает буферы MDL с загружаемыми сегментами ELF-образа для последующего отображения этих сегментов на виртуальную память нового процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Освобождает ресурсы, выделенные при успешном выполнении функции Параметры
Возвращаемые значения Нет. |