Материалы

Поиск 32-разрядных сервисов BIOS

Рейтинг:   / 0
ПлохоОтлично 

32-разрядные сервисы BIOS32 ищутся через каталог 32разрядных сервисов. Адрес точки входа в каталог сервисов заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000–0FFFFFh в началах параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура "_32_" заголовка (число 325F5F33h), за которой следует 32-разрядный физический адрес точки входа в каталог. Точки входа в сами сервисы ищутся через каталог сервисов. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора. Для поиска сервиса в каталоге 4-байтная строка-идентификатор сервиса заносятся в регистр EAX, в EBX заносится 0 (код функции поиска в каталоге) и выполняется дальний вызов (CALL FAR) по адресу точки входа в каталог. Результат поиска передается на регистрах: AL = 00h — сервис найден, при этом в EBX — базовый адрес сервиса, в ECX — его длина (определяет длину сегмента), EDX — смещение точки входа от начала сервиса (от EBX). Если AL = 81h — сервис не найден. До попытки использования каталога сервисов следует убедиться в корректности заголовка, проверив его контрольную сумму: накопленная сумма всех байтов заголовка должна быть нулевой. Длина заголовка (в параграфах) указана в байте со смещением 9, в байте 8 — номер ревизии заголовка. Проверка контрольной суммы обязательна, поскольку 4-байтная сигнатура может совпасть с фрагментом программного кода BIOS (строка _32_ дизассемблируется как POP DI; XOR SI,[BP + SI]). 32-разрядные сервисы вызываются дальними вызовами (CALL FAR), при этом сегмент кода CS должен иметь базу в начале 4-килобайтной страницы, в которую попадает точка входа, а лимит должен позволять охватывать эту и следующую страницу1. Сегмент DS должен иметь такую же базу и не меньший лимит. Напомним, что здесь идет речь о физических адресах (после страничного преобразования линейных).



Sitelinkx by eXtro-media.de
Яндекс.Метрика