Реферат: API Spying

Функция-шпион

Задачи

Задачи работы функции-шпиона:

Вызвать функцию сбора статистики, каким-то образом сообщив ей, какая отслеживаемая функция вызывается.

Вызвать отслеживаемую функцию.

Ограничения

Ограничения связаны с тем, что отслеживаемая функция должна работать без изменений. Для этого перед её вызовом:

Необходимо привести стек в то же состояние, которое было до начала работы функции-шпиона. Это значит, что, во-первых, нельзя сохранить в стеке какое-нибудь значение для использования после возврата из отслеживаемой функции, во-вторых, нельзя использовать для вызова инструкцию call, так как она добавит в стек адрес возврата (на эту тему см. ниже, в разделе «Получение управления после возврата из отслеживаемой функции»).

Поскольку в принципе параметры могут передаваться и в регистрах, желательно привести регистры в то же состояние, которое было до начала работы функции-шпиона, или хотя бы в максимально близкое.

Код, который надо сгенерировать

Так как код функции-шпиона может располагаться в памяти по произвольному адресу, при вызове из неё функций необходимо либо использовать абсолютную адресацию, либо при генерации вычислять их адреса для каждой новой функции-шпиона.

Оба подхода одинаково просто реализуются, но из-за особенности системы команд Intel x86 ближний вызов/передача управления по абсолютному адресу будет выглядеть примерно так:

; Вызов

mov eax, <абсолютный адрес функции >

call eax

; Передача управления

mov eax, <абсолютный адрес функции>

jmp eax

То есть, как ни старайся, а значение одного регистра (в данном примере регистра eax, но на его месте мог быть каждый) сохранить не удаётся.

Поэтому выбрана версия с относительной адресацией:

pusha ; сохраняем регистры и флаги.

pushf ; Это, конечно, паранойя...

push <номер> ; передаём в параметре номер отслеживаемой функции

call <относительный адрес функция сбора статистик>

popf ; восстанавливаем флаги

popa ; и регистры

jmp <относительный адрес отслеживаемой функции>

Поскольку эта функция-шпион заканчивается непосредственным вызовом отслеживаемой функции, она может совместно работать только с методами перехвата, не изменяющими код перехватываемой функции. Это:

перехват через таблицу импорта;

К-во Просмотров: 993
Бесплатно скачать Реферат: API Spying