Реферат: API Spying
Отсюда вывод: при проведении перехвата необходимо пропустить модули, которые вы сами прямо или косвенно используете. Идеально было бы менять таблицы импорта только в «нестандартных» модулях, так как, скорее всего, именно это вам и нужно: вряд ли вас интересует, какие функции 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); } |
В этом примере статистическая информация состоит из имени функции и количества вызовов, всё это хранится в массиве functions, отображением статистики занимается само исследуемое приложение.
Механизм сбора и отображения статистики
Что собирать
Потенциально, функция сборки статистики может для каждого вызова сохранять следующие параметры:
Имя функции.
Имя модуля.
Имя модуля, из которого произошёл вызов.
Идентификатор текущего потока.Время вызова.
Дамп стека.
Состояние регистров процессора
и так далее.