Часть полного текста документа: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); ... } ПРИМЕЧАНИЕ Это приблизительный код, используемый при перехвате через таблицу импорта; другие варианты перехвата в данном случае не имеют существенных преимуществ. То есть, для каждой функции придётся: определить тип; определить переменную; написать обёртку; добавить строчку в HookThemAll. Это, конечно, довольно простые операции... Но представьте, что таким образом вам нужно перехватить несколько сотен функций. А если не у всех функций известны прототипы? А если некоторые dll загружается динамически, и вы пока даже не знаете, какие их функции используются приложением? А если после того, как вы всё успешно перехватите и просмотрите получившиеся логи, станет понятно, что для детального понимания работы приложения нужно было перехватить всего две функции и изучить их параметры :) ? Когда все эти вопросы встали передо мной, я занялся API Spying-ом. API Spying не исключает перехвата API, но эти методики используются находятся на разных стадиях анализа программы. Сначала при помощи API Spying-а определяется несколько наиболее интересных функций, потом, если необходимо, эти функции перехватываются и изучаются "в более тесном контакте". Постановка задачи В самом общем виде задача выглядит так: Необходимо получать информацию о фактах вызова выбранных функций исследуемым приложением. Для получения статистики не обязательно заранее знать имена функций, которые будут вызываться приложением. ............ |