Pbc en windows
Una vez obtenido el prompt del debugger ejecutaremos el siguiente comando:
lkd> dt _EPROCESS
No voy a incluir aquí elresultado obtenido para no alargar innecesariamente el post. Cada una de las entradas obtenidas tiene el siguiente formato:
+0xNN NombreCampo: TipoDato
El primer elemento indica el offset o desplazamiento a partir de la dirección en la que se localiza el proceso en la memoria, en formato hexadecimal. A continuación aparece el nombre asignado al campo y por último, el tipo de los datos parael contenido del campo.
Muchos de los tipos de datos que aparecen son a su vez estructuras de datos, por lo que podremos obtener una descripción más exhaustiva de los mismos, incluyendo tabulaciones y de modo recursivo utilizando el siguiente comando:
lkd> dt -a -b -v _EPROCESS
En principio nos centraremos en el resultado obtenido mediante el primero de los comandos, el cual nos ofreceuna salida mucho más simplificada.
Campos de la estructura _EPROCESS
El primero de los elementos es el PCB o bloque de control de proceso, el cual es manejado internamente como una estructura _KPROCESS:
+0x000 Pcb : _KPROCESS
Contiene la información básica que necesita el kernel de Windows para programar la ejecución de los threads que contiene el bloque ejecutivo deproceso. Si queremos analizar su formato interno:
lkd> dt _KPROCESS
y tal y como mencionamos anteriormente, si deseamos una salida mas prolija:
lkd> dt -a -b -v _KPROCESS
Mas adelante encontraremos dos valores de marca de tiempo para la fecha de creación y terminación del proceso. Si el proceso todavía se encuentra en ejecución el valor para la marca de tiempo de terminación seraundefined.
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
Existen dos valores más de tiempo relacionados con un proceso, y los podremos encontrar dentro del PCB, dadas sus características. Se trata de:
+0x038 KernelTime : Uint4B
+0x03c UserTime : Uint4B
y se corresponden con la suma total de la cantidad de tiempo durante la cual se hanejecutado los threads que componen el proceso en modo kernel y modo usuario, respectivamente. Podemos obtener los valores para todos los campos anteriores mediante la función GetProcessTimes(http://msdn.microsoft.com/en-us/library/ms683223.aspx) del API de Windows.
Seguidamente hallaremos un puntero a una cadena de texto con el valor para el número de identificador unívoco del proceso:
+0x084UniqueProcessId : Ptr32 Void
Lista con los procesos en ejecución
Analizaremos ahora el campo ActiveProcessLinks. La entrada correspondiente es una estructura _LIST_ENTRY(http://msdn.microsoft.com/en-us/library/aa491571.aspx) y su formato ampliado, extraído de la salida del comando dt con opciones, sería como sigue:
+0x088 ActiveProcessLinks : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to
+0x004 Blink : Ptr32 to
Se trata de una lista doblemente enlazada donde el primero de sus elementos, Flink:
* Si es un valor miembro de un nodo de la lista apuntará a la siguiente entrada o a la cabeza si es el último nodo.
* Si es un valor miembro de la cabeza de la lista apuntará a la siguiente entrada o a sí misma si la listaestá vacía.
y el segundo de sus elementos, Blink:
* Si es un valor miembro de un nodo de la lista apuntará a la entrada anterior o a la cabeza si no existe un nodo anterior.
* Si es un valor miembro de la cabeza de la lista apuntará a la última entrada o a sí misma si la lista está vacía.
Vamos a hacer un experimento utilizando únicamente comandos del debugger:
lkd>...
Regístrate para leer el documento completo.