Ver Mensaje Individual
  #3  
Antiguo 23-12-2003
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Buen día a todos!

Delphi.com.ar:

Agradezco tus valiosos comentarios.

Aprovecho para actualizarles los resultados de mi investigación.

Después de leer varios documentos y estudiar algunas aplicaciones, he encontrado que Windows guarda una estructura de tipo EPROCESS por cada proceso activo en el sistema. Que dicha estructura contiene un campo llamado ObjectTable de tipo _HANDLE_TABLE, el cual es un arreglo que contiene las direcciones de memoria de todos los objetos pertenecientes al proceso (mutex, eventos, mapeos de archivo, etc.).

Dichos objetos se encuentran dentro del espacio de memoria del nucleo (kernel) del sistema. Cada uno tiene su propia estructura, pero con una cabecera de datos común de tipo _OBJECT_HEADER. La estructura _OBJECT_HEADER, tiene un campo llamado NameOffset, que es un desplazamiento negativo para encontrar el nombre del objeto.

Cuando creo un objeto de memoria compartida con la función CreateFileMapping, por ejemplo, ésta me regresa un valor de tipo HANDLE. Este valor entero es el índice o desplazamiento que tiene la entrada correspondiente en el campo ObjectTable de la estructura EPROCESS del programa en ejecución.

Esto quiere decir, que para obtener el nombre de un objeto mutex, evento, mapeo de archivo, etc. de un proceso, a partir de su identificador HANDLE, primero hay que localizar la estructura EPROCESS del proceso, enseguida usar el identificador HANDLE como índice en el campo ObjectTable; de ahí tomar el puntero que señala la dirección de memoria del objeto. Estos punteros señalan el comienzo del cuerpo (body) del objeto, así que hay que hacer un desplazamiento negativo del tamaño de _OBJECT_HEADER, para tener acceso a los campos de la cabecera (header). De ahí se toma el valor del campo NameOffset, para hacer otro desplazamiento negativo hacia el lugar donde se encuentra una estructura de tipo OBJECT_NAME, la cual contiene una cadena Unicode con el nombre del objeto.

Bien, en teoría esto no parece tan difícil: sólo hay que saber obtener la dirección de memoria de la estructura EPROCESS de un proceso, para tener acceso a su tabla de objetos (ObjectTable).

Existe una función llamada PsLookupProcessByProcessId, cuyo propósito es precisamente obtener la dirección de memoria de la estructura EPROCESS de un proceso dado. Esta función se localiza en el archivo estándar NTOSKRNL.EXE, el cual contiene las funciones API nativas el sistema operativo. Según he visto, este archivo y sus funciones sólo pueden ser utilizados en modo kernel, es decir, en ese modo especial en el que trabajan ciertos programas como los controladores de dispositivos, entres otros.

Sinceramente creo que debe existir otra manera de acceder a la estructura EPROCESS, bajo el modo de ejecución normal (user mode). No he encontrado otra función que sirva para obtener de forma directa y explícita la dirección de memoria de dicha estructura. Sin embargo creo que se podrían utilizar algunas de las funciones existentes en Kernel32.dll para lograr este objetivo.

Baso mi argumento en lo que descubrí con los programas Process Explorer 8.1 y PE Explorer 1.94. El primero muestra un listado de todos los objetos mutex, eventos, mapeos de archivo (sections), de cada proceso activo en el sistema. Con el segundo analizo las dependencias que tiene Process Explorer.

Según la información arrojada por PE Explorer, Process Explorer no utiliza ninguna función de NTOSKRNL.EXE (ni directa ni indirectamente). Es decir, no accede a la estructura EPROCESS de cada proceso con la función PsLookupProcessByProcessId. Process Explorer sólo utiliza unas cuantas DLLs estándares y muy comunes de Windows, entre ellas Kernel32.dll y ADVAPI32.dll, e indirectamente NTDLL.dll, que según he leído es la interfaz que existe para acceder a elementos del nucleo en modo normal de usuario.

Estoy seguro de que Process Explorer utiliza alguna técnica de mapeo de memoria para acceder a la estructura EPROCESS y su lista ObjectTable de cada programa en ejecución, y así poder mostrar los nombres de todos los objetos mutex, eventos y mapeos de archivo creados por los procesos. Es decir, Process Explorer, sin usar la API nativa NTOSKRNL.EXE ni la función PsLookupProcessByProcessId, y aparentemente sin entrar de forma explícita en modo kernel, localiza la estructura EPROCESS, lee su arreglo ObjectTable, accede a la memoria de cada objeto y lee sus nombres.

Es decir, si es viable en modo de usuario obtener el nombre de un objeto kernel, a partir de uno de sus identificadores HANDLE. Aparentemente sólo me falta saber localizar la estructura EPROCESS. De última hora me viene a la mente que tal vez esa estructura ocupa los primeros bytes de la memoria virtual del proceso.

Agradezco cualquier aportación que se haga a este tema. Pienso que éste puede ser un hilo valioso, ya que existe poca literatura gratuita en español que hable de las estructuras internas de Windows.

Anexo algunos enlaces importantes que encontré durante mi investigación:

http://www.alkor.ru/~00077500/kb/ntfiles.htm
http://msdn.microsoft.com/library/de...e&hidetoc=true
http://www.sysinternals.com/index.shtml
http://www.theparticle.com/files/txt...k/p59-0x10.txt
http://www.linuxgazette.com/issue23/flower/page1.html
http://www.ntkernel.com/resources.shtml
http://www.informit.com/content/inde...-302DF1E029E7}

Espero esto sea de utilidad. Seguimos en contacto.

Al González .
Responder Con Cita