Как подружиться с Procmon
Наверное, каждый уважающий себя ИТ-шник знает (или хотя бы слышал) про Process Monitor (ProcMon) от Sysinternals.
Недавно рассказывал одному юному падавану как пользоваться этим замечательным, а в некоторых случаях незаменимым инструментом. И пока рассказывал пришла в голову мысль написать такую вводную инструкцию для тех, кто только начинает свой тернистый путь админа.
Вообще, по моему мнению всё, что касается ProcMon лучше всего описано в книге от разработчиков, которая так и называется “Утилиты Sysinternals. Справочник администратора”.
Я же не буду лезть в дебри, и постараюсь изложить с минимумом теории, и максимумом практики на конкретном примере.
Запуск ProcMon
Во-первых, я не рекомендую запускать ProcMon просто так, чтобы посмотреть, что он делает, и как выглядит. Я вам и так скажу, что он делает цитатой из книги:
Регистрирует активность файловой системы, реестра, сети, процессов, потоков, а также загрузку образов в реальном времени.
Ну как? Понятно? 🙂
Если просто запустить ProcMon рабочее окно программы моментально заполнился разными событиями, даже если вы ничего не делаете. Разобраться в этих событиях, и найти интересующие даже опытному мастеру очень сложно. Да и не нужно, но обо всём по порядку.
Чаще всего ProcMon запускается с конкретной целью, например, определить, что делает та, или иная программа, какой процесс пишет файлы в определённый каталог или ветвь реестра, куда девается место на диске, и т.д. Поэтому, если просто запусить ProcMon то придётся остановить сбор событий (Ctrl+E), очистить уже собранные события (Ctrl+X), настроить фильтры (Ctrl+L), и снова запустить наблюдение. Для того, чтобы не делать столько лишний движений предусмотрен параметр командной строки /noconnect:
procmon /noconnect
Запуск с этим параметром запускает Procmon, но не начинает наблюдение, вместо этого сразу же открывается окно фильтров.
Вообще для упрощения запуска, я делаю (и всем советую делать так) как описывается всё в той же книге:
Мой соавтор Аарон обычно создает папку C:\Program Files\Sysinternals и распаковывает в нее содержимое пакета Sysinternals Suite. Там утилиты невозможно изменить без прав администратора. Затем он добавляет этот каталог в системную переменную окружения Path, что позволяет легко запускать утилиты откуда угодно, в том числе через меню Start | Run (Пуск | Выполнить).
Фильтры в ProcMon
Как было сказано выше окно фильтров открывается при запуске с параметром /noconnect. Если вы его нечаянно закрыли, или нужно подправить уже настроенные фильтры, открыть окно фильтров можно сочетанием клавиш Ctrl+L, или через меню Filter | Filter… .
Вот мы и добрались до практики 🙂
Как мониторить реестр я уже рассказывал, поэтому сегодня будем учиться мониторить файловую систему. Для примера будем отслеживать какие изменения делает стандартный блокнот.
Итак, у нас открыто окно фильтров.
Фильтры в ProcMon
На всякий случай нажимаем кнопку сброса фильтров в состояние по умолчанию – Reset(по умолчанию в ProcMon настроено до фига фильтров, не рекомендуется их удалять) и добавляем фильтр
Process Name is notepad.exe include.
Нажимаем кнопку Add. Как можно понять из названия захватываться будут только события, связанные с процессом notepad.exe, т.е. те события, которые генерирует блокнот.
Важный момент: имя процесса должно быть указано полностью – с расширением, иначе ProcMon ничего не захватит. Как вариант можно использовать фильтр
Process Name begins with notepad include
В таком случае будут захвачены события, связанные с процессами, начинающимися на notepad, это может быть как стандартный блокнот, так и Notepad++, или какой-нибудь ещё блокнот. Таким же образом добавляем фильтр на запись файлов:
Operation is WriteFile include
Нажимаем Add и OK (вообще можно просто нажать OK, в таком случае ProcMon скажет, что такого фильтра ещё нет, и спросит хотим-ли мы его добавить. Дело в том, что нажатие кнопки закрывает OK окно фильтров, если это не единственный фильтр, то лучше нажать кнопку Add, это позволит добавить фильтр, и оставить окно фильтров открытым для последующих фильтров).
Так как нас интересует только файловая активность, в главном окне ProcMon отключаем значки наблюдения за реестром, сетью и процессами – оставляем только наблюдение за файловой системой (выделены на скриншоте ниже).
Ещё один важный момент.
По умолчанию ProcMon регистрирует всю активность системы, даже те события, которые не попадают под фильтры, что в некоторых случаях может приводить к подтормаживанию работы. Если вы уверены в том, что фильтры настроены правильно (в данном примере мы уверены), и вам не нужны события, скрытые ими – их можно отбросить при помощи опции Filter | Drop Filtered Events (Удаление отфильтрованных событий) в меню Filter. Данный параметр действует только на регистрацию текущих событий, ранее записанные события из журнала не удаляются.
После того как фильтры настроены запускаем сбор событий (кнопка с изображением лупы, или Ctrl+E). Запускаем блокнот, пишем какой-то текст и сохраняем файл. Смотрим, что получилось:
Файловая активность в ProcMon
Как видно из скриношота ProcMon зафиксировал событие записи файла процессом notepad.exe по пути C:\temp\test.txt.
Проведём ещё один эксперимент.
Остановим захват событий (Ctrl+E), закроем блокнот и очистим собранные события (Ctrl+X). Вызовем окно фильтов (Ctrl+L), сбросим фильтры (кнопкой Reset) и добавим следующий фильтр:
Path begins with c:\temp\
Этим самым мы указываем, что нас интересует любая активность по пути C:\temp. А так как значение указано не точно (не is, а begins with), то захватываться будут события не только из этого каталога, но и из всех его подкаталогов.
Проверьте, чтобы было включено наблюдение только за файловой системой (при сбросе фильтров всё сбрасывается в состояние по умолчанию)
Фильтры в ProcMon
Запустим наблюдение. Откроем проводник и перейдём по нашему пути. Заглянем в ProcMon.
Так выглядит открытие каталога в ProcMon
Там будет куча непонятных нам событий, но они нам и не нужны, просто посмотрите сколько событий происходит, когда вы всего лишь заходите в каталог.
Можете открыть файл и посмотреть какая неразбериха будет в ProcMon. Вот почему я никогда не советую запускать ProcMon только для того, чтобы посмотреть, что там происходит в системе.
Для того, чтобы увидеть сами события чтения файла, остановите сбор событий, очистите окно результатов, добавьте фильтр
Operation is ReadFile
и снова откройте файл.
Должно получиться, что-то вроде этого (как видно из скриншота я открывал файл двумя разными процессами):
А вот так выглядит чтение файла в ProcMon
Вот таким простым способом можно узнать кто пишет файлы в определённый каталог. Ещё раз отмечу, что это не всё, на что способен ProcMon, это только верхушка айсберга. Для более близкого знакомства с ним рекомендую почитать книгу “Утилиты Sysinternals. Справочник администратора”, а также искать дополнительную информацию в интернете, например, на YouTube, или TechDays. Кстати, на TechDays есть записи от самого Марка Русиновича с русским переводом 🙂
Недавние комментарии