La Guía Definitiva de Procmon

Procmon. La infame utilidad de Windows Sysinternals para rastrear todo tipo de actividad en Windows. Conocido por su capacidad para detectar instaladores de software malicioso que realizan cambios desconocidos en las claves del registro o quizás inspeccionan las huellas de un virus.

Si necesitas inspeccionar el registro de Windows, el sistema de archivos, procesos o la actividad de red y has decidido utilizar procmon, este artículo es para ti.

En esta Guía Definitiva, aprenderás todo lo que hay que saber sobre el uso de la utilidad procmon, desde la instalación, el uso básico hasta varios casos de uso que te ayudarán a rastrear todo tipo de actividad.

Prerrequisitos

Esta Guía Definitiva se aplicará a casi todos los sistemas Windows, pero, por completitud (y para evitar que intentes ejecutar procmon en una computadora con Windows 3.1), necesitarás lo siguiente:

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

¡Eso es todo! Descargarás e instalarás procmon en las siguientes secciones. La Guía utilizará la versión 3.6 de procmon en una máquina con Windows 10 Build 1909 x64.

Descarga y Ejecución de Procmon

Para comenzar, necesitarás tener procmon en ejecución en tu máquina con Windows. Puedes obtenerlo de dos maneras diferentes; mediante el método de descarga tradicional o lo que Windows Sysinternals llama Sysinternals live.

La Forma Antigua

Procmon no necesita ser instalado; es un único ejecutable. Puedes obtenerlo descargando el archivo ZIP. Una vez que lo hayas descargado, extrae el archivo ZIP con tu herramienta favorita. A continuación se muestra un fragmento de código PowerShell si lo has guardado en tu carpeta de inicio. Este fragmento de código creará una carpeta en ~\ProcessMonitor con todos los archivos necesarios.

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

Dentro de la carpeta ~\ProcessMonitor, verás cinco archivos:

  • Eula.txt – El acuerdo de licencia que tendrás que aceptar antes de ejecutar procmon.
  • procmon.chm – El archivo de ayuda que contiene toda la documentación proporcionada.
  • Procmon.exe – El principal EXE que lanzará la instancia correcta de procmon (x86 o x64).
  • Procmon64.exe – El binario procmon x64.
  • Procmon64a.exe – El binario procmon x64 alfa.

Ahora ejecuta procmon invocando el archivo ~\ProcessMonitor\procmon.exe.

Procmon solo se ejecuta con permisos elevados, así que se te pedirá que lo aceptes si tienes el UAC habilitado cuando lo ejecutes. Hay una forma de evitar esto que se tratará más adelante en esta Guía.

Sysinternals Live

Si prefieres no (o no puedes) descargar un archivo EXE, también puedes usar la carpeta Sysinternals Live. Para hacerlo, abre el Explorador de archivos y pega \\live.sysinternals.com\tools. Entonces verás una carpeta como cualquier otra carpeta de red que contiene todos los archivos de Sysinternals, incluido procmon.

Sysinternals Live

Desplázate hacia abajo hasta que encuentres procmon, haz doble clic y ¡voilà, estás ejecutando procmon!

Personalización del comportamiento de inicio de Procmon

Por defecto, procmon se inicia solicitándote que aceptes un acuerdo de licencia de usuario final (EULA) y también abre una ventana. Usando la línea de comandos, puedes personalizar este comportamiento predeterminado.

Por ejemplo, si deseas iniciar procmon minimizado, usa el interruptor /Minimized.

.\procmon.exe /Minimized

Tal vez estés ejecutando procmon en una máquina nueva y prefieras no ver la solicitud de EULA. Puedes desactivar eso al iniciar usando el interruptor /AcceptEula.

.\procmon.exe /AcceptEula

Aunque menos probable en estos días, cuando inicias procmon, detecta si estás ejecutando un sistema operativo de 64 bits o de 32 bits. Si estás en una máquina de 64 bits, iniciará un proceso de 64 bits y viceversa. Si estás en una máquina de 64 bits y deseas ejecutar procmon como un proceso de 32 bits o leer un archivo de registro (más sobre eso más adelante) que se generó desde una máquina de 32 bits, usa el interruptor /Run32.

.\procmon.exe /Run32

Procmon tiene otros interruptores de línea de comandos que personalizan el comportamiento, pero aprenderás sobre eso en las secciones siguientes.

Introducción a Procmon

Cuando ejecutas Procmon por primera vez, es posible que te sientas abrumado por las opciones. ¡No te preocupes, aprenderás prácticamente todo en esta guía! A continuación, puedes ver una captura típica de Procmon en progreso.

Default Procmon process view

En el momento en que ejecutas Procmon, comienza a capturar muchos tipos diferentes de eventos de Windows.

Si no deseas que Procmon comience automáticamente a capturar eventos, puedes iniciarlo desde la línea de comandos ejecutando procmon.exe /NoConnect.

Como puedes ver en la captura de pantalla anterior, en la columna “Operación”, hay varios iconos que representan diferentes clases de eventos de Windows. Procmon captura eventos de cinco clases diferentes:

  • Registro
  • Sistema de archivos
  • Red
  • Procesos
  • Eventos de perfilado

Cada evento de todas las clases se representa en un único panel de lista con siete columnas:

  • Hora del día – La hora en que ocurrió el evento.
  • Nombre del proceso – El nombre del proceso que desencadenó el evento.
  • PID – El identificador del proceso.
  • Operación – El tipo de evento, como si el proceso abrió un archivo, cambió el valor de una clave de registro, etc.
  • Ruta – La ruta al objeto con el que interactuó el evento, como una ruta de archivo, ruta de registro, etc.
  • <Resultado – Esta columna contendrá numerosos valores para indicar el resultado del evento. Este valor puede ser tan simple como ÉXITO o específico para el evento como REANALIZAR, DESBORDAMIENTO DE BUFFER, NOMBRE NO ENCONTRADO, etc.
  • Detalle – Esta columna contiene todos los detalles minuciosos una vez que identifica un evento que le gustaría ver.

Si prefiere no ver cierta columna o le gustaría ver qué otras columnas tiene disponibles, haga clic con el botón derecho en cualquier encabezado de columna y elija Seleccionar columnas. Se le presentará un cuadro de diálogo donde podrá personalizar las columnas visibles.

Customizing procmon columns

En la ventana del evento, haga doble clic en un evento. Puede encontrar muchos más detalles sobre el proceso y el evento mismo al ver las pestañas Evento, Proceso y Pila.

Procmon event properties window

Habilitar y deshabilitar capturas

Usted tiene control total sobre el proceso de captura. Puede deshabilitar todo el proceso de captura o deshabilitar la captura por clase de evento.

En la barra de menú superior, verá un icono de lupa (abajo). Si la lupa tiene una X roja sobre ella, eso significa que la captura está desactivada. De lo contrario, la captura está activada.

Procmon actively capturing events

No deje que Procmon capture eventos durante más tiempo del necesario. ¡Utiliza memoria virtual para almacenar todos esos eventos y si no tiene cuidado, podría terminar estrellando Windows! Puede cambiar este comportamiento como verá un poco más tarde.

Si prefieres ser más selectivo, también puedes controlar la captura de cada clase de evento. En la barra de menú, verás cinco de los mismos iconos que se muestran en la columna de Operación. Al hacer clic en estos botones, puedes habilitar y deshabilitar clases de eventos enteras.

Types of Windows events

Pasa el mouse sobre cada icono para ver qué tipo de actividad representa cada uno.

Verás que tan pronto como hagas clic en un icono, Procmon aplica un filtro de evento. Dependiendo de cuántos eventos se hayan capturado hasta ahora, es posible que veas un mensaje emergente como el siguiente.

Types of Windows events

De forma predeterminada, el icono más a la derecha (el gráfico negro y verde) no está habilitado. Si deseas habilitar esta clase de evento cuando se inicie Procmon, puedes invocar Procmon desde la línea de comandos usando .\procmon.exe /Profiling.

Puedes ver el número de eventos en la ventana mirando en la parte inferior. Como puedes ver a continuación, Procmon ha procesado 84,334 eventos, pero debido al filtro de eventos aplicado, solo está mostrando 15,912 de ellos, o el 18% de ellos. También puedes ver que estos eventos se están almacenando en memoria virtual (más sobre eso más adelante).

Number of Events in the Window

Filtros de eventos

Para entender Procmon, sin duda necesitas entender el concepto de filtros de eventos. Los filtros de eventos son cómo separas la señal del ruido. Los filtros de eventos ocultan todos los eventos en los que no estás interesado. Anteriormente, aplicaste filtros de eventos por clases de eventos enteras, pero puedes ser mucho más detallado.

Hay varias formas de interactuar con los filtros de eventos. Comencemos de manera sencilla. Haz clic en el elemento de menú Filtro en la parte superior. Verás muchas opciones diferentes para trabajar con los filtros.

Filter menu options

Visualización de Filtros

Por defecto, Procmon crea un filtro para ti. En el elemento de menú Filtro, haz clic en Filtrar…. Verás aparecer una caja de Filtro del Monitor de Procesos con dos áreas; una para filtrar tus reglas de filtro y otra para ver todas las reglas que has configurado. Puedes ver un ejemplo de esto a continuación.

Filter rules

Por defecto, Procmon mostrará los filtros anteriores cada vez que lo inicies. Si deseas ocultar esta caja, puedes hacerlo lanzando Procmon con el interruptor /Quiet.

Deberías ver que sin crear tus propios filtros, Procmon también está utilizando un conjunto integrado de reglas de filtro. Si te desplazas hacia abajo en la caja de Filtro del Monitor de Procesos, verás muchos tipos diferentes de reglas definidas. Aquí puedes ver cada categoría, operador, valor y acción a tomar en cada regla.

Estos filtros se aplican porque generalmente no necesitarás ver los eventos que estos filtros excluyen. Pero, si quieres ver todos los eventos, también puedes eliminar todos los filtros predeterminados o hacer clic en Filtro —> Activar Salida Avanzada como se muestra a continuación.

Enable Advanced Output

Por ejemplo, verás algunas reglas en la parte superior que muestran el Nombre del Proceso para el valor de la Columna, es para la Relación, varios procesos relacionados con procmon para el valor de la columna Valor, y una Acción de Excluir. En términos sencillos, estas reglas indican a procmon que no muestre (excluya) un proceso con el nombre de procmon.exe, por ejemplo.

Administración de reglas de filtro de eventos

Dependiendo de tu caso de uso, seguramente necesitarás añadir tus propias reglas. Hay algunas formas diferentes de añadir reglas.

Usando el cuadro de filtro de Process Monitor

En la última sección, viste cómo se veía el cuadro de Filtro de Process Monitor y viste todas las reglas. En este cuadro, también puedes crear, modificar y eliminar reglas.

Supongamos que quieres ver solo las veces que el proceso explorer.exe consultó una clave de registro.

Añadiendo filtros de eventos

En el cuadro de Filtro de Process Monitor:

  1. Haz clic en la lista desplegable más a la izquierda. Esta lista muestra todas las categorías de eventos en las que puedes aplicar filtros. ¡Como puedes ver, hay bastantes opciones!

    Cada elemento que ves en esta lista se corresponde con una columna que se muestra en la pantalla principal, como se muestra a continuación. Para el propósito de este artículo, elige Nombre del Proceso.

Process Monitor Filter

2. Elige una categoría y luego elige un operador. Por defecto, el cuadro desplegable será es pero tienes muchas otras opciones si haces clic en el desplegable. Estos operadores te permiten filtrar la opción que seleccionaste de muchas maneras diferentes. Dado que estás buscando un proceso que sea exactamente explorer.exe, elige es.

Operator List

3. Finalmente, elige el nombre del proceso como se muestra a continuación. Notarás que dado que elegiste Nombre del Proceso como la categoría, Procmon automáticamente muestra todos los procesos que se están ejecutando actualmente para elegir.

Process Name in Process Monitor Filter

4. Asegúrate de haber seleccionado Incluir ya que solamente deseas ver los eventos que coinciden con este criterio. Y luego haz clic en el botón Agregar para agregar la regla a tu filtro actual. Como puedes ver a continuación, la regla de inclusión se muestra como una marca de verificación verde.

5. Finalmente, como deseas todos los eventos donde explorer.exe consulta una clave de registro, asegúrate de incluir también la operación RegQueryKey. Cuando hayas terminado, deberías ver ambas reglas añadidas.

RegQueryKey

6. Haz clic en OK y luego verás que la ventana principal eliminará todos los eventos que no coincidan con las reglas de filtro que acabas de definir.

Events that do not match the filter rules

Eliminación de Reglas de Filtro de Eventos

También puedes fácilmente eliminar y cambiar las reglas de filtro.

  1. Haz clic en el icono de Filtro en la parte superior de la ventana principal para abrir la caja de Filtro de Monitor de Procesos.
Process Monitor Filter Box

2. Resalta ambas reglas de filtro que creaste arriba, haz clic en el botón Eliminar como se muestra a continuación y haz clic en Aceptar. Esta acción eliminará ambas reglas personalizadas agregadas anteriormente.

remove both of the custom rules added

También puedes hacer clic en el botón Restablecer para eliminar automáticamente todas las reglas de filtro personalizadas.

Cada vez que apliques un filtro, sal de procmon y vuélvelo a iniciar, ese filtro se aplicará nuevamente. Si deseas asegurarte de que no se aplique ningún filtro cuando inicies procmon, puedes invocarlo con el interruptor /NoFilter.

Agregando reglas de filtro con clic derecho

También puedes agregar reglas de filtro a través de un menú de clic derecho si haces clic derecho en un proceso. Como puedes ver a continuación, puedes crear cualquier tipo de regla directamente desde este menú; ¡no es necesario ir a la caja de Filtro de Monitor de Procesos en absoluto!

add filter rules via a right-click menu

Para eliminar reglas de filtro creadas a través del menú de clic derecho, aún tendrás que ir a la caja de Filtro de Monitor de Procesos para eliminarlas.

Guardando y gestionando filtros personalizados

Si eres un usuario avanzado de procmon, probablemente llegará un momento en que tengas conjuntos de reglas de filtro para diversas ocasiones. Utilizando las características de guardado y organización de filtros de procmon, puedes gestionar y guardar tantos de estos conjuntos como desees.

Imaginemos que tienes un montón de filtros personalizados definidos y te gustaría guardarlos para usarlos nuevamente en algún momento. Puedes guardar este filtro yendo a Filtro, eligiendo Guardar filtro y proporcionando un nombre como se muestra a continuación.

Saving a filter

Una vez que se haya guardado el filtro, puedes ir a Filtro, hacer clic en Organizar Filtros, donde verás todos los filtros que has guardado. Desde aquí, puedes hacer clic en un filtro, hacer clic en OK y tu filtro guardado se aplicará a la ventana actual.

Viewing and loading filters

También puedes cargar un filtro guardado pasando el ratón sobre Cargar Filtro en el menú desplegable de Filtro y eligiendo tu filtro guardado de la lista a la derecha.

Loading a filter

Importación y Exportación de Filtros

Si esperas cargar procmon en otra computadora y mantener todos tus filtros guardados, estás de mala suerte. Procmon no tiene un servicio en la nube para sincronizar filtros. Pero puedes exportar filtros manualmente y luego importarlos.

Para exportar filtros de procmon:

  1. Ve a la caja de Organizar Filtros.
  2. Haz clic en el filtro que ya has guardado y que te gustaría exportar.
  3. Haz clic en el botón Exportar.
  4. Proporciona un nombre, elige una ruta y haz clic en OK. Verás que todos los filtros de procmon se guardan con una extensión PMF.

Para importar filtros de procmon:

  1. Ve a la caja de Organizar Filtros.
  2. Haz clic en el botón Importar.
  3. Encuentra el filtro que te gustaría importar y haz clic en OK.

Puedes ver una guía visual de estos pasos a continuación.

import procmon filters

Importación y Exportación de Configuraciones de Procmon

Como aprendiste anteriormente, puedes exportar e importar filtros de procmon a través de archivos PMF. Pero los filtros son solo un componente que compone una instancia de procmon. Puedes personalizar las columnas, cambiar la ubicación de almacenamiento (más sobre eso más adelante) y más. ¿No sería agradable guardar todas esas configuraciones también? ¡Puedes hacerlo!

Para guardar la configuración completa de procmon, haz clic en Archivo —> Exportar configuración y luego elige una ubicación donde te gustaría guardar el archivo PMC (configuración de procmon).

Export Configuration

Una vez guardado, puedes cerrar procmon en la misma computadora (o incluso en una diferente), abrir procmon y hacer clic en Archivo —> Importar Configuración donde procmon aplicará todos los mismos filtros y otras configuraciones tal como fueron exportadas.

También puedes cargar configuraciones guardadas (incluyendo filtros) a través de la línea de comandos usando el interruptor /LoadConfig seguido de la ruta del archivo, por ejemplo ./procmon.exe /LoadConfig C:\ProcmonConfigs\file_deletion.pmc.

Resaltando Eventos y Convirtiendo a Filtros

Quizás necesites hacer ciertos eventos más fáciles de detectar pero no necesariamente quieres eliminar ningún evento de la vista con un filtro. En ese caso, puedes usar los resaltados. Los resaltados te permiten crear conjuntos de reglas muy similares a los filtros pero en lugar de ocultar eventos, el color de fondo de los eventos es cambiado.

Quizás veas un proceso en la lista de eventos llamado ctfmon.exe que te gustaría resaltar en la lista. Puedes crear una regla de resaltado de la siguiente manera:

  1. Haz clic derecho en el evento que te gustaría resaltar un atributo de.
  2. Haz clic en Resaltar y elige un atributo de ese evento para resaltar. En este ejemplo, elegirías Nombre del Proceso. Luego verás que el color de fondo cambia a un color azul claro.
  3. Una vez que se crea la regla de resaltado, puedes ir a la caja de Resaltado de Monitor de Procesos haciendo clic en Filtrar —> Resaltar. Verás la regla de resaltado creada allí.
  4. Desde la caja de Resaltado de Monitor de Procesos, puedes agregar y eliminar reglas igual que lo haces con un filtro.
  5. Si has creado algunas reglas de resaltado y deseas convertirlas en un filtro, puedes hacerlo haciendo clic en el botón Hacer Filtro en la caja de Resaltado de Monitor de Procesos.

Puedes ver una guía visual de estos pasos a continuación.

Highlighting Events and Converting to Filters

Exportar y Abrir Eventos a/desde Archivos de Registro

Para que procmon te muestre los eventos en una ventana, tienen que estar almacenados en algún lugar. De forma predeterminada, los eventos se almacenan en memoria virtual, más específicamente en tu archivo de página.

events are stored in virtual memory

Dependiendo de lo grande que sea tu archivo de página (y el límite de compromiso del sistema) depende de cuántos eventos puede almacenar procmon.

Procmon es capaz de capturar hasta 199 millones de eventos.

Guardar Eventos en un Archivo de Registro

Quizá necesites guardar estos eventos para una investigación posterior o cargarlos en otra computadora. En ese caso, debes guardar los eventos en un archivo de registro (PML).

Una forma de guardar estos eventos útiles es hacer clic en Archivo —> Guardar. Esta acción abrirá el cuadro de diálogo Guardar en archivo a continuación, donde se te presentarán algunas opciones.

Eventos a guardar:

  • Todos los eventos – Esta opción es exactamente como parece. Guardará todos los eventos capturados por Procmon, independientemente de si has aplicado un filtro de eventos o no, en un archivo.
  • Eventos mostrados usando el filtro actual – Esta opción no guarda todos los eventos capturados, sino solo aquellos que han pasado tus filtros de eventos actualmente activos.
  • Eventos resaltados – Esta opción exporta al registro solo aquellos eventos que has resaltado actualmente.

Formato:

  • Formato nativo del Monitor de Procesos (PML) – El formato predeterminado para guardar todos los eventos (PML).
  • Valores separados por comas (CSV) – Guarda todos los eventos en un archivo CSV.
  • Lenguaje de Marcado Extensible (XML) – Guarda todos los eventos en un archivo XML. Este formato también te permite guardar trazas de seguimiento (más sobre eso más adelante) y resolverá símbolos de la pila.
Events

Haz clic en Aceptar y Procmon guardará todos los eventos capturados actualmente que coincidan con tus criterios en el archivo que elijas.

Apertura de registros de eventos guardados

Has capturado miles de eventos en una computadora, guardado esa sesión de captura en un archivo PML y lo has copiado a otra computadora para la investigación. ¿Y ahora qué? Necesitas abrirlo.

Puedes abrir cualquier archivo PML, ya sea que lo hayas capturado en tu computadora local o no, simplemente yendo a Archivo —> Abrir y eligiendo el archivo PML.

Puedes abrir registros desde la línea de comandos usando el interruptor /OpenLog, por ejemplo, procmon.exe /OpenLog C:\MiArchivoDeRegistro.pml.

Registro Automático de Eventos

En la sección anterior, aprendiste cómo exportar eventos a un registro después de capturarlos. Pero, ¿qué pasa si sabes de antemano que quieres eventos en un archivo PML, XML o CSV? Puedes hacer que procmon capture automáticamente eventos en uno de esos formatos de archivo de registro.

También, almacenar eventos en el archivo de paginación está bien si estás en una sesión de resolución de problemas ad hoc simple que puede durar menos de una hora. Este método tiene algunas desventajas, sin embargo.

  1. Cada vez que cierras procmon, los eventos desaparecen.
  2. Como se mencionó antes, el tamaño de tu archivo de paginación puede crecer desproporcionadamente.

Cuando uses memoria virtual como ubicación de almacenamiento, puedes descubrir cuánto espacio queda para que procmon lo utilice haciendo clic en Archivo —> Archivos de respaldo.

¿Qué hacer? Cambiar la ubicación de almacenamiento.

Almacenamiento de Eventos en Disco

Puedes cambiar donde procmon almacena eventos desde tu archivo de paginación a disco mediante:

  1. Detén la captura si actualmente estás ejecutándola.

2. Haz clic en Archivo —> Archivos de respaldo. A continuación, verás un resumen de los eventos almacenados y su tamaño junto con una opción para cambiar la ubicación de almacenamiento.

Process Monitor Backing Files

3. Para cambiar la ubicación de almacenamiento a un archivo, haz clic en el campo Usar archivo con nombre:, pulsa el botón de puntos suspensivos y define una ubicación de archivo.

Intenta utilizar un volumen de disco diferente al que está ejecutándose procmon para obtener un mejor rendimiento.

Puedes forzar a procmon a utilizar un archivo como ubicación de almacenamiento también ejecutándolo desde la línea de comandos y utilizando el interruptor /BackingFile. Si deseas volver a utilizar el archivo de paginación, utiliza el interruptor /PagingFile.

Conversión de archivos de registro

Procmon puede guardar archivos de registro en tres formatos diferentes; PML, CSV y XML. Tal vez hayas guardado un archivo de registro como PML y necesitas analizar los eventos con un script u otra herramienta. En ese caso, puedes convertir ese archivo de registro PML a XML o CSV en la línea de comandos.

Supongamos que tienes un archivo de registro PML en C:\captura.pml. Te gustaría convertir este archivo de registro a XML y uno en formato CSV. Puedes hacerlo primero abriendo el archivo de registro con el interruptor /OpenLog y luego usando un interruptor /Save* para volver a guardarlo.

Procmon tiene un parámetro estándar /SaveAs que te permite guardar un registro en cualquiera de los tres formatos mencionados anteriormente. El parámetro /SaveAs establecerá el formato del archivo según la extensión de archivo que proporciones.

A continuación, se muestran algunos ejemplos:

Convertir el registro captura.pml a captura.xml:

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

Convertir el registro capture.pml a capture.csv:

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

Recuerda las opciones de seguimiento de pila y resolución de símbolos en el cuadro de diálogo Guardar en Archivo mencionado anteriormente. Puedes habilitar estas opciones también utilizando /GuardarComo1 y /GuardarComo2.

Solo puedes guardar trazas de pila e información de símbolos en formato XML.

Convertir el registro capture.pml a capture.xml incluyendo información de la pila:

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

Convertir el registro capture.pml a capture.xml incluyendo información de la pila con símbolos:

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

Ten en cuenta que agregar trazas de pila y símbolos aumentará drásticamente el tiempo de conversión y verás un indicador de progreso como se muestra a continuación.

Progress Indicator

Captura de Eventos de Inicio

A veces, la información que necesitas investigar no se genera mientras Windows está en funcionamiento. También es posible que necesites investigar lo que hace un proceso cuando Windows está arrancando.

Es común necesitar solucionar problemas como el rendimiento lento durante el arranque o tal vez malware que decide ejecutarse inmediatamente al iniciar Windows. Procmon tiene una función destacada llamada Registro de Tiempo de Arranque que puedes habilitar para capturar esta información.

Para habilitar el registro de arranque, haz clic en Opciones —> Habilitar Registro de Arranque en el menú, como se muestra a continuación.

Enabling boot logging

Una vez que hagas clic en Habilitar Registro de Arranque, verás aparecer un cuadro de diálogo que solicita información opcional. Este cuadro de diálogo es donde puedes capturar eventos de perfil de hilo.

Habilitar eventos de perfilado de hilos es un caso de uso avanzado. Cuando habilita el perfilado de hilos, procmon captura trazas de pila de hilos y utilización de CPU que puede utilizar para identificar la fuente de problemas de rendimiento relacionados con la CPU.

Optional thread-profiling events for boot time logging

Una vez que haga clic en Aceptar, procmon habilitará el registro de inicio, lo que instruye al controlador de filtro (más sobre esto más adelante) a esperar el próximo reinicio de Windows. Cuando reinicie Windows, procmon comenzará a capturar eventos de proceso como si lo hubiera iniciado manualmente.

Todos los datos de eventos en el momento del inicio se almacenan en un archivo de registro temporal llamado C:\Windows\procmon.pmb.

Cuando Windows esté nuevamente activo, abra procmon nuevamente. Debería ver un cuadro de diálogo como el siguiente. Aquí, haga clic en para convertir los datos del inicio en el formato PML seleccionando el archivo de registro donde guardar los datos.

Confirmation to convert boot-time events to PML

Mientras procmon convierte los datos, verá una barra de progreso como la siguiente.

Converting boot-time event data to PML

¡No olvide volver a abrir procmon después de reiniciar! Procmon comenzará a capturar eventos tan pronto como Windows se inicie en C:\Windows\procmon.pmb. Continuará haciéndolo hasta que lo desactive abriendo procmon nuevamente.

Ejecutar Procmon de forma remota

Aunque procmon se ejecuta solo localmente en una máquina con Windows, puede invocar procmon para que se ejecute de forma remota mediante psexec o el comando Invoke-Command de PowerShell.

Relacionado: PsExec: La Guía Definitiva, Invoke-Command: La Mejor Manera de Ejecutar Código Remoto

Para ejecutar Procmon con el comando Invoke-Command de PowerShell, sigue estos pasos:

  1. 1. Habilita la Remotización de PowerShell en la máquina remota si aún no lo has hecho.

2. Copia la carpeta de Procmon a la computadora remota mediante la consola de PowerShell.

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

3. Invoca Procmon a través de PowerShell asegurándote de omitir la confirmación del Acuerdo de Licencia de Usuario Final (EULA) y forzando a Procmon a almacenar eventos en un archivo de respaldo en lugar de la memoria virtual, y sin solicitar el filtro al inicio.

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

4. En este punto, Procmon ha comenzado la captura. Reproduce el problema que estás intentando capturar.

5. Detén Procmon en la computadora remota usando el interruptor /Terminate.

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

6. Espera a que Procmon se cierre. Como atajo, puedes verificar periódicamente el proceso de Procmon y devolver el control a la consola de PowerShell cuando esté completo.

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

7. Copia el archivo de registro remoto a la computadora local.

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

¡Ahora tienes el archivo de registro ejecutado de forma remota en tu computadora local!

Si deseas un script de PowerShell adecuado para gestionar esta captura, lo puedes encontrar a continuación.

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

Configuración de Capturas de Procmon de Larga Duración

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.

Descartar Eventos Filtrados

Cuando Procmon está ejecutando una captura, registra todos los eventos. Puedes crear y aplicar filtros de eventos, pero estos solo ocultan los eventos en la pantalla; no evitan que Procmon los capture.

Si tiene la intención de realizar capturas de procmon de larga duración, siempre es una buena idea elegir Drop Filtered Events del menú Filter, como se muestra a continuación.

Drop Filtered Events

Una vez que seleccione el elemento Drop Filtered Events, procmon comenzará inmediatamente a eliminar todos los eventos filtrados. Procmon no los muestra en la pantalla ni los guarda en la memoria virtual o en un archivo de registro. Eliminar eventos no deseados por completo ayuda a conservar recursos.

Temas Avanzados

¿Todavía está ansioso por obtener más información sobre procmon y cómo usarlo? ¡Sumérgete en algunos temas avanzados! Estos temas son aquellos que probablemente no necesitará conocer con demasiada frecuencia. Estos temas son más sobre características de procmon más internas, pero esta información puede ser útil al solucionar problemas con procmon.

Controladores de Filtro

Para capturar eventos, procmon registra y utiliza un controlador de filtro a través del Administrador de filtros de Windows (FltDrv). Este controlador de filtro llamado PROCMON24 se instala cuando inicia una captura. A veces, este controlador de filtro puede entrar en conflicto con otras aplicaciones.

Después de iniciar procmon, abra una consola de PowerShell elevada o un símbolo del sistema y ejecute fltmc filters. La utilidad fltmc lista, carga y descarga controladores de filtro. Cuando ejecute esto, verá el filtro PROCMON24 cargado como se muestra a continuación.

Tenga en cuenta la Altitud de PROCMON24, que es 385200 de manera predeterminada, con otros filtros teniendo un número más bajo. La altitud del controlador de filtro representa el nivel en el que un controlador de filtro puede “ver” eventos. Por ejemplo, si ocurren eventos en el nivel de wcifs, luafv o Wof, procmon no podrá verlos. Más adelante se explicará cómo cambiar esto.

Procmon 24

El controlador de filtro PROCMON24 permanece cargado incluso cuando procmon no está en ejecución.

A veces, procmon puede tener problemas para cargar un controlador de filtro. Para solucionarlo, abra procmon con el argumento /NoConnection para evitar que procmon se conecte al controlador de filtro.

Desactivación del controlador de filtro PROCMON24

Hay casos en los que el controlador de filtro PROCMON24 puede entrar en conflicto con varios dispositivos de hardware y será necesario desactivarlo. Sin embargo, esta situación puede no ser tan fácil como parece.

Puede desactivar los controladores de filtro utilizando el comando fltmc unload seguido del nombre del controlador de filtro.

fltmc unload PROCMON24

Pero si intenta el comando anterior, pronto descubrirá que no funciona. No se puede desactivar este controlador de filtro porque, presumiblemente, el desarrollador no agregó esta capacidad.

Can’t Unload the Filter

Si necesita desactivar el controlador de filtro PROCMON24, lamentablemente, reiniciar es la única forma de hacerlo.

Tramas de pila

A veces, eventos simples como leer una clave del registro, abrir un archivo o llamar a una dirección de red no son lo suficientemente profundos. Necesitas profundizar y ver un historial de las llamadas reales a funciones de la API de Windows que realiza un proceso. Debes examinar la pila de seguimiento de un proceso.

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

Con una lista de eventos que aparecen en Procmon, haz doble clic en cualquier evento y haz clic en la pestaña Pila como se muestra a continuación. La pestaña Pila representa las llamadas a funciones que el proceso individual realizó en el momento en que ocurrió el evento.

Stack Tab

El tema de las pilas de seguimiento podría extenderse durante mucho tiempo. Si deseas obtener más información sobre cómo entender la pila de llamadas de un proceso, consulta el artículo Obteniendo mejores pilas de seguimiento en el Monitor de Procesos

Cambiando la Altitud de Procmon (Capturando Eventos de Nivel Inferior)

Como se mencionó anteriormente, Procmon utiliza un controlador de filtro para capturar eventos. Aunque puede parecer que Procmon captura cada evento de Windows (¡hay muchos eventos que aparecen en la ventana de Procmon!), no lo hace. Procmon solo captura eventos que su controlador de filtro conoce o la altitud a la que se encuentra su controlador de filtro.

Si, por ejemplo, necesitas registrar la actividad del antivirus, el almacenamiento de bajo nivel y otros eventos de hardware de nivel inferior, debes cambiar la altitud del controlador de filtro PROCMON24 para que sea inferior a los demás.

Para hacer eso:

  1. Asegúrate de que Procmon esté cerrado.

2. Encuentra la altitud más baja de los controladores de filtro cargados actualmente con el comando fltmc.

fltmc filter

3. Cambia el valor del registro Altitude bajo la clave del registro HKLM\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance a 100 menos que el valor de altitud más bajo (para ver todos los eventos).

Dependiendo de la versión de Procmon que tengas instalada, puede cambiar la ubicación de la clave del registro. Este tutorial utiliza Procmon 2.4.

Puedes abrir una sesión elevada de PowerShell y ejecutar el fragmento de código a continuación para cambiar rápidamente el valor.

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

Cuanto más bajo establezcas la altitud, más eventos tendrás que gestionar. No establezcas la altitud más baja de lo necesario.

4. Niega los derechos de Eliminar y Establecer valor para Everyone en la clave Process Monitor 24 Instance. Cuando Procmon se ejecute nuevamente, intentará restablecer el valor de Altitude a su valor predeterminado. Puedes cambiar estos permisos a través de la utilidad regedit o simplemente ejecutar el siguiente fragmento de 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. Descarga el controlador de filtro PROCMON24 reiniciando Windows.

6. Inicia Procmon.

7. Abre una consola de PowerShell o símbolo del sistema y ejecuta fltmc filters. Ahora deberías ver el controlador de filtro de Procmon en la nueva altitud.

PowerShell console or command prompt

Ahora puedes capturar lo que necesites. Si bajas la Altitud de procmon al mínimo, ¡prepárate para el evento monzón!

Ejemplos del Mundo Real

Ahora deberías tener una buena comprensión de lo que procmon puede hacer y cómo puede ayudarte a rastrear eventos de Windows. Ahora apliquemos ese conocimiento y cubramos algunos casos de uso comunes donde podrías necesitar este tipo de conocimiento.

Encontrar Qué Está Eliminando un Archivo

Si tienes un archivo en tu máquina Windows que sigue siendo eliminado por alguna razón desconocida y quieres rastrearlo, procmon puede ayudar (y es bastante fácil).

Tal vez has abierto procmon e intentado establecer un evento de archivo llamado Eliminar o Remover pero para tu consternación, no existe tal operación. En cambio, para encontrar eventos de eliminación de archivos, debes filtrar tanto los eventos con una Operación de:

  • SetDispositionInformationFile
  • SetDispositionInformationEx

Si tu sistema está eliminando muchos archivos, también querrás limitar los eventos de eliminación de archivos al nombre o la ruta del archivo usando el filtro Ruta.

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

Rastreo de Problemas de Archivos Bloqueados

Todos hemos estado allí; intentas mover o eliminar un archivo y está bloqueado por algún otro proceso. A veces, si intentas desinstalar una aplicación, por ejemplo, nunca sabrás si ese error aleatorio que ves tiene algo que ver con un archivo bloqueado en primer lugar!

Para averiguar cuándo Windows intenta eliminar o modificar un archivo bloqueado, utiliza el siguiente conjunto de filtros.

Operation is CreateFile        Include
Result    is SHARING VIOLATION Include

Solución de problemas de aplicaciones que requieren derechos de administrador

¿Estás trabajando con una aplicación que, según la documentación, debería funcionar pero no lo hace? Todos hemos estado ahí. A veces, algún proceso que la aplicación genera requiere privilegios elevados pero no te dice dónde ni cómo. Puedes iniciar procmon para ayudar.

Una forma de rastrear los procesos que son denegados debido a los permisos elevados requeridos es filtrar según el Resultado de un evento.

Siempre que ocurra un evento que sea denegado debido a la falta de derechos elevados, típicamente verás un resultado de ACCESO DENEGADO. Sabiendo esto, puedes construir fácilmente un filtro simple que muestre todos los eventos con un Resultado de ACCESO DENEGADO como se muestra a continuación.

Result is ACCESS DENIED Include

A partir de aquí, puedes agregar más filtros como la ruta del registro o la carpeta con el atributo Ruta también.

Encontrar el proceso que accede a una dirección IP

Tal vez hayas notado un comportamiento de red extraño con Wireshark y necesitas averiguar qué proceso está iniciando esa comunicación. Inicia procon y agrega el siguiente conjunto de reglas de filtro.

Estas reglas de filtro limitan los eventos solo al tráfico de red iniciado localmente con un destino de una única dirección IP.

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

Solución de problemas de inicio lento

A veces Windows tarda mucho en iniciarse. Esa lentitud puede ser causada por muchos componentes de Windows diferentes, aplicaciones instaladas, y así sucesivamente. Utilizando la capacidad de registro de inicio de procmon, puedes rastrear y solucionar el problema.

  1. Habilitar el registro de arranque. Puedes descubrir cómo hacerlo en la sección Capturar eventos durante el arranque anterior.

2. En la ventana de diálogo Habilitar el registro de arranque, asegúrate de marcar la casilla Generar eventos de perfil de hilo. El botón de radio Cada segundo debería ser suficiente.

Enabling thread profiling events on boot

3. Después de reiniciar, abre procmon, haz clic derecho en cualquier columna y elige Seleccionar columnas.

4. En la ventana de Selección de columnas de Monitor de procesos, marca Duración. Una vez hecho esto, podrás ver cuánto tiempo tardó cada evento en ejecutarse.

Process Monitor Column

5. Ahora puedes crear una regla de filtro en Duración con un número de segundos que consideres adecuado. La regla de filtro a continuación solo mostrará eventos que tomaron más de cinco segundos en completarse.

filter rule on Duration

6. Finalmente, otra forma útil de investigar estos eventos lentos es mediante el Árbol de procesos de procmon. El Árbol de procesos muestra las relaciones entre procesos padre e hijo y contiene la hora de inicio y fin de cada proceso. Para encontrarlo, haz clic en Herramientas —> Árbol de procesos.

Process Tree

7. Una vez en el Árbol de procesos, echa un vistazo a la columna Tiempo de vida que muestra de manera gráfica la duración de cada proceso. También puedes observar los intervalos de tiempo comparando las columnas Hora de inicio y Hora de fin en esta vista.

Lifetime Column

Resolución de problemas de aplicaciones App-V

Muchas organizaciones utilizan el servicio Microsoft’s App-V para virtualizar y desplegar aplicaciones a los usuarios finales. Si utilizas App-V, hay un útil (y no documentado) interruptor de Procmon que debes conocer llamado /externalcapture.

Al usar .\procmon.exe /ExternalCapture, se tiende a capturar más actividad del registro relacionada con las aplicaciones de App-V. ¡Prueba este interruptor si no puedes encontrar lo que buscas al solucionar problemas con aplicaciones de App-V!

Se dice que el interruptor /HookRegistry sirve para el mismo propósito que /ExternalCapture, pero ya no funciona en máquinas de 64 bits.

Conclusión

Bien, ahí lo tienes; una guía extensa sobre todo lo relacionado con Procmon. Aunque has aprendido mucho sobre Procmon, siempre hay más joyas por descubrir con esta útil herramienta.

Si deseas sugerir alguna actualización o cambio a esta Guía Definitiva, por favor contáctame en Twitter ¡y házmelo saber!

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