API Spying
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: ответы на сканворды, решебник по математике 6
| Добавил(а) на сайт: Lisicyn.
Предыдущая страница реферата | 3 4 5 6 7 8 9 10 11 12 13 | Следующая страница реферата
Это самое простое. Поскольку адреса таких функций приложение получает через GetProcAddress, достаточно просто перехватить GetProcAddress и производить описанную выше процедуру для всех запрашиваемых функций.
Отслеживание всех вызовов
Общая идея: пройтись по таблицам импорта загруженных модулей и, не особо задумываясь, перехватить все упомянутые там функции. Кроме того, нужно позаботиться о GetProcAddress (см. предыдущий пункт) и о ещё не загруженных модулях: их таблицы импорта тоже необходимо обработать. Чтобы не пропустить появление новых модулей, можно, например, перехватить все версии LoadLibrary[Ex]A/W.
Просто, правда? Просто, но, к сожалению, в таком виде работать, скорее всего, не будет.
ПРЕДУПРЕЖДЕНИЕ Этот вариант я так и не реализовал (незачем было), поэтому о его неизбежных маленьких особенностях почти ничего не знаю. Мои попытки поразмышлять представлены ниже, но практики за ними не стоит, и гарантировать отсутствие проблем я не могу. Сожалею. |
Проблема этого подхода заключается в почти гарантированном возникновении бесконечной рекурсии. Например, пусть collectStatistic записывает данные в файл при помощи функции WriteFile. Если эта функция оказалась перехвачена и в вашем модуле, то попытка записи приведёт к вызову вашей функции-шпиона, которая вызовет collectStatistic и т.д. пока не кончится место в стеке.
Ладно, вы поняли свою ошибку и больше не меняете таблицу импорта своего модуля. Но дело в том, что для реализации WriteFile kernel32.dll вызывает функцию NtWriteFile из ntdll.dll. А, поскольку таблицу импорта kernel32.dll вы изменили, опять вызывается функция-шпион, которая вызывает colleclStatistic и всё начинается заново.
Отсюда вывод: при проведении перехвата необходимо пропустить модули, которые вы сами прямо или косвенно используете. Идеально было бы менять таблицы импорта только в «нестандартных» модулях, так как, скорее всего, именно это вам и нужно: вряд ли вас интересует, какие функции ntdll.dll вызываются во время вызова WriteFile, обычно достаточно просто знать, что приложение вызвало WriteFile. Определять нестандартные модули можно разными способами, мне пришли в голову следующие:
По каталогу, в котором лежит файл.
По дате создания файла (системные файлы обычно имеют вполне определённые даты создания).
По фиксированному списку имён.
Кроме того, всегда есть радикальное решение: написать графический интерфейс и взвалить эту задачу на пользователя. :)
Функция сбора статистики
В соответствии с тем, как она используется функциями-шпионами, функция сбора статистики должна иметь следующие характеристики:
Принимает один четырёхбайтный параметр, передаваемый через стек.
Не возвращает значение (во всяком случае, оно игнорируется).
Сама очищает стек.
Очевидно, как-то собирает какую-то статистику. Как именно и какую, пока не важно.
На C++ это реализуется примерно так:
void __stdcall collectStatistic(unsigned long n) { // Что угодно, например такое functions[n].count++; printf(("called %s (%d)n", functions[n].name.c_str(), functions[n].count); Рекомендуем скачать другие рефераты по теме: конспект 5 класс, шпаргалки по физике. Категории:Предыдущая страница реферата | 3 4 5 6 7 8 9 10 11 12 13 | Следующая страница реферата Поделитесь этой записью или добавьте в закладки |