Последнее руководство по Procmon

Procmon. Печально известная утилита Windows Sysinternals для отслеживания всех видов деятельности в операционной системе Windows. Известна своей способностью отслеживать действия вредоносных установщиков программ, вносящих неизвестные изменения в реестр или, возможно, следящих за следами вирусов.

Если вам нужно изучить реестр Windows, файловую систему, процессы или сетевую активность, и вы решили использовать Procmon, то этот материал для вас.

В этом Руководстве вы узнаете все, что нужно знать о использовании утилиты Procmon, начиная с установки и базового использования и заканчивая различными сценариями использования, которые помогут вам отследить различные виды деятельности.

Предварительные требования

Это Руководство применимо к практически всем версиям Windows, но ради полноты (и чтобы предотвратить попытки запуска Procmon на компьютере с Windows 3.1), вам потребуется следующее:

  • A Windows Vista or Windows Server 2008 or higher machine (x86 or x64)

Вот и все! Вы скачаете и установите Procmon в следующих разделах. В руководстве будет использоваться версия 3.6 Procmon на компьютере под управлением Windows 10 Build 1909 x64.

Скачивание и Запуск Procmon

Для начала вам потребуется запустить Procmon на вашем компьютере под управлением Windows. Вы можете сделать это двумя способами: традиционным методом скачивания или с использованием Sysinternals Live, как называет это Windows Sysinternals.

Старомодный Способ

Процесс-Монитор не требует установки; это один исполняемый файл. Вы можете получить его, скачав ZIP-файл. После загрузки файла ZIP извлеките его с помощью вашего любимого инструмента. Ниже приведен фрагмент кода PowerShell, если вы сохранили его в своей домашней папке. Этот фрагмент кода создаст папку в ~\ProcessMonitor со всеми необходимыми файлами.

Expand-Archive -Path '~\ProcessMonitor.zip' -Destination ProcessMonitor

Внутри папки ~\ProcessMonitor вы увидите пять файлов:

  • Eula.txt – Лицензионное соглашение, которое вам нужно принять перед запуском Procmon.
  • procmon.chm – Справочный файл, содержащий всю предоставленную документацию.
  • Procmon.exe – Основной файл EXE, который запустит соответствующий экземпляр Procmon (x86 или x64).
  • Procmon64.exe – 64-разрядный двоичный файл Procmon.
  • Procmon64a.exe – Альфа-версия 64-разрядного двоичного файла Procmon.

Теперь запустите Procmon, вызвав ~\ProcessMonitor\procmon.exe.

Procmon работает только с повышенными правами, поэтому вас попросят подтвердить это, если UAC включен при его запуске. Есть способ обойти это, о котором будет рассказано позже в данном руководстве.

Sysinternals Live

Если вы предпочитаете не загружать (или не можете загрузить) файл EXE, вы также можете использовать папку Sysinternals Live. Для этого откройте проводник и вставьте \\live.sysinternals.com\tools. Затем вы увидите папку, как обычный сетевой ресурс, содержащий все файлы Sysinternals, включая procmon.

Sysinternals Live

Прокрутите вниз, пока не найдете procmon, дважды щелкните, и вуаля, вы запускаете procmon!

Настройка поведения запуска Procmon

По умолчанию procmon запускается с запросом на принятие лицензионного соглашения конечного пользователя (EULA) и открытием окна. Используя командную строку, вы можете настроить это поведение по умолчанию.

Например, если вы хотите запустить procmon свернутым, используйте переключатель /Minimized.

.\procmon.exe /Minimized

Возможно, вы запускаете procmon на новой машине и предпочли бы не видеть запрос на принятие EULA. Вы можете отключить его при запуске, используя переключатель /AcceptEula.

.\procmon.exe /AcceptEula

Хотя это маловероятно в наше время, при запуске procmon определяет, используете ли вы 64-разрядную или 32-разрядную ОС. Если вы на 64-разрядной машине, он запустит процесс 64-разрядной версии, и наоборот. Если вы на 64-разрядной машине и хотите либо запустить procmon как процесс 32-разрядной версии, либо прочитать файл журнала (об этом позже), сгенерированный с 32-разрядной машины, используйте переключатель /Run32.

.\procmon.exe /Run32

Procmon имеет другие командные переключатели для настройки поведения, но об этом вы узнаете в следующих разделах.

Введение в Procmon

Когда вы запускаете procmon в первый раз, вы можете быть ошеломлены настройками. Не волнуйтесь, вы узнаете обо всем в этом руководстве! Ниже вы можете увидеть типичную сессию захвата procmon.

Default Procmon process view

В момент запуска procmon начинает захватывать различные события Windows.

Если вы не хотите, чтобы procmon автоматически начинал захват событий, вы можете запустить его из командной строки, выполнив procmon.exe /NoConnect.

Как видно на скриншоте выше в столбце Действие, есть различные значки, каждый из которых представляет разные классы событий Windows. Procmon захватывает события из пяти разных классов:

  • Реестр
  • Файловая система
  • Сеть
  • Процессы
  • События профилирования

Каждое событие во всех классах представлено в одной области списка семью столбцами:

  • Время события – Время возникновения события.
  • Имя процесса – Имя процесса, вызвавшего событие.
  • PID – Идентификатор процесса.
  • Действие – Тип события, например, если процесс открыл файл, изменил значение ключа реестра и т. д.
  • Путь – Путь к объекту, с которым взаимодействовало событие, например, путь к файлу, путь к реестру и т. д.
  • Результат – Этот столбец будет содержать множество значений, чтобы указать результат события. Это значение может быть таким простым, как УСПЕХ, или специфическим для события, например, ПОВТОРНЫЙ АНАЛИЗ, ПЕРЕПОЛНЕНИЕ БУФЕРА, ИМЯ НЕ НАЙДЕНО и т. д.
  • Детали – Этот столбец содержит все мелочи, когда вы находите событие, которое хотите увидеть.

Если вы предпочитаете не видеть определенный столбец или хотите увидеть, какие другие столбцы у вас есть, щелкните правой кнопкой мыши по заголовку любого столбца и выберите Выбрать столбцы. Вам будет предложено диалоговое окно, где вы сможете настроить видимые столбцы.

Customizing procmon columns

В окне события дважды щелкните на событии. Вы можете найти намного больше подробностей о процессе и самом событии, просматривая вкладки Событие, Процесс и Стек.

Procmon event properties window

Включение и отключение захватов

У вас полный контроль над процессом захвата. Вы можете либо отключить весь процесс захвата, либо отключить захват по классу событий.

На верхней панели меню вы увидите значок лупы (ниже). Если на значке лупы есть красный крест, это означает, что захват отключен. В противном случае захват включен.

Procmon actively capturing events

Не оставляйте Procmon захватывающим события дольше, чем вам нужно. Он использует виртуальную память для хранения всех этих событий, и если вы неосторожны, вы можете закончить сбоем Windows! Вы можете изменить это поведение, как вы увидите чуть позже.

Если вы предпочитаете быть более выборочным, вы также можете контролировать захват каждого класса событий. В меню, вы увидите, что пять одинаковых значков отображаются в столбце Операция. Нажимая на эти кнопки, вы можете включать и выключать целые классы событий.

Types of Windows events

Наведитесь на каждый значок мышью, чтобы увидеть, какого рода деятельность он представляет.

Как только вы нажмете на значок, ProcMon применит фильтр событий. В зависимости от того, сколько событий уже зафиксировано, вы можете увидеть всплывающее окно, подобное показанному ниже.

Types of Windows events

По умолчанию самый дальний значок справа (черно-зеленый график) не включен. Если вы хотите включить этот класс событий при запуске ProcMon, вы можете вызвать ProcMon из командной строки с помощью .\procmon.exe /Profiling.

Вы можете видеть количество событий в окне, глядя внизу. Как видите ниже, ProcMon обработал 84,334 событий, но из-за примененного фильтра событий отображается всего 15,912 из них, что составляет 18%. Вы также видите, что эти события хранятся в виртуальной памяти (подробнее об этом позже).

Number of Events in the Window

Фильтры событий

Чтобы понять ProcMon, неизбежно нужно понять концепцию фильтров событий. Фильтры событий – это то, как вы отделяете сигнал от шума. Фильтры событий скрывают все события, которые вас не интересуют. Вы выше применили фильтры событий для целых классов событий, но можно сделать гораздо более детализированные.

Есть несколько способов взаимодействия с фильтрами событий. Давайте начнем с простого. Нажмите на пункт меню Фильтр в верхней части. Вы увидите множество различных вариантов работы с фильтрами.

Filter menu options

Просмотр фильтров

По умолчанию procmon создает для вас фильтр. В меню Фильтр нажмите на Фильтр…. Вы увидите окно Фильтр Process Monitor с двумя областями: одна для фильтрации ваших правил фильтрации и другая для просмотра всех правил, которые вы настроили. Вы можете увидеть пример этого ниже.

Filter rules

По умолчанию procmon будет показывать вышеуказанные фильтры при каждом запуске. Если вы хотите скрыть это окно, вы можете сделать это, запустив procmon с переключателем /Quiet.

Вы должны заметить, что без создания собственных фильтров procmon также использует встроенный набор правил фильтрации. Если вы прокрутите вниз в окне Фильтр Process Monitor, вы увидите множество различных типов определенных правил. Здесь вы можете просмотреть каждую категорию, оператор, значение и действие, предпринимаемое по каждому правилу.

Эти фильтры применяются, потому что вам обычно не нужно видеть события, исключенные этими фильтрами. Но если вы хотите видеть все события, вы также можете просто удалить все фильтры по умолчанию или нажать на Фильтр —> Включить расширенный вывод, как показано ниже.

Enable Advanced Output

Например, вверху вы увидите несколько правил, которые показывают Название процесса для значения Колонка, is для Соотношение, различные процессы, связанные с Procmon, для значения столбца Значение, а также Действие Исключить. Простыми словами, эти правила указывают Procmon не отображать (исключать) процесс с именем procmon.exe, например.

Управление правилами фильтрации событий

В зависимости от вашего случая использования, вам неизбежно потребуется добавить свои собственные правила. Есть несколько разных способов добавления правил.

Использование поля фильтра Procmon

В последнем разделе вы видели, как выглядит поле Фильтр Procmon и просмотрели все правила. В этом поле вы также можете создавать, изменять и удалять правила.

Допустим, вы хотите видеть только те моменты, когда процесс explorer.exe запрашивает ключ реестра.

Добавление фильтров событий

В поле Фильтр Procmon:

  1. Нажмите на самый левый выпадающий список. В этом списке отображаются все различные категории событий, на которые можно установить фильтр. Вы можете видеть, что их довольно много!

    Каждый элемент, который вы видите в этом списке, соответствует столбцу, отображаемому в основном окне, как показано ниже. В данной статье выберите Название процесса.

Process Monitor Filter

2. Выберите категорию, затем выберите оператор. По умолчанию поле выпадающего списка будет is, но у вас есть много других вариантов, если вы нажмете на выпадающий список. Эти операторы позволяют фильтровать выбранный вами вариант разными способами. Поскольку вы ищете процесс, который точно соответствует explorer.exe, выберите is.

Operator List

3. Наконец, выберите имя процесса, как показано ниже. Обратите внимание, что поскольку вы выбрали Имя процесса в качестве категории, ProcMon автоматически отображает все текущие выполняемые процессы для выбора.

Process Name in Process Monitor Filter

4. Убедитесь, что вы выбрали Включить, поскольку вы хотите видеть только события, соответствующие этим критериям. Затем нажмите на кнопку Add, чтобы добавить правило в текущий фильтр. Как видно ниже, правило Include отображается в виде зеленой галочки.

5. Наконец, поскольку вы хотите видеть все события, где explorer.exe запрашивает ключ реестра, обязательно включите операцию RegQueryKey. Когда закончите, вы должны увидеть добавленные оба правила.

RegQueryKey

6. Нажмите OK, и затем вы увидите, что основное окно удаляет все события, которые не соответствуют правилам фильтра, которые вы только что определили.

Events that do not match the filter rules

Удаление правил фильтра событий

Вы также легко можете удалить и изменить правила фильтра.

  1. Нажмите на значок фильтра в верхней части основного окна, чтобы открыть Окно фильтрации Process Monitor.
Process Monitor Filter Box

2. Выделите оба правила фильтра, созданные выше, нажмите кнопку Удалить, как показано ниже, и нажмите ОК. Это действие удалит оба ранее добавленных пользовательских правила.

remove both of the custom rules added

Вы также можете нажать кнопку Сброс, чтобы автоматически удалить все пользовательские правила фильтра.

Каждый раз, когда вы применяете фильтр, выходите из Procmon и снова запускайте его, этот фильтр будет снова применен. Если вы хотите убедиться, что никакой фильтр не применяется при запуске Procmon, вы можете вызвать Procmon с переключателем /NoFilter.

Добавление правил фильтра с помощью правой кнопки мыши

Вы также можете добавлять правила фильтра через контекстное меню, если щелкнете правой кнопкой мыши на процессе. Как видите ниже, вы можете создавать любые правила непосредственно из этого меню; нет необходимости идти в Окно фильтра Procmon вообще!

add filter rules via a right-click menu

Чтобы удалить правила фильтра, созданные через контекстное меню правой кнопки мыши, вам все равно придется перейти к Окну фильтра Procmon, чтобы удалить их.

Сохранение и управление пользовательскими фильтрами

Если вы опытный пользователь Procmon, возможно, наступит время, когда у вас будет наборы правил фильтра для различных случаев. Используя функции сохранения и организации фильтров Procmon, вы можете управлять и сохранять сколько угодно таких наборов.

Допустим, у вас есть несколько пользовательских фильтров, и вы хотите сохранить их, чтобы использовать их снова в будущем. Вы можете сохранить этот фильтр, перейдя к Фильтру, выбрав Сохранить фильтр и указав имя, как показано ниже.

Saving a filter

После сохранения фильтра вы можете перейти к Filter, нажать на Organize Filters, где вы увидите все сохраненные вами фильтры. Здесь вы можете нажать на фильтр, кликнуть OK, и ваш сохраненный фильтр будет применен к текущему окну.

Viewing and loading filters

Также можно загрузить сохраненный фильтр, наведя курсор на Load Filter в выпадающем меню Filter и выбрав ваш фильтр из списка справа.

Loading a filter

Импорт и экспорт фильтров

Если вы планируете загрузить Procmon на другой компьютер и сохранить все ваши фильтры, у вас не получится. У Procmon нет облачного сервиса для синхронизации фильтров. Но вы можете вручную экспортировать фильтры и импортировать их позже.

Чтобы экспортировать фильтры Procmon:

  1. Перейдите в окно Organize Filters.
  2. Кликните на фильтр, который вы уже сохранили и хотели бы экспортировать.
  3. Кликните на кнопку Export.
  4. Укажите имя, выберите путь и нажмите OK. Вы увидите, что все фильтры Procmon сохраняются с расширением PMF.

Чтобы импортировать фильтры Procmon:

  1. Перейдите в окно Organize Filters.
  2. Кликните на кнопку Import.
  3. Найдите фильтр, который вы хотели бы импортировать, и кликните OK.

Вы можете увидеть визуальное пошаговое руководство по этим шагам ниже.

import procmon filters

Импорт и экспорт конфигураций Procmon

Как вы узнали ранее, вы можете экспортировать и импортировать фильтры Procmon с помощью файлов PMF. Но фильтры – это только одна составляющая экземпляра Procmon. Вы можете настроить столбцы, изменить место хранения (об этом позже) и другие параметры. Не было бы замечательно сохранить все эти настройки? Вы можете сделать это!

Чтобы сохранить всю конфигурацию Procmon, щелкните Файл —> Экспорт конфигурации, затем выберите место, где хотите сохранить файл PMC (конфигурация Procmon).

Export Configuration

После сохранения вы можете закрыть Procmon на том же компьютере (или даже на другом), открыть Procmon и щелкнуть Файл —> Импорт конфигурации, где Procmon применит все те же фильтры и другие настройки, как они были экспортированы.

Вы также можете загружать сохраненные конфигурации (включая фильтры) с помощью командной строки, используя параметр /LoadConfig, за которым следует путь к файлу, например ./procmon.exe /LoadConfig C:\ProcmonConfigs\file_deletion.pmc.

Выделение событий и преобразование в фильтры

Возможно, вам нужно сделать определенные события более заметными, но вы не хотите удалять какие-либо события с помощью фильтра. В этом случае вы можете использовать выделения. Выделения позволяют создавать наборы правил, подобные фильтрам, но вместо скрытия событий изменяется цвет фона событий.

Возможно, вы видите процесс в списке событий, называемый ctfmon.exe, который вы хотите выделить в списке. Вы можете создать правило выделения, выполнив следующее:

  1. Щелкните правой кнопкой мыши на событии, атрибут которого вы хотите выделить.
  2. Нажмите на Выделить и выберите атрибут события для выделения. В этом примере вы выберете Имя процесса. Затем вы увидите изменение цвета фона на светло-голубой цвет.
  3. После создания правила выделения вы можете перейти к полю Выделение монитора процессов, нажав Фильтр —> Выделить. Там вы увидите созданное правило выделения.
  4. Из поля Выделение монитора процессов вы можете добавлять и удалять правила так же, как и с фильтром.
  5. Если вы создали некоторые правила выделения и хотели бы превратить их в фильтр, вы можете сделать это, нажав кнопку Создать фильтр в поле Выделение монитора процессов.

Вы можете увидеть визуальное пошаговое руководство по этим шагам ниже.

Highlighting Events and Converting to Filters

Экспорт и открытие событий из/в файлы журнала

Чтобы procmon мог отображать события вам в окне, они должны где-то храниться. По умолчанию события хранятся в виртуальной памяти, конкретно в вашем файле подкачки.

events are stored in virtual memory

В зависимости от того, насколько большой файл подкачки вы определили (и системного предела обязательств), зависит от того, сколько событий может сохранить procmon.

Procmon способен захватывать до 199 миллионов событий.

Сохранение событий в файл журнала

Возможно, вам нужно сохранить эти события для дальнейшего исследования или загрузки на другой компьютер? В таком случае вам необходимо сохранить события в файл журнала (PML).

Один из способов сохранить эти удобные события – щелкнуть на Файл —> Сохранить. Это действие открывает диалоговое окно Сохранить в файл, в котором вы представлены несколькими вариантами.

Сохраняемые события:

  • Все события – Этот вариант сохраняет все события, захваченные Procmon, независимо от того, применен ли фильтр событий или нет.
  • Отображаемые события с использованием текущего фильтра – Этот вариант не сохраняет все захваченные события, а только те, которые прошли текущие активные фильтры событий.
  • Выделенные события – Этот вариант экспортирует в журнал только те события, которые в настоящее время выделены.

Формат:

  • Формат Native Process Monitor (PML) – Формат по умолчанию для сохранения всех событий (PML).
  • Значения, разделенные запятыми (CSV) – Сохранить все события в файле CSV.
  • Расширяемый язык разметки (XML) – Сохранить все события в файле XML. Этот формат также позволяет сохранить трассировки трека (подробнее об этом позже) и разрешит символы стека.
Events

Нажмите ОК, и Procmon сохранит все текущие захваченные события, соответствующие вашим критериям, в выбранный вами файл.

Открытие сохраненных журналов событий

Вы захватили тысячи событий на одном компьютере, сохранили их в сеансе захвата в файл PML и скопировали его на другой компьютер для исследования. Что делать дальше? Вам нужно открыть его.

Вы можете открыть любой файл PML, независимо от того, был ли он захвачен на вашем компьютере или нет, просто перейдите в меню Файл -> Открыть и выберите файл PML.

Вы также можете открыть журналы из командной строки, используя параметр /OpenLog, например, procmon.exe /OpenLog C:\MyLogFile.pml.

Автоматическое регистрирование событий

В предыдущем разделе вы узнали, как экспортировать события в журнал после их захвата. Но что, если заранее известно, что вам понадобятся события в формате PML, XML или CSV? Вы можете настроить procmon для автоматического захвата событий в одном из этих форматов.

Также, сохранение событий в файл подкачки подходит, если вы находитесь в простом сеансе отладки, который может продолжаться менее часа. Однако у этого метода есть несколько недостатков.

  1. При закрытии procmon события исчезают.
  2. Как уже упоминалось, размер файла подкачки может стать неподъемным.

При использовании виртуальной памяти в качестве места хранения вы можете узнать, сколько свободного места осталось для использования procmon, щелкнув Файл -> Файлы подкачки.

Что делать? Измените место хранения.

Хранение событий на диске

Вы можете изменить место хранения событий procmon с файла подкачки на диск, выполнив следующие действия:

  1. Остановите захват, если он в данный момент выполняется.

2. Нажмите на Файл —> Резервные файлы. Затем вы увидите сводку событий, сохраненных и их размер, а также опцию изменения места хранения.

Process Monitor Backing Files

3. Чтобы изменить место хранения на файл, щелкните на поле Использовать файл с именем:, нажмите кнопку многоточия и укажите местоположение файла.

Попробуйте использовать другой том диска, чем тот, на котором выполняется procmon, для лучшей производительности.

Вы можете заставить procmon использовать файл в качестве места хранения, также запустив его из командной строки и используя ключ /BackingFile. Если вы хотите вернуться к использованию файла подкачки, используйте ключ /PagingFile.

Преобразование файлов журнала

Procmon может сохранять файлы журнала в три различных формата: PML, CSV и XML. Возможно, вы сохранили файл журнала как PML и хотите разобрать события с помощью сценария или другого инструмента. В этом случае вы можете преобразовать этот файл журнала PML в XML или CSV через командную строку.

Допустим, у вас есть файл журнала PML по пути C:\capture.pml. Вы хотите преобразовать этот файл журнала в XML и один в формат CSV. Вы можете сделать это, сначала открыв файл журнала с помощью ключа /OpenLog, а затем, используя ключ /Save*, сохранить его.

У Procmon есть стандартный параметр /SaveAs, который позволяет сохранить журнал в любом из трех упомянутых форматов. Параметр /SaveAs установит формат файла в зависимости от расширения файла, которое вы предоставите.

Приведены ниже некоторые примеры:

Преобразовать журнал capture.pml в capture.xml:

procmon.exe /OpenLog C:\capture.pml /SaveAs C:\capture.xml

Преобразуйте журнал capture.pml в файл capture.csv:

procmon.exe /OpenLog C:\capture.pml /SaveAs C:\capture.csv

Помните опции трассировки стека и разрешения символов стека в диалоговом окне Сохранить в файл выше? Вы также можете включить эти опции, используя /SaveAs1 и /SaveAs2.

Вы можете сохранять трассы стека и информацию о символах только в формате XML.

Преобразуйте журнал capture.pml в файл capture.xml с включенной информацией о стеке:

procmon.exe /OpenLog C:\capture.pml /SaveAs1 C:\capture.xml

Преобразуйте журнал capture.pml в файл capture.xml с включенной информацией о стеке и символах:

procmon.exe /OpenLog C:\capture.pml /SaveAs2 C:\capture.xml

Учтите, что добавление трасс стека и символов значительно увеличит время преобразования, и вы обязательно увидите индикатор прогресса, как показано ниже.

Progress Indicator

Захват событий времени загрузки

Иногда информация, которую вам нужно исследовать, не генерируется, когда Windows работает. Возможно, вам также потребуется исследовать, что делает процесс, когда Windows только загружается.

Часто требуется устранить проблемы, такие как медленная загрузка или, возможно, вредоносное ПО, которое решает запуститься сразу после запуска Windows. В Procmon есть функция Журналирование времени загрузки, которую можно включить для записи этой информации.

Чтобы включить журналирование загрузки, щелкните Параметры —> Включить журналирование загрузки в меню, как показано ниже.

Enabling boot logging

После того, как вы нажмете Включить журналирование загрузки, появится диалоговое окно, запрашивающее дополнительную информацию. В этом диалоговом окне можно захватить события профилирования потоков.

Включение событий профилирования потоков – это расширенное использование. Когда вы включаете профилирование потоков, Procmon записывает стеки вызовов потоков и использование ЦП, которые можно использовать для определения источника проблем производительности, связанных с ЦП.

Optional thread-profiling events for boot time logging

После нажатия кнопки OK, Procmon включит режим записи загрузки, что указывает драйверу фильтра (о чем позже) подождать следующей перезагрузки Windows. После перезагрузки Windows Procmon начнет захватывать события процессов так, как если бы вы сделали это вручную.

Все данные о событиях во время загрузки сохраняются во временном файле журнала C:\Windows\procmon.pmb.

Когда Windows снова запустится, снова откройте Procmon. Вы должны увидеть диалоговое окно, как показано ниже. Здесь нажмите Да, чтобы конвертировать данные о загрузке в формат PML, выбрав затем файл журнала для сохранения данных.

Confirmation to convert boot-time events to PML

После того, как Procmon сконвертирует данные, вы увидите полосу прогресса, как показано ниже.

Converting boot-time event data to PML

Не забудьте снова запустить Procmon после перезагрузки! Procmon начнет захватывать события сразу после загрузки Windows в C:\Windows\procmon.pmb. Он будет продолжать это делать до тех пор, пока вы не отключите его, снова открыв Procmon.

Запуск Procmon удаленно

Хотя Procmon работает только локально на машине с Windows, вы можете вызвать Procmon для запуска удаленно с помощью psexec или команды Invoke-Command в PowerShell.

Связано: PsExec: Полное руководство, Invoke-Command: Лучший способ запуска удаленного кода

Чтобы запустить Procmon с помощью команды Invoke-Command PowerShell, выполните следующие шаги:

  1. Включите удаленное управление PowerShell на удаленной машине, если еще не включено.

2. Скопируйте папку procmon на удаленный компьютер через консоль PowerShell.

Copy-Item -Path C:\procmon \\MYPC\c$

3. Вызовите Procmon через PowerShell, убедившись, что вы пропускаете подтверждение EULA и заставляете Procmon сохранять события в файл резервного копирования, а не в виртуальной памяти, и не запрашиваете фильтр при запуске.

Invoke-Command -Computer MYPC -ScriptBlock { C:\procmon\procmon.exe /AcceptEula /BackingFile C:\capture.pml /Quiet }

4. На этом этапе Procmon начнет захват. Воспроизведите проблему, которую вы пытаетесь захватить.

5. Остановите Procmon на удаленном компьютере, используя переключатель /Terminate.

Invoke-Command -Computer MYPC -ScriptBlock { C:\procmon\procmon.exe /Terminate }

6. Дождитесь завершения работы Procmon. Как сокращенную форму, вы можете периодически проверять процесс Procmon и возвращать управление в консоль PowerShell, когда он завершится.

while (Invoke-Command -Computer MYPC -ScriptBlock { Get-Process procmon -ErrorAction Ignore }) {
     Write-Host "Waiting on procmon to exit…"
     Start-Sleep -Seconds 5
 }

7. Скопируйте удаленный файл журнала на локальный компьютер

$session = New-PSSession -ComputerName MYPC
Copy-Item -Path C:\log.pml -Destination C:\ -FromSesson $session
$session | Remove-PSSession

На данный момент у вас есть файл журнала, выполненный удаленно, на вашем локальном компьютере!

Если вам нужен правильный сценарий PowerShell для управления этим захватом, вы можете найти его ниже.

[CmdletBinding()]
 param(
     [Parameter()]
     [string]$ComputerName, 
     [Parameter()]
     [string]$LogFilePath = 'C:\capture.pml'
 )
 $procmonFolderPath = 'C:\procmon'
 try {
     $session = New-PSSession -ComputerName $ComputerName
     Copy-Item -Path $procmonFolderPath -Destination $procmonFolderPath -ToSession $session $scriptBlock = {
         & "$using:procmonFolderPath\procmon.exe" /AcceptEula /BackingFile $using:LogFilePath /Quiet
         & "$using:procmonFolderPath\procmon.exe" /Terminate
         while (Get-Process procmon -ErrorAction Ignore) {
             Write-Host "Waiting on procmon to exit…"
             Start-Sleep -Seconds 5
         }
     }
     Copy-Item -Path $LogFilePath -Destination C:\ -FromSesson $session
 } catch {
     throw $_
 } finally {
     $session | Remove-PSSession
 }

Настройка длительного захвата Procmon

A busy Windows system can produce a lot of events procmon captures that can overwhelm your PC. If you intend to run procmon for an extended amount of time, there a few measure you should take into consideration.

Отбор событий

Когда Procmon выполняет захват, он захватывает все события. Вы можете создавать и применять фильтры событий, но эти фильтры просто скрывают события на экране; они не предотвращают захват их Procmon.

Если вы собираетесь выполнять захват событий Procmon в течение длительного времени, всегда хорошая идея выбирать Drop Filtered Events в меню Filter, как показано ниже.

Drop Filtered Events

После выбора элемента Drop Filtered Events, Procmon сразу начинает отбрасывать все отфильтрованные события. Он не отображает их на экране, и не сохраняет в виртуальной памяти или файле журнала. Полное отсечение нежелательных событий помогает экономить ресурсы.

Расширенные темы

Вы все еще ищете больше информации о Procmon и его использовании? Давайте перейдем к некоторым расширенным темам! Эти темы, вероятно, вам не придется часто использовать. Они касаются более глубоких функций Procmon, но эта информация может быть полезной при устранении неполадок.

Драйверы фильтрации

Для захвата событий Procmon регистрирует и использует фильтр-драйвер через менеджер фильтров Windows (FltDrv). Этот фильтр-драйвер, названный PROCMON24, устанавливается при запуске захвата. Иногда этот фильтр-драйвер может конфликтовать с другими приложениями.

После запуска Procmon откройте повышенную консоль PowerShell или командную строку и выполните команду fltmc filters. Утилита fltmc перечисляет, загружает и выгружает фильтр-драйверы. При выполнении этой команды вы увидите загруженный фильтр PROCMON24, как показано ниже.

Обратите внимание, что Высота PROCMON24 по умолчанию составляет 385200, а остальные фильтры имеют более низкое значение. Высота фильтра драйвера представляет собой уровень, на котором фильтр драйвера может “видеть” события. Например, события, происходящие на уровне wcifs, luafv или Wof, procmon не сможет видеть. Подробнее о изменении этого значения будет рассказано позже.

Procmon 24

Фильтр драйвера PROCMON24 остаётся загруженным, даже когда procmon не запущен.

Иногда у procmon могут возникать проблемы с загрузкой фильтр драйвера. Чтобы устранить неполадки, откройте procmon с помощью переключателя /NoConnection, чтобы предотвратить подключение к фильтр драйверу.

Выгрузка фильтр драйвера PROCMON24

Иногда фильтр драйвера PROCMON24 может конфликтовать с различными аппаратными устройствами, и вам потребуется его выгрузить. Но это может быть не так просто, как кажется.

Вы можете выгрузить фильтр драйвера с помощью команды fltmc unload, за которой следует имя фильтр драйвера.

fltmc unload PROCMON24

Но если вы попытаетесь выполнить вышеприведенную команду, вы скоро узнаете, что она не работает. Вы не можете выгрузить этот фильтр драйвера, потому что, вероятно, разработчик не добавил такую возможность.

Can’t Unload the Filter

Если вам нужно выгрузить фильтр драйвера PROCMON24, к сожалению, единственный способ сделать это – перезагрузка системы.

Отслеживание стека

Иногда простые события, такие как чтение ключа реестра, открытие файла или вызов сетевого адреса, не достаточно глубоки. Вам нужно копнуть глубже и посмотреть историю фактических вызовов функций Windows API, которые процесс вызывает. Вам нужно посмотреть стек вызовов процесса.

A stack trace is the history of various functions called during various function calls when a process is running.

Список событий, отображаемых в procmon, позволяет дважды щелкнуть на любом событии и нажать на вкладку Стек, как показано ниже. Вкладка Стек представляет собой вызовы функций, которые индивидуальный процесс сделал в момент возникновения события.

Stack Tab

Тема трассировки стека может занимать много времени. Если вы хотите узнать больше о понимании стека вызовов процесса, ознакомьтесь с статьей Получение более подробных трасс стека в Мониторе процессов

Изменение высоты Процмона (захват более низкоуровневых событий)

Как уже упоминалось ранее, procmon использует драйвер фильтра для захвата событий. Несмотря на то, что может показаться, что procmon захватывает каждое событие Windows (в окне procmon появляется много событий!), это не так. Procmon захватывает только те события, о которых знает его драйвер фильтра или высоту, на которой находится его драйвер фильтра.

Например, если вам нужно вести журнал активности антивируса, низкоуровневых событий хранения и других низкоуровневых событий оборудования, вы должны изменить высоту драйвера фильтра PROCMON24 на более низкую, чем у других.

Чтобы сделать это:

  1. Убедитесь, что Procmon закрыт.

2. Найдите самый низкий уровень высоты среди загруженных в данный момент драйверов фильтра с помощью команды fltmc.

fltmc filter

3. Измените значение реестра Altitude в ключе реестра HKLM\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance на 100 меньше самого низкого значения высоты (чтобы увидеть все события).

В зависимости от версии Procmon, установленной у вас, могут измениться местоположение ключа реестра. В этом руководстве используется Procmon 2.4.

Вы можете открыть повышенную сеанс PowerShell и выполнить нижеследующий фрагмент кода, чтобы быстро изменить значение.

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance' -Name 'Altitude' -Value 40400

Чем ниже устанавливается высота, тем больше событий вам придется управлять. Не устанавливайте высоту ниже необходимого значения.

4. Запретите права Удаление и Установить значение для Все на ключе Process Monitor 24 Instance. Когда Procmon снова запустится, он попытается вернуть значение Altitude к значению по умолчанию. Вы можете изменить эти разрешения с помощью утилиты regedit или просто выполнить нижеприведенный фрагмент кода PowerShell.

$regKeyPath = 'HKLM:\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance'
$acl = Get-Acl $regKeyPath
$idRef = System.Security.Principal.NTAccount
$regRights = @([System.Security.AccessControl.RegistryRights]::Delete,[System.Security.AccessControl.RegistryRights]::SetValue) 
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None
$acType = [System.Security.AccessControl.AccessControlType]::Deny
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType) 
$acl.SetAccessRule($rule) $acl | Set-Acl -Path $regKeyPath

5. Выгрузите драйвер фильтра PROCMON24, перезагрузив Windows.

6. Запустите Procmon.

7. Откройте консоль PowerShell или командную строку и выполните команду fltmc filters. Теперь вы должны увидеть драйвер фильтра Procmon на новой высоте.

PowerShell console or command prompt

Вы теперь можете захватывать все, что вам нужно. Если вы установите параметр Altitude в procmon на минимальное значение, просто готовьтесь к событию муссона!

Реальные примеры

Теперь у вас должно быть хорошее представление о том, что может делать procmon и как он может помочь вам отслеживать события в Windows. Давайте теперь применим эти знания и рассмотрим несколько общих случаев использования, когда вам может понадобиться такая экспертиза.

Поиск того, кто удаляет файл

Если у вас есть файл на вашем компьютере под управлением Windows, который по неизвестной причине постоянно удаляется, и вы хотите отследить это, procmon может помочь (и это довольно просто).

Возможно, вы открыли procmon и попытались установить событие с файлом под названием Delete или Remove, но, к вашему удивлению, такой операции не существует. Вместо этого, чтобы найти события удаления файла, вы должны отфильтровать события с Operation:

  • SetDispositionInformationFile
  • SetDispositionInformationEx

Если ваша система удаляет много файлов, вы также захотите ограничить события удаления файла до имени файла или пути с использованием фильтра Path.

Operation is          SetDispositionInformationEx   Include
Operation is          SetDispositionInformationFile Include
Path      begins with C:\MyFolder                   Include

Решение проблем с заблокированными файлами

Мы все были там; вы пытаетесь переместить или удалить файл, и его блокирует какой-то другой процесс. Иногда, если вы пытаетесь удалить приложение, например, вы никогда не узнаете, связана ли та случайная ошибка, которую вы видите, с заблокированным файлом в первую очередь!

Чтобы выяснить, когда Windows пытается удалить или изменить заблокированный файл, используйте нижеследующий набор фильтров.

Operation is CreateFile        Include
Result    is SHARING VIOLATION Include

Устранение неполадок приложений, требующих прав администратора

Вы работаете с приложением, которое, согласно документации, должно работать, но не работает? Мы все были в такой ситуации. Иногда некоторый процесс, созданный этим приложением, требует повышенных привилегий, но не указывает, где и как их получить. В этом случае вы можете воспользоваться утилитой Procmon, чтобы разобраться в ситуации.

Один из способов выявить процессы, получающие отказ доступа из-за требуемых повышенных прав, это использовать фильтр по значению Result события.

Когда происходит событие, получающее отказ доступа из-за отсутствия повышенных прав, обычно в поле Result отображается значение ACCESS DENIED. Зная это, вы можете легко создать простой фильтр, отображающий все события с Result, равным ACCESS DENIED, как показано ниже.

Result is ACCESS DENIED Include

Отсюда вы можете добавить дополнительные фильтры, например, для реестра или пути к папке, с помощью атрибута Path.

Поиск процесса, обращающегося к IP-адресу

Возможно, у вас возникло необычное сетевое поведение с использованием программы Wireshark, и вы хотите выяснить, какой процесс инициирует эту связь. Запустите утилиту Procon и добавьте следующий набор правил фильтрации.

Эти правила фильтрации ограничивают события только локальным сетевым трафиком с указанным IP-адресом в качестве назначения.

Operation   is       TCP Send        Include
Operation   is       UDP Send        Include
Path        contains ->  Include
Event Class is       Network         Include

Устранение медленной загрузки

Иногда Windows медленно загружается. Это может быть вызвано различными компонентами Windows, установленными приложениями и т. д. С помощью возможности ведения журнала загрузки в утилите Procmon вы можете выявить и устранить проблему.

  1. Включите журналирование загрузки. Вы можете узнать, как это сделать в разделе Захват событий времени загрузки выше.

2. На диалоговом окне Включить журналирование загрузки обязательно установите флажок Генерировать события профилирования потоков. Радиокнопка Каждую секунду должна быть достаточной.

Enabling thread profiling events on boot

3. После перезагрузки откройте procmon, щелкните правой кнопкой мыши на любом столбце и выберите Выбрать столбцы.

4. В окне Выбор столбцов Process Monitor установите флажок Продолжительность. После этого вы сможете видеть, как долго выполнялось каждое событие.

Process Monitor Column

5. Теперь вы можете создать правило фильтрации по Продолжительности на определенное количество секунд, которое вы считаете достаточным. Ниже приведено правило фильтра, которое будет отображать только события, которые заняли более пяти секунд.

filter rule on Duration

6. Наконец, еще один полезный способ исследования этих медленных событий – использовать Дерево процессов в procmon. Дерево процессов показывает отношения между родительскими и дочерними процессами и содержит время начала и окончания каждого процесса. Чтобы найти его, щелкните по Инструменты —> Дерево процессов.

Process Tree

7. Как только вы окажетесь в Дереве процессов, обратите внимание на столбец Время жизни, который показывает в графическом формате продолжительность времени каждого процесса. Вы также можете заметить временные промежутки, сравнивая столбцы Время начала и Время завершения в этом представлении.

Lifetime Column

Решение проблем приложений App-V

Многие организации используют службу App-V от Microsoft, чтобы виртуализировать и разворачивать приложения для конечных пользователей. Если вы используете App-V, вам нужно знать о удобном (и не задокументированном) переключателе procmon под названием /externalcapture.

Использование .\procmon.exe /ExternalCapture обычно позволяет захватывать больше реестровой активности вокруг приложений App-V. Попробуйте этот переключатель, если вы не можете найти то, что вам нужно при устранении неполадок с приложениями App-V!

Переключатель /HookRegistry, предположительно, выполняет ту же функцию, что и /ExternalCapture, но он больше не работает на 64-битных машинах.

В заключение

Вот вам и подробное руководство по всему, что касается procmon! Хотя вы много узнали о procmon, всегда есть еще много интересного, что можно обнаружить с помощью этой удобной утилиты.

Если у вас есть предложения по обновлению или изменению этого исчерпывающего руководства, пожалуйста, свяжитесь со мной на Twitter и дайте знать!

Source:
https://adamtheautomator.com/procmon/