Pbc en windows

Solo disponible en BuenasTareas
  • Páginas : 7 (1735 palabras )
  • Descarga(s) : 0
  • Publicado : 30 de enero de 2012
Leer documento completo
Vista previa del texto
Abriremos en primer lugar la versión gráfica del debugger, windbg.exe, asegurándonos de haber definido correctamente la variable "SYMBOLS path" tal y como se menciona en la primera parte de esta serie, y lanzaremos la sesión de debugging del kernel de la máquina local.

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>...
tracking img