Под присмотром Monitor API: Как отслеживать вызовы API-функций и зачем это нужно?Отладчик и дизассемблер — это, безусловно, лучшие инструменты, чтобы посмотреть, как устроена какая-то программа изнутри. Но есть еще один инструмент, который быстро может дать картину того, что происходит внутри приложения и как оно взаимодействует с операционной системой. Это монитор API-вызовов. Работа многих приложений и самой Windows во многом построена на системе DLL, т.е. динамически загружаемых библиотек. Приложениями предоставляются сервисные API-функции, с помощью которых они могут взаимодействовать с системой. Условно говоря, есть функции для чтения и записи в реестр, работы с файловой системой, сетевого взаимодействия и т.д. Фиксируя вызовы API-функций, мы можем узнать многое о работе приложения. А перехват таких вызов (и спуфинг результата их выполнения) позволяет обойти многие ограничения системы и делать с ней практически что угодно. Существует немало программ, которые мониторят обращения к API-функциям. Взять хотя бы небезызвестные утилиты RegMon и FileMon Марка Руссиновича. Отслеживая вызовы API-функций, касающихся взаимодействия с реестром и файловой системой, они выводят информацию в удобном для анализа виде. Фактически, идея написать материал о давно существовавших API-шпионах появилась под впечатлением от нового релиза программы API Monitor. Она делает то же самое, что и масса других подобных программ — фиксирует обращения к API-функциям и COM-методам. Но то, как она реализована, заслуживает всяческих похвал. Чем удивил API Monitor?Сам проект довольно старый: его предыдущая 1.5 версия выходила еще в далеком 2001 году. Прошлым летом разработчики реанимировали проект и полностью переписали код. Теперь это офигенный инструмент! Кратко пройдемся по его возможностям.
Устанавливаем простой hookВпрочем, лучше всего ощутить все прелести API Monitor на практике. В общем случае необходимо указать монитору две вещи: функции для отслеживания и программы/сервисы, которые предположительно будут их вызывать. Для примера возьмем простую ситуацию, когда необходимо отследить факт создания файла в системе. За это в общем случае отвечают API-функции CreateFileA, CreateFileW и NtCreateFile, вот их вызовы мы и будем мониторить. Их надо отметить в панели API Capture Filter. Как я уже сказал, список возможных функций для мониторинга очень внушительный, и даже несмотря на их удачную группировку найти нужные элементы, не зная, где они находятся, довольно сложно. Поэтому не стесняемся воспользоваться поиском (Ctrl-F или меню "Edit -> Find"), отыскав все необходимое по ключевому слову CreateFile. С этого момента API Monitor будет нам сообщать о вызове этих функций. Осталось выбрать программу. Это может быть уже существующий процесс, и в этом случае его достаточно выбрать в панели Running Processes, или же мы можем запустить приложение прямо из API Monitor'а. Выбирем второй вариант. Переходим "File -> Hook Process", выбираем в папке Windows notepad.exe (для простоты примера возьмем обычный блокнот). В качестве аргументов, которые передаются приложению, предлагаю указать какой-нибудь текстовый файл. Тогда программа сразу же попытается создать документ — а именно это нам и надо. Нажимаем "ОК". Запустившийся блокнот справедливо замечает, что указанный текстовый файл он не нашел, и предлагает создать его. Соглашаемся и смотрим в вывод API Monitor. На панели Summary ты должен увидеть список вызовов, которые были сделаны Notepad'ом. Сначала приложение вызвало функцию CreateFileW из библиотеки kernel32.dll, которая в свою очередь вызвала NtCreateFile. Обрати внимание: текстовые параметры для наглядности выделены красным цветом. Помимо этого, в выводе отражаются возвращаемое значение и коды ошибок. Функция NtCreateFile не нашла файл и поэтому вернула "STATUS_OBJECT_NOT_FOUND", а потому kernel32.dll вернула в Nodepad INVALID_HANDLE_VALUE и ошибку "2 = Не удается найти указанный файл". Если приложение попытается создать файл прямо в папке винды, то получит ошибку из-за отказа в доступе, и это также будет отражено в выводе API Monitor. В конце концов, NtCreateFile вернет статус "STATUS_SUCCESS" — файл создан. Вот где ощущается прелесть от декодированных ошибок. Снифаем SSL-трафик браузераТеперь, когда мы разобрались с общим механизмом работы API Monitor, хочу показать тебе всю мощь того, что предоставляет возможность отслеживать и перехватывать API-вызовы. Для того чтобы пример был более практичным, возьмем ситуацию из реальной жизни, когда мне необходимо было отснифать SSL-трафик, передаваемый браузерами. API Monitor в этом случае позволяет нам просмотреть данные, которые будут отправлены на защищенный сайт до того, как их закриптует браузер. Этот способ, кстати, вполне можно использовать, чтобы восстановить пароли, которые когда-то были сохранены в браузере и забыты. Для начала схема для Internet Explorer:
Если взять браузер Firefox, то он не использует стандартные функции Windows Internet — вместо этого применяются рантайм Netscape Portable Runtime и библиотеки Mozilla SSL. Впрочем, API Monitor отлично справляется и с ними. Нас, чтобы добавить конкретики, интересует PR_Write. Далее ставим хук на процесс Firefox'а, выполняем процедуру авторизации, и смотрим информацию о перехваченных вызовах. В окне Summary ты увидишь множество вызовов PR_Write, выполненных библиотекой xul.dll. Это нам и нужно. Один из этих вызовов выполняет POST-запрос с интересующими нас данными, которые передаются в параметре buf. Нас интересует тот, который начинается с "POST /accounts/ServiceLoginAuth" (смотри поле "Hex Buffer"). Просто просматривай для каждого вызова Pre-Call Value буфера, и в одном из них ты увидишь интересующие данные. Есть нюанс. Возможно, API Monitor не перехватывает достаточно данных. Чтобы это исправить, перейди "Tools -> Options" и увеличь значение параметра "Maximum size of captured buffers". Теперь все точно должно работать. Только мониторПомимо непосредственно API-шпионов, есть утилиты, которые позволяют не только отслеживать вызов API-функций, но, к примеру, влиять на их выполнение. Но если необходим удобный качественный шпион, которым действительно удобно пользоваться, то новый API Monitor — это то, что доктор прописал. К тому же программа поддерживает подключаемые описания вообще для любой DLL-библиотеки, оформленные в специальном XML-формате, что делает ее еще и более универсальной. Программы для мониторинга API-вызововWinApiOverrideМощнейший API-монитор от французских разработчиков, который может не только отслеживать вызовы API, но и переопределять функции. Например, исключить нужный процесс из списка процессов, которые отображаются в таскменеджере. kerberosШпион для отлова вызовов WinAPI функций. Утилита перехватывает не только API, но и пользовательские функции, поддерживает плагины. Лог работы шпиона в виде текстового файла *.rep сохраняется в папке с исследуемым приложением. APISpy32APISpy32 — шпион за вызовами WinAPI. Программа может следить за всеми процессами одновременно в системе, имея для этого специальный навороченный движок. DVDВсе программы из этой статьи ты найдешь на нашем DVD-приложении. |