Поскольку эта функция-шпион заканчивается
непосредственным вызовом отслеживаемой функции, она может совместно работать
только с методами перехвата, не изменяющими код перехватываемой функции. Это:
перехват через таблицу импорта;
перехват через таблицу экспорта;
перехват GetProcAddress и подмена адреса запрашиваемой
функции.
Если вы используете другой метод перехвата (например, замену нескольких начальных байтов на команду jmp), вам придётся немного
изменить мой код.
Получение управления после возврата из отслеживаемой
функции
Если по каким-то причинам вам очень нужно получить
возвращаемое значение отслеживаемой функции, или вы хотите измерить время её
выполнения, или что-то ещё, недоступное моему пониманию, вы всё-таки можете
написать функцию-шпион так, чтобы она использовала call для вызова
отслеживаемой функции и получала управления после её завершения.
Для этого нужно:
Удалить из стека старый адрес возврата.
ПРИМЕЧАНИЕ
А если функция вызвана дальним вызовом, то (сюрприз!) адрес возврата будет занимать 6 байт. Хуже того, новый адрес
тоже должен быть шестибайтным, так как отслеживаемая функция очень на это
рассчитывает. Вряд ли вы встретитесь с такой ситуацией в Windows, но про
другие ОС я ничего сказать не могу.
|
Где-то сохранить его на время вызова отслеживаемой
функции.
Вызвать функцию.
Получить/измерить/.. то, что вы хотели.
Вернуть управление по старому адресу.
Ключевым вопросом этого алгоритма является: «где же
это где-то, в котором можно сохранить адрес возврата?» Стек менять нельзя, поэтому он отпадает. Хранить в регистрах тоже нельзя: те регистры, которые
могут измениться после вызова функции, может изменить отслеживаемая функция, и
данные пропадут, а те регистры, которые не должны меняться после вызова, нельзя
менять нам, так как восстановить их мы не сумеем – негде сохранить их старые
значения :)
Остаётся только хранение в глобальной области памяти.
Так как приложение может быть многопоточным, доступ к памяти нужно
синхронизировать, и отдельно хранить данные для каждого потока. Так как
возможна рекурсия, необходимо хранить не один адрес возврата, а стек адресов…
И, несмотря на все эти предосторожности, что будет, если в отслеживаемой
функции произойдёт исключение и начнётся развёртывание стека? Правильно, будет
очень плохо…
В общем, это путь для людей, крепких духом и готовых к
испытаниям. Далее в статье он не рассматривается.
Механизм установки шпионов
Алгоритм установки одной функции-шпиона:
Генерируется функция-шпион, при генерации
устанавливается её номер, адрес отслеживаемой функции и адрес функции сбора
статистики.
Перехватывается отслеживаемая функция, теперь вместо
неё приложением должна вызываться функция-шпион.
Где-то сохраняется информация, о том, что перехвачена
функция с таким-то именем и ей сопоставлен такой-то номер. Эта информация будет
использована при вызове функции сбора статистики.
Очевидно, что этот алгоритм никак не зависит от
прототипа/формата вызова/.. отслеживаемой функции, и может быть без изменений
применён для любого количества функций. Тем не менее, рассмотрим два случая.
Отслеживание вызовов функций динамически загружаемых
dll
Рекомендуем скачать другие рефераты по теме: конспект 5 класс, шпаргалки по физике.
Предыдущая страница реферата |
2
3
4
5
6
7
8
9
10
11
12 |
Следующая страница реферата