Реферат: API Spying
Я открываю свойства растений и трав..
Борис Гребенщиков
Словосочетанием «API Spying» называется слежение за вызовами функций API некоторым приложением. То есть, каждый факт вызова этим приложением выбранных функций каким-то образом фиксируется, например, добавляется запись в лог.
ПРИМЕЧАНИЕ Для ясности назовём «некоторое приложение» исследуемым приложением, а «выбранные функции» – отслеживаемыми функциями. |
Зачем это нужно
API Spying может использоваться на одном из этапов исследования программы, логику работы которой вы пока не до конца понимаете. Хотя эта технология и не позволяет получить детальную информацию, она может значительно сузить область последующих этапов исследования, сконцентрировав ваше внимание на тех вызовах, которые происходят в ключевые моменты работы программы.
На первый взгляд может показаться, что задача лучше решается с помощью перехвата API, так как он даёт возможность не только отследить вызов, но и изучить/изменить параметры и возвращаемое значение, или даже полностью переписать функцию.
Действительно, перехват API – замечательная и часто упоминаемая техника (на данный момент на RSDN этой теме посвящены три статьи), позволяющая довольно глубоко изучить исследуемое приложение, но это и гораздо более трудоёмкое решение. Даже если реализации функций будут почти пустыми (только запись в лог и вызов оригинальной функции), ваш код будет примерно таким:
typedef int (__stdcall* Function1_type)(int i); Function_type _Function1; // Обёртка, логирующаявызовы int __stdcall MyFunction1(int i) { printf("MyFunction1\n"); return _Function(i); // Вызоворигинальнойфункции } ... // Перехватвсехфункций void HookThemAll() { ... // Перехват функции _Function1, экспортируемой some.dll HookIt("some.dll", "_Function1@4", MyFunction1, &_Function1); ... } | ||
ПРИМЕЧАНИЕ Это приблизительный код, используемый при перехвате через таблицу импорта; другие варианты перехвата в данном случае не имеют существенных преимуществ. |
То есть, для каждой функции придётся:
определить тип;
--> ЧИТАТЬ ПОЛНОСТЬЮ <--