O Guia Definitivo para o Procmon

Procmon. O infame utilitário do Windows Sysinternals para rastrear todo tipo de atividade do Windows. Conhecido por sua capacidade de rastrear instaladores de software malicioso fazendo alterações desconhecidas nas chaves do registro ou talvez inspecionando as pegadas de um vírus.

Se você precisa inspecionar o registro do Windows, o sistema de arquivos, a atividade do processo ou da rede e decidiu usar o procmon, este artigo é para você.

Neste Guia Definitivo, você vai aprender tudo o que há para saber sobre o uso do utilitário procmon, desde a instalação, o uso básico até vários casos de uso que o ajudarão a rastrear todo tipo de atividade.

Pré-requisitos

Este Guia Definitivo se aplicará a quase todos os sistemas Windows, mas, para completude (e para evitar que você tente executar o procmon em um computador com Windows 3.1), você precisará do seguinte:

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

É isso! Você vai baixar e instalar o procmon nas seções a seguir. O Guia usará a versão 3.6 do procmon em uma máquina com Windows 10 Build 1909 x64.

Baixando e Executando o Procmon

Para começar, você precisará do procmon em execução em sua máquina com Windows. Você pode obtê-lo de duas maneiras diferentes; via método de download tradicional ou o que a Windows Sysinternals chama de Sysinternals live.

Do Modo Antigo

O Procmon não precisa ser instalado; é um único executável. Você pode obtê-lo baixando o arquivo ZIP. Depois de baixá-lo, extraia o arquivo ZIP com sua ferramenta favorita. Abaixo está um trecho de código PowerShell se você o salvou na sua pasta pessoal. Este trecho de código criará uma pasta em ~\ProcessMonitor com todos os arquivos necessários.

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

Dentro da pasta ~\ProcessMonitor, você verá cinco arquivos:

  • Eula.txt – O acordo de licença que você terá que aceitar antes de executar o Procmon.
  • procmon.chm – O arquivo de ajuda que contém toda a documentação fornecida.
  • Procmon.exe – O principal arquivo EXE que lançará a instância correta do Procmon (x86 ou x64).
  • Procmon64.exe – O binário x64 do Procmon.
  • Procmon64a.exe – O binário alpha 64 do Procmon.

Agora execute o Procmon invocando o arquivo ~\ProcessMonitor\procmon.exe.

O Procmon só é executado com permissões elevadas, então você será solicitado a aceitar isso se tiver o UAC ativado quando o executar. Há uma maneira de contornar isso que será abordada mais tarde neste Guia.

Sysinternals Live

Se preferir não (ou não puder) baixar um arquivo EXE, você também pode usar a pasta Sysinternals Live. Para fazer isso, abra o Explorador de Arquivos e cole \\live.sysinternals.com\tools. Você verá então uma pasta como qualquer compartilhamento de rede com todos os arquivos do Sysinternals, incluindo o procmon.

Sysinternals Live

Role para baixo até encontrar procmon, clique duas vezes e voilà, você está executando o procmon!

Personalizando o Comportamento de Início do Procmon

Por padrão, o procmon é iniciado solicitando que você aceite um contrato de licença de usuário final (EULA) e também abre uma janela. Usando a linha de comando, você pode personalizar esse comportamento padrão.

Por exemplo, se você deseja iniciar o procmon minimizado usando o switch /Minimized.

.\procmon.exe /Minimized

Talvez você esteja executando o procmon em uma máquina nova e prefira não ver a solicitação da EULA. Você pode desativar isso no início usando o switch /AcceptEula.

.\procmon.exe /AcceptEula

Embora menos comum nos dias de hoje, sempre que você inicia o procmon, ele detecta se você está executando um sistema operacional de 64 bits ou 32 bits. Se estiver em uma máquina de 64 bits, ele iniciará um processo de 64 bits e vice-versa. Se estiver em uma máquina de 64 bits e desejar executar o procmon como um processo de 32 bits ou ler um arquivo de log (mais sobre isso depois) que foi gerado a partir de uma máquina de 32 bits, use o switch /Run32.

.\procmon.exe /Run32

O Procmon possui outros switches de linha de comando para personalizar o comportamento, mas você aprenderá sobre isso nas próximas seções.

Introdução ao Procmon

Quando você inicia o Procmon pela primeira vez, pode ficar sobrecarregado com as opções. Não se preocupe, você aprenderá praticamente tudo neste Guia! Abaixo, você pode ver uma captura típica em andamento do Procmon.

Default Procmon process view

No momento em que você executa o Procmon, ele começa a capturar muitos tipos diferentes de eventos do Windows.

Se você não quiser que o Procmon comece automaticamente a capturar eventos, pode iniciá-lo a partir da linha de comando, executando procmon.exe /NoConnect.

Conforme mostrado na captura de tela acima, na coluna Operação, existem vários ícones, cada um representando diferentes classes de eventos do Windows. O Procmon captura eventos de cinco classes diferentes:

  • Registro
  • Sistema de arquivos
  • Rede
  • Processos
  • Eventos de perfil

Cada evento em todas as classes é representado em um único painel de lista de sete colunas:

  • Hora do dia – O horário em que o evento ocorreu.
  • Nome do processo – O nome do processo que desencadeou o evento.
  • PID – O identificador do processo.
  • Operação – O tipo de evento, como se o processo abrisse um arquivo, alterasse um valor de chave do registro, etc.
  • Caminho – O caminho para o objeto com o qual o evento interagiu, como um caminho de arquivo, caminho de registro, etc.
  • Resultado – Esta coluna conterá inúmeros valores para indicar o resultado do evento. Este valor pode ser tão simples como SUCESSO ou específico para o evento, como REPARAÇÃO, ESTOURO DE BUFFER, NOME NÃO ENCONTRADO, etc.
  • Detalhe – Esta coluna contém todos os detalhes minuciosos uma vez que você identifica um evento que gostaria de ver.

Se preferir não ver uma determinada coluna ou gostaria de ver quais outras colunas estão disponíveis, clique com o botão direito do mouse em qualquer cabeçalho de coluna e escolha Selecionar colunas. Você será apresentado com uma caixa de diálogo onde pode personalizar as colunas visíveis.

Customizing procmon columns

Na janela de evento, clique duas vezes em um evento. Você pode encontrar muitos mais detalhes sobre o processo e o próprio evento visualizando as guias Evento, Processo e Pilha.

Procmon event properties window

Habilitando e Desabilitando Capturas

Você tem controle total sobre o processo de captura. Você pode desabilitar todo o processo de captura ou desabilitar a captura por classe de evento.

Na barra de menu superior, você verá um ícone de lupa (abaixo). Se a lupa tiver um X vermelho sobre ela, isso significa que a captura está desabilitada. Caso contrário, a captura está habilitada.

Procmon actively capturing events

Não deixe o procmon capturando eventos por mais tempo do que precisa. Ele usa memória virtual para armazenar todos esses eventos e se não tiver cuidado, pode acabar travando o Windows! Você pode alterar esse comportamento conforme verá um pouco mais tarde.

Se preferir ser mais seletivo, também pode controlar a captura de cada classe de evento. Na barra de menu, você verá cinco dos mesmos ícones sendo exibidos na coluna Operação. Ao clicar nesses botões, você pode ativar e desativar classes de evento inteiras.

Types of Windows events

Passe o mouse sobre cada ícone para ver que tipo de atividade cada ícone representa.

Você verá assim que clicar em um ícone, o Procmon aplica um filtro de evento. Dependendo de quantos eventos foram capturados até agora, você pode ver um pop-up como o abaixo.

Types of Windows events

Por padrão, o ícone mais à direita (o gráfico preto e verde) não está habilitado. Se desejar habilitar esta classe de evento quando o Procmon iniciar, você pode invocar o Procmon a partir da linha de comando usando .\procmon.exe /Profiling.

Você pode ver o número de eventos na janela olhando para baixo. Como pode ver abaixo, o Procmon processou 84.334 eventos, mas devido ao filtro de eventos aplicado, está mostrando apenas 15.912 deles ou 18% deles. Você também pode ver que esses eventos estão sendo armazenados na memória virtual (mais sobre isso depois).

Number of Events in the Window

Filtros de Evento

Para entender o Procmon, você indubitavelmente precisa entender o conceito de filtros de evento. Os filtros de evento são como você separa o sinal do ruído. Os filtros de evento ocultam todos os eventos que você não está interessado. Acima, você aplicou filtros de evento por classes de eventos inteiros, mas você pode ficar muito mais granular.

Existem várias maneiras de interagir com os filtros de eventos. Vamos começar de forma simples. Clique no item de menu Filtro no topo. Você verá muitas opções diferentes para trabalhar com filtros.

Filter menu options

Visualizando Filtros

Por padrão, o Procmon cria um filtro para você. Sob o item de menu Filtro, clique em Filtrar…. Você verá uma caixa de diálogo Filtro do Monitor de Processos aparecer com duas áreas; uma para filtrar suas regras de filtro e outra para visualizar todas as regras que você configurou. Você pode ver um exemplo disso abaixo.

Filter rules

Por padrão, o Procmon mostrará os filtros acima sempre que você o iniciar. Se desejar ocultar esta caixa, você pode fazer isso iniciando o Procmon com o comando /Quiet.

Você deve perceber que, sem criar nenhum filtro próprio, o Procmon também está usando um conjunto embutido de regras de filtro. Se você rolar para baixo na caixa de diálogo Filtro do Monitor de Processos, verá muitos tipos diferentes de regras definidas. Aqui você pode visualizar cada categoria, operador, valor e ação a ser tomada para cada regra.

Esses filtros são aplicados porque geralmente você não precisará ver os eventos que esses filtros excluem. Mas, se desejar ver todos os eventos, você também pode simplesmente remover todos os filtros padrão ou clicar em Filtro —> Ativar Saída Avançada como mostrado abaixo.

Enable Advanced Output

Por exemplo, você verá algumas regras no topo que mostram o Nome do Processo para o valor da coluna Coluna, é para Relação, vários processos relacionados ao procmon para o valor da coluna Valor e uma Ação de Excluir. Em termos simples, essas regras dizem ao procmon para não exibir (excluir) um processo com o nome de procmon.exe, por exemplo.

Gerenciando Regras de Filtro de Eventos

Dependendo do seu caso de uso, você certamente precisará adicionar suas próprias regras. Existem algumas maneiras diferentes de adicionar regras.

Usando a Caixa de Filtro do Process Monitor

Na última seção, você viu como era a caixa de Filtro do Process Monitor e visualizou todas as regras. Nesta caixa, você também pode criar, modificar e remover regras.

Vamos supor que você queira ver apenas as vezes em que o processo explorer.exe consultou uma chave do registro.

Adicionando Filtros de Evento

Na caixa de Filtro do Process Monitor:

  1. Clique na lista suspensa mais à esquerda. Essa lista mostra todas as várias categorias de eventos em que você pode filtrar. Você pode ver abaixo que há muitas opções!

    Cada item que você vê nesta lista corresponde a uma coluna exibida na visualização principal, conforme mostrado abaixo. Para o propósito deste artigo, escolha Nome do Processo.

Process Monitor Filter

2. Escolha uma categoria e, em seguida, escolha um operador. Por padrão, a caixa de seleção será é, mas você tem muitas outras opções se clicar na caixa suspensa. Esses operadores permitem filtrar a opção escolhida de muitas maneiras diferentes. Como você está procurando um processo que seja exatamente explorer.exe, escolha é.

Operator List

3. Finalmente, escolha o nome do processo conforme mostrado abaixo. Você notará que, como escolheu Nome do Processo como categoria, o Procmon automaticamente exibe todos os processos em execução atualmente para escolher.

Process Name in Process Monitor Filter

4. Certifique-se de ter escolhido Incluir, já que você deseja ver os eventos que atendem a esse critério. Em seguida, clique no botão Adicionar para adicionar a regra ao seu filtro atual. Você pode ver abaixo que a regra de inclusão é exibida como um marca de seleção verde.

5. Por fim, como você deseja todos os eventos em que explorer.exe consulta uma chave de registro, certifique-se de incluir também a operação RegQueryKey. Quando terminar, você deverá ver ambas as regras adicionadas.

RegQueryKey

6. Clique em OK e você verá a janela principal remover todos os eventos que não correspondem às regras de filtro que você definiu.

Events that do not match the filter rules

Removendo Regras de Filtro de Eventos

Você também pode remover e alterar facilmente as regras de filtro.

  1. Clique no ícone de Filtro no topo da janela principal para abrir a caixa Filtro do Monitor de Processos.
Process Monitor Filter Box

2. Destaque ambas as regras de filtro que você criou acima, clique no botão Remover conforme mostrado abaixo e clique em OK. Essa ação removerá ambas as regras personalizadas adicionadas anteriormente.

remove both of the custom rules added

Você também pode clicar no botão Redefinir para remover automaticamente todas as regras de filtro personalizadas.

Sempre que aplicar um filtro, encerre o procmon e inicie-o novamente; esse filtro será aplicado novamente. Se desejar garantir que nenhum filtro seja aplicado ao iniciar o procmon, você pode invocar o procmon com a opção /NoFilter.

Adicionando Regras de Filtro com Clique Direito

Você também pode adicionar regras de filtro através de um menu de clique direito se clicar com o botão direito em um processo. Como você pode ver abaixo, você pode criar qualquer tipo de regra diretamente a partir deste menu; não é necessário ir para a caixa Filtro do Monitor de Processos em absoluto!

add filter rules via a right-click menu

Para remover regras de filtro criadas através do menu de clique direito, ainda será necessário ir para a caixa Filtro do Monitor de Processos para removê-las.

Salvando e Gerenciando Filtros Personalizados

Se você é um usuário avançado do procmon, provavelmente chegará um momento em que terá conjuntos de regras de filtro para várias ocasiões. Usando os recursos de salvamento e organização de filtros do procmon, você pode gerenciar e salvar quantos desses conjuntos desejar.

Vamos dizer que você tem um monte de filtros personalizados definidos e gostaria de salvá-los para usá-los novamente em algum momento. Você pode salvar esse filtro indo até Filtro, escolhendo Salvar Filtro e fornecendo um nome como mostrado abaixo.

Saving a filter

Assim que o filtro for salvo, você pode então ir até Filtro, clicar em Organizar Filtros onde você verá todos os filtros que salvou. A partir daqui, você pode clicar em um filtro, clicar em OK e seu filtro salvo será aplicado à janela atual.

Viewing and loading filters

Você também pode carregar um filtro salvo passando o mouse sobre Carregar Filtro no menu suspenso Filtro e escolhendo seu filtro salvo na lista à direita.

Loading a filter

Importando e Exportando Filtros

Se você espera carregar o Procmon em outro computador e manter todos os seus filtros salvos, está sem sorte. O Procmon não possui um serviço em nuvem para sincronizar filtros. Mas, você pode exportar manualmente filtros e importá-los posteriormente.

Para exportar filtros do Procmon:

  1. Vá para a caixa de Organizar Filtros.
  2. Clique no filtro que já salvou e deseja exportar.
  3. Clique no botão Exportar.
  4. Forneça um nome, escolha um caminho e clique em OK. Você verá que todos os filtros do Procmon são salvos com a extensão PMF.

Para importar filtros do Procmon:

  1. Vá para a caixa de Organizar Filtros.
  2. Clique no botão Importar.
  3. Encontre o filtro que deseja importar e clique em OK.

Você pode ver um guia visual desses passos abaixo.

import procmon filters

Importando e Exportando Configurações do Procmon

Como aprendido anteriormente, é possível exportar e importar filtros do Procmon por meio de arquivos PMF. Mas filtros são apenas um componente que compõe uma instância do Procmon. É possível personalizar as colunas, alterar a localização de armazenamento (mais sobre isso depois) e muito mais. Não seria bom também salvar todas essas configurações? Você pode!

Para salvar toda a configuração do Procmon, clique em Arquivo -> Exportar Configuração e escolha uma localização onde deseja salvar o arquivo PMC (configuração do Procmon).

Export Configuration

Depois de salvar, você pode fechar o Procmon no mesmo computador (ou até mesmo em um diferente), abrir o Procmon novamente e clicar em Arquivo -> Importar Configuração, onde o Procmon aplicará todos os mesmos filtros e outras configurações exatamente como foram exportados.

Também é possível carregar configurações salvas (incluindo filtros) via linha de comando usando o parâmetro /LoadConfig seguido do caminho do arquivo, por exemplo: ./procmon.exe /LoadConfig C:\ProcmonConfigs\file_deletion.pmc.

Destacando Eventos e Convertendo em Filtros

Talvez você precise destacar certos eventos para facilitar sua identificação, mas não queira necessariamente remover esses eventos da visualização com um filtro. Nesse caso, você pode usar destaques. Os destaques permitem que você crie conjuntos de regras, assim como os filtros, mas em vez de ocultar eventos, a cor de fundo dos eventos é alterada.

Talvez você veja um processo na lista de eventos chamado ctfmon.exe que deseja destacar na lista. Você pode criar uma regra de destaque assim:

  1. Clique com o botão direito no evento que deseja destacar um atributo.
  2. Clique em Destacar e escolha um atributo desse evento para destacar. Neste exemplo, você escolheria Nome do Processo. Em seguida, você verá a cor de fundo mudar para uma cor azul claro.
  3. Depois que a regra de destaque for criada, você poderá ir para a caixa de Realce do Monitor de Processos clicando em Filtrar —> Destacar. Você verá a regra de destaque criada lá.
  4. A partir da caixa de Realce do Monitor de Processos, você pode adicionar e remover regras da mesma forma que faz com um filtro.
  5. Se você criou algumas regras de destaque e gostaria de transformá-las em um filtro, pode fazer isso clicando no botão Fazer Filtro na caixa de Realce do Monitor de Processos.

Você pode ver uma demonstração visual desses passos abaixo.

Highlighting Events and Converting to Filters

Exportar e Abrir Eventos de/para Arquivos de Log

Para que o Procmon exiba eventos para você em uma janela, eles precisam ser armazenados em algum lugar. Por padrão, os eventos são armazenados na memória virtual, mais especificamente no seu arquivo de página.

events are stored in virtual memory

Dependendo de quão grande é o arquivo de página que você definiu (e do limite de compromisso do sistema), depende de quantos eventos o Procmon pode armazenar.

O Procmon é capaz de capturar até 199 milhões de eventos.

Salvando Eventos em um Arquivo de Log

Talvez precise guardar esses eventos para investigação posterior ou carregá-los em outro computador? Nesse caso, precisa guardar os eventos em um arquivo de log (PML).

Uma maneira de salvar esses eventos úteis é clicar em Arquivo —> Salvar. Esta ação abrirá a caixa de diálogo Salvar em Arquivo abaixo, onde você será apresentado(a) com algumas opções.

Eventos para salvar:

  • Todos os eventos – Esta opção é exatamente como parece. Irá salvar todos os eventos capturados pelo Procmon, independentemente de ter aplicado um filtro de eventos ou não a um arquivo.
  • Eventos exibidos usando filtro atual – Esta opção não salva todos os eventos capturados, mas apenas aqueles que passaram pelos seus filtros de eventos atualmente ativos.
  • Eventos destacados – Esta opção exporta para o log apenas os eventos que você destacou atualmente.

Formato:

  • Formato Nativo do Monitor de Processos (PML) – O formato padrão para salvar todos os eventos (PML).
  • Valores Separados por Vírgula (CSV) – Salva todos os eventos em um arquivo CSV.
  • Linguagem de Marcação Extensível (XML) – Salva todos os eventos em um arquivo XML. Este formato também permite salvar rastros de trilha (mais sobre isso depois) e resolverá símbolos de pilha.
Events

Clique em OK e o Procmon irá registrar todos os eventos capturados atualmente que correspondem aos seus critérios no arquivo de sua escolha.

Abrindo Logs de Eventos Salvos

Você capturou milhares de eventos em um computador, salvou essa sessão de captura em um arquivo PML e o copiou para outro computador para investigação. E agora? Você precisa abri-lo.

Você pode abrir qualquer arquivo PML, independentemente de tê-lo capturado no seu computador local ou não, simplesmente indo para Arquivo —> Abrir e escolhendo o arquivo PML.

Você também pode abrir logs a partir da linha de comando usando a opção /OpenLog, por exemplo, procmon.exe /OpenLog C:\MeuArquivoDeLog.pml.

Registro Automático de Eventos

Na seção anterior, você aprendeu como exportar eventos para um log depois de capturá-los. Mas e se você souber antecipadamente que deseja eventos em um arquivo PML, XML ou CSV? Você pode fazer com que o procmon capture automaticamente eventos em um desses formatos de arquivo de log.

Além disso, armazenar eventos no arquivo de página é aceitável se você estiver em uma sessão de solução de problemas ad hoc simples que pode durar menos de uma hora. No entanto, este método tem algumas desvantagens.

  1. Sempre que você fecha o procmon, os eventos desaparecem.
  2. Como mencionado antes, o tamanho do arquivo de página pode crescer descontroladamente.

Ao usar a memória virtual como local de armazenamento, você pode descobrir quanto espaço resta para o procmon usando Arquivo —> Arquivos de Suporte.

O que fazer? Altere o local de armazenamento.

Armazenando Eventos no Disco

Você pode alterar onde o procmon armazena eventos do seu arquivo de página para o disco, fazendo o seguinte:

  1. Interrompa a captura se estiver em execução.

2. Clique em Arquivo -> Arquivos de Backup. Você verá um resumo dos eventos armazenados e o tamanho, juntamente com uma opção para alterar o local de armazenamento.

Process Monitor Backing Files

3. Para alterar o local de armazenamento para um arquivo, clique no campo Usar arquivo denominado:, clique no botão de reticências e defina um local de arquivo.

Tente usar um volume de disco diferente do que o procmon está sendo executado para obter melhor desempenho.

Você pode forçar o procmon a usar um arquivo como local de armazenamento também o iniciando a partir da linha de comando e usando a opção /BackingFile. Se desejar voltar a usar o arquivo de paginação novamente, use a opção /PagingFile.

Conversão de Arquivos de Log

O Procmon pode salvar arquivos de log em três formatos diferentes; PML, CSV e XML. Talvez você tenha salvado um arquivo de log como PML e precise analisar os eventos com um script ou outra ferramenta. Nesse caso, você pode converter esse arquivo de log PML para XML ou CSV na linha de comando.

Vamos dizer que você tenha um arquivo de log PML em C:\captura.pml. Você gostaria de converter este arquivo de log para XML e outro em formato CSV. Você pode fazer isso primeiro abrindo o arquivo de log com a opção /OpenLog e depois usando uma opção /Save* para girar e salvá-lo.

O Procmon possui um parâmetro padrão /SaveAs que permite salvar um log em qualquer um dos três formatos mencionados anteriormente. O parâmetro /SaveAs definirá o formato do arquivo dependendo da extensão do arquivo que você fornecer.

Abaixo estão alguns exemplos:

Converter o log captura.pml para captura.xml:

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

Converter o log capture.pml para capture.csv:

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

Lembre-se das opções de rastreamento de pilha e resolução de símbolos de pilha na caixa de diálogo Salvar no Arquivo acima? Você também pode habilitar essas opções usando /SalvarComo1 e /SalvarComo2.

Você só pode salvar rastreamentos de pilha e informações de símbolos no formato XML.

Converter o log capture.pml para capture.xml incluindo informações de pilha:

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

Converter o log capture.pml para capture.xml incluindo informações de pilha com símbolos:

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

Saiba que adicionar rastreamentos de pilha e símbolos aumentará drasticamente o tempo de conversão e você verá inevitavelmente um indicador de progresso como mostrado abaixo.

Progress Indicator

Capturando Eventos de Inicialização

Às vezes, as informações que você precisa investigar não são geradas enquanto o Windows está em execução. Você também pode precisar investigar o que um processo está fazendo sempre que o Windows estiver apenas inicializando.

É comum precisar solucionar problemas como desempenho lento de inicialização ou talvez malware que decide ser executado imediatamente quando o Windows é iniciado. O Procmon tem um recurso chamado Registro de Inicialização que você pode habilitar para capturar essas informações.

Para habilitar o registro de inicialização, clique em Opções —> Habilitar Registro de Inicialização no menu como mostrado abaixo.

Enabling boot logging

Depois de clicar em Habilitar Registro de Inicialização, você verá uma caixa de diálogo pedindo algumas informações opcionais. Esta caixa de diálogo é onde você pode capturar eventos de perfil de thread.

Habilitar eventos de perfil de thread é um caso de uso avançado. Quando você habilita o perfil de thread, o procmon captura rastreamentos de pilha de thread e utilização da CPU que você pode usar para identificar a origem de problemas de desempenho relacionados à CPU.

Optional thread-profiling events for boot time logging

Ao clicar em OK, o procmon irá habilitar o registro de inicialização que instrui o driver de filtro (mais sobre isso depois) a aguardar o próximo reinício do Windows. Quando você reiniciar o Windows, o procmon então começará a capturar eventos de processo como se você tivesse iniciado manualmente.

Todos os dados de eventos de inicialização são armazenados em um arquivo de log temporário chamado C:\Windows\procmon.pmb.

Quando o Windows estiver pronto, abra o procmon novamente. Você deverá ver uma caixa de diálogo como abaixo. Aqui, clique em Sim para converter os dados de inicialização para o formato PML, selecionando então o arquivo de log para salvar os dados.

Confirmation to convert boot-time events to PML

Ao converter os dados, você verá uma barra de progresso como abaixo.

Converting boot-time event data to PML

Não se esqueça de abrir o procmon novamente após reiniciar! O Procmon começará a capturar eventos assim que o Windows inicializar em C:\Windows\procmon.pmb. Ele continuará a fazê-lo até que você o desligue abrindo o procmon novamente.

Executando o Procmon Remotamente

Embora o procmon seja executado apenas localmente em uma máquina Windows, você pode invocar o procmon para ser executado remotamente via psexec ou pelo comando Invoke-Command do PowerShell.

Relacionado: PsExec: O Guia Definitivo, Invoke-Command: A Melhor Maneira de Executar Código Remoto

Para executar o procmon com o comando Invoke-Command do PowerShell, siga as etapas a seguir:

  1. 1. Ative a Remoção do PowerShell na máquina remota, se ainda não estiver ativada.

2. Copie a pasta do procmon para o computador remoto via console do PowerShell.

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

3. Invoque o procmon via PowerShell garantindo que você pule a confirmação do EULA e force o procmon a armazenar eventos em um arquivo de backup em vez de memória virtual e não solicite o filtro ao iniciar.

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

4. Neste ponto, o procmon começou a capturar. Reproduza o problema que está tentando capturar.

5. Pare o procmon no computador remoto usando o switch /Terminate.

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

6. Aguarde o procmon encerrar. Como atalho, você pode verificar periodicamente o processo do procmon e retornar o controle para o console do PowerShell quando estiver completo.

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

7. Copie o arquivo de log remoto para o computador local

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

Neste momento, você possui o arquivo de log executado remotamente em seu computador local!

Se desejar um script do PowerShell adequado para gerenciar esta captura, você pode encontrá-lo abaixo.

[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
 }

Configurando Capturas de Procmon de Longa Duração

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.

Eliminar Eventos Filtrados

Ao executar uma captura com o procmon, ele captura todos os eventos. Você pode criar e aplicar filtros de eventos, mas esses filtros apenas ocultam os eventos na tela; eles não impedem que o procmon os capture.

Se pretende realizar capturas de longa duração com o Procmon, é sempre uma boa ideia escolher a opção Drop Filtered Events no menu Filter, conforme mostrado abaixo.

Drop Filtered Events

Assim que selecionar a opção Drop Filtered Events, o Procmon começará imediatamente a descartar todos os eventos filtrados. O Procmon não os mostra na tela, nem os salva na memória virtual ou num ficheiro de registo. Descartar eventos indesejados ajuda a conservar recursos.

Tópicos Avançados

Ainda deseja mais informações sobre o Procmon e como utilizá-lo? Vamos abordar alguns tópicos avançados! Estes são temas que provavelmente não precisará de conhecer com muita frequência. Estes tópicos estão mais relacionados com funcionalidades do Procmon mais técnicas, mas essa informação pode ser útil ao resolver problemas com o Procmon.

Drivers de Filtro

Para capturar eventos, o Procmon regista e utiliza um driver de filtro através do Windows Filter Manager (FltDrv). Este driver de filtro, chamado PROCMON24, é instalado quando inicia uma captura. Por vezes, este driver de filtro pode entrar em conflito com outras aplicações.

Depois de iniciar o Procmon, abra uma consola PowerShell elevada ou um prompt de comando e execute o comando fltmc filters. A utilidade fltmc lista, carrega e descarrega drivers de filtro. Ao executar este comando, verá o driver de filtro PROCMON24 carregado, como mostrado abaixo.

Aviso de que a Altitude do PROCMON24 é 385200 por padrão, com outros filtros tendo um número menor. A altitude do driver de filtro representa o nível em que um driver de filtro pode “ver” eventos. Por exemplo, eventos ocorrendo nos níveis wcifs, luafv ou Wof, o procmon não será capaz de visualizar. Mais sobre como alterar isso posteriormente.

Procmon 24

O driver de filtro PROCMON24 permanece carregado mesmo quando o procmon não está em execução.

Às vezes, o procmon pode ter problemas ao carregar um driver de filtro. Para solucionar, abra o procmon com a opção /NoConnection para evitar que o procmon se conecte ao driver de filtro.

Descarregando o Driver de Filtro PROCMON24

Há casos em que o driver de filtro PROCMON24 pode entrar em conflito com vários dispositivos de hardware e será necessário descarregá-lo. No entanto, essa situação pode não ser tão fácil quanto parece.

Você pode descarregar drivers de filtro usando o comando fltmc unload seguido pelo nome do driver de filtro.

fltmc unload PROCMON24

Mas se você tentar o comando acima, logo descobrirá que não funciona. Não é possível descarregar este driver de filtro porque presumivelmente o desenvolvedor não adicionou essa capacidade.

Can’t Unload the Filter

Se você precisar descarregar o driver de filtro PROCMON24, infelizmente, reiniciar é a única maneira de fazê-lo.

Stack Traces

Às vezes, eventos simples como ler uma chave de registro, abrir um arquivo ou chamar um endereço de rede não são suficientemente profundos. Você precisa cavar mais fundo e ver um histórico das chamadas de função reais da API do Windows que um processo está realizando. Você precisa olhar para o rastreamento de pilha.

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

Com uma lista de eventos aparecendo no procmon, clique duas vezes em qualquer evento e clique na guia Pilha como mostrado abaixo. A guia Pilha representa as chamadas de função que o processo individual fez no momento em que o evento ocorreu.

Stack Tab

O tópico de rastreamento de pilha poderia continuar por muito tempo. Se você quiser saber mais sobre como entender a pilha de chamadas de um processo, confira o artigo Obtendo rastreamentos de pilha melhores no Monitor de Processos

Alterando a Altitude do Procmon (Capturando Eventos de Nível Inferior)

Como mencionado anteriormente, o procmon usa um driver de filtro para capturar eventos. Mesmo que pareça que o procmon captura todos os eventos do Windows (há muitos eventos que aparecem na janela do procmon!), ele não o faz. Procmon apenas captura eventos que seu driver de filtro conhece ou a altitude em que seu driver de filtro está.

Se, por exemplo, você precisar registrar atividades de antivírus, armazenamento de baixo nível e outros eventos de hardware de nível inferior, será necessário alterar a altitude do driver de filtro PROCMON24 para ser menor do que os outros.

Para fazer isso:

  1. Certifique-se de que o Procmon está fechado.

2. Encontre a altitude mais baixa dos drivers de filtro atualmente carregados com o comando fltmc.

fltmc filter

3. Altere o valor do registro Altitude sob a chave do registro HKLM\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance para 100 a menos que o valor de altitude mais baixo (para ver todos os eventos).

Dependendo da versão do procmon que você tem instalada, pode mudar a localização da chave do registro. Este tutorial está usando o Procmon 2.4.

Você pode abrir uma sessão elevada do PowerShell e executar o trecho de código abaixo para alterar rapidamente o valor.

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

Quanto mais baixa você definir a altitude, mais eventos terá que gerenciar. Não defina a altitude menor do que você precisa.

4. Negue os direitos de Excluir e Definir Valor para Todos na chave Process Monitor 24 Instance. Quando o Procmon rodar novamente, ele tentará definir o valor Altitude de volta para o padrão. Você pode alterar essas permissões através do utilitário regedit ou apenas executar o trecho de código do PowerShell abaixo.

$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. Descarregue o driver de filtro PROCMON24 reiniciando o Windows.

6. Inicie o Procmon.

7. Abra um console do PowerShell ou prompt de comando e execute fltmc filters. Agora você deve ver o driver de filtro do Procmon na nova altitude.

PowerShell console or command prompt

Você pode agora capturar o que precisar. Se você diminuir a Altitude do procmon para o mínimo que pode ir, esteja preparado para o evento monção!

Exemplos do Mundo Real

Agora você deve ter uma boa compreensão do que o procmon pode fazer e como ele pode ajudá-lo a rastrear eventos do Windows. Vamos agora aplicar esse conhecimento e cobrir alguns casos de uso comuns onde você pode precisar desse tipo de know-how.

Encontrando o que está deletando um arquivo

Se você tem um arquivo em sua máquina Windows que continua sendo removido por algum motivo desconhecido e deseja rastreá-lo, o procmon pode ajudar (e é bastante fácil).

Talvez você tenha aberto o procmon e tentado definir um arquivo de evento chamado Delete ou Remove arquivo mas, para sua consternação, tal operação não existe. Em vez disso, para encontrar eventos de remoção de arquivos, você deve filtrar ambos os eventos com uma Operação de:

  • SetDispositionInformationFile
  • SetDispositionInformationEx

Se o seu sistema estiver removendo muitos arquivos, você também vai querer limitar os eventos de exclusão de arquivos para o nome do arquivo ou caminho usando o filtro Caminho também.

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

Rastreando Problemas com Arquivos Bloqueados

Já estivemos todos lá; você tenta mover ou remover um arquivo e ele está bloqueado por algum outro processo. Às vezes, se você está tentando desinstalar um aplicativo, por exemplo, nunca saberá se aquele erro aleatório que vê tem algo a ver com um arquivo bloqueado em primeiro lugar!

Para descobrir quando o Windows tenta remover ou modificar um arquivo bloqueado, use o conjunto de filtros abaixo.

Operation is CreateFile        Include
Result    is SHARING VIOLATION Include

Resolução de Problemas de Aplicações que Requerem Direitos de Administrador

Você está trabalhando com uma aplicação que, de acordo com a documentação, deveria funcionar, mas não funciona? Todos nós já passamos por isso. Às vezes, algum processo que a aplicação inicia requer privilégios elevados, mas não informa onde ou como. Você pode iniciar o procmon para ajudar.

Uma maneira de rastrear processos sendo negados devido a permissões elevadas necessárias é filtrar o Resultado de um evento.

Sempre que ocorrer um evento que seja negado devido à falta de direitos elevados, você geralmente verá um resultado de ACESSO NEGADO. Sabendo disso, você pode facilmente construir um filtro simples mostrando todos os eventos com um Resultado de ACESSO NEGADO, conforme mostrado abaixo.

Result is ACCESS DENIED Include

A partir daqui, você pode adicionar mais filtros como caminho de registro ou pasta com o atributo Caminho também.

Encontrando o Processo Acessando um Endereço IP

Talvez você tenha algum comportamento de rede estranho com Wireshark e precise descobrir qual processo está iniciando essa comunicação. Inicie o procon e adicione o seguinte conjunto de regras de filtro.

Essas regras de filtro limitam os eventos apenas ao tráfego de rede iniciado localmente com um destino de um único endereço IP.

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

Resolução de Problemas de Inicialização Lenta

Às vezes, o Windows demora para iniciar. Essa lentidão pode ser causada por muitos componentes diferentes do Windows, aplicativos instalados e assim por diante. Usando a capacidade de log de inicialização do procmon, você pode rastrear e corrigir o problema.

  1. Ativar o registro de inicialização. Você pode descobrir como fazer isso na seção Capturar Eventos de Tempo de Inicialização acima.

2. Na caixa de diálogo Ativar Registro de Inicialização, certifique-se de marcar a caixa de seleção Gerar eventos de perfil de thread. O botão de opção A cada segundo deve ser suficiente.

Enabling thread profiling events on boot

3. Após reiniciar, abra o procmon, clique com o botão direito em qualquer coluna e escolha Selecionar Colunas.

4. Na caixa Seleção de Coluna do Monitor de Processos, marque Duração. Depois de fazer isso, você poderá ver quanto tempo cada evento levou para ser executado.

Process Monitor Column

5. Agora você pode criar uma regra de filtro em Duração para um número de segundos que você considera adequado. A regra de filtro abaixo mostrará apenas eventos que levaram mais de cinco segundos para serem concluídos.

filter rule on Duration

6. Por fim, outra maneira útil de investigar esses eventos lentos é usando a Árvore de Processos do procmon. A Árvore de Processos mostra as relações entre processos pai e filho e contém o horário de início e término de cada processo. Para encontrá-la, clique em Ferramentas —> Árvore de Processos.

Process Tree

7. Uma vez na Árvore de Processos, agora dê uma olhada na coluna Tempo de Vida, que mostra em um formato gráfico o tempo que cada processo levou. Você também pode observar intervalos de tempo comparando as colunas Hora de Início e Hora de Término nesta visualização.

Lifetime Column

Resolução de Problemas em Aplicações App-V

Muitas organizações utilizam o serviço Microsoft App-V para virtualizar e implantar aplicativos para os usuários finais. Se você utiliza o App-V, há um interruptor útil (e não documentado) no Procmon que você precisa conhecer, chamado /externalcapture.

Ao usar .\procmon.exe /ExternalCapture, geralmente se captura mais atividade no registro relacionada a aplicativos do App-V. Experimente este interruptor se não conseguir encontrar o que procura ao solucionar problemas com aplicativos do App-V!

O interruptor /HookRegistry supostamente serve ao mesmo propósito que /ExternalCapture, mas não funciona mais em máquinas de 64 bits.

Conclusão

Bem, aqui está; um guia abrangente sobre tudo relacionado ao Procmon! Embora você tenha aprendido muito sobre o Procmon, sempre há mais gemas a descobrir com esta útil ferramenta.

Se desejar sugerir atualizações ou alterações a este Guia Definitivo, entre em contato comigo no Twitter e me avise!

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