Obtener handles de ficheros asociados a un proceso

Iniciado por mmob, 29 Octubre 2007, 11:18 AM

0 Miembros y 1 Visitante están viendo este tema.

mmob

Alguien podría indicarme cómo obtener la lista de ficheros abiertos por un proceso (Process)? es posible? de no ser posible podríais decirme cómo obtener la lista de archivos abiertos? aunque creo que lo primero es posible.
Muchas gracias

mmob

La solución con la que suelo encontrarme pasa por utilizar la función del API ntQuerySystemInformation (ntdll.dll), incluso hay ejemplos en C# en la web, problema, es necesario el uso de un driver, en mi caso, la aplicación no carga este driver (que muy amablemente habían incluido con el ejemplo), al ejecutar me saca el error "El sistema no puede hallar el archivo especificado" cuando carga el driver me aseguro que la ruta y el nombre del fichero .sys sea correcto, pero ni así, como no sea un tercer fichero referenciado por el sys no se que pueda ser.
Creo que por no cargar este driver es por lo después la aplicación me muestra todos los handles del proceso que le indico menos los correspondientes a los ficheros (que es lo que realmente necesito).
Si podeis ayudarme os lo agradecería.

Hendrix

Eso mismo te hiba a decir, con un driver esto se soluciona muy rapido....si quieres saber los archivos que abre X programa tambien se puede hacer sin necesidad de driver, inyectando una Dll al iniciarse el archivo, lo malo de este metodo es que sera solo para una aplicación concreta....con esa Dll hookeas la api que quieras (OpenFile) y listo, a interceptar llamadas.....

Si te interesa eso de la Dll en este mismo post deje un codigo en C# para inyectar Dll's  :)
"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

mmob

Bueno, se puede utilizar el comando HANDLE, que podemos descargar de http://www.microsoft.com/technet/sysinternals/utilities/handle.mspx, en C# se puede iniciar un proceso redirigiendo la salida y cogemos nosotros el resultado.
Problema: no salen los archivos que tenemos abiertos en remoto, solo los que tengamos abiertos de nuestra propia máquina, es decir, si yo abro un documento de Word que se encuentra en mi maquina y otro que está en otra máquina, el mio sale en la lista, el otro no.
Conoceis algun comando del estilo pero que sirva para que tambien salgan los remotos?.

~~

Una cosa _Hendrix, pero las dll's de C# valen para inyectar? la verdad es q nunca he provado por q no se como definir la DllMain... :huh:

Hendrix

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

mmob

Nunca he hecho eso de inyectar una dll, podrías explicarme por favor?
Serviria tambien para detectar los archivos que la aplicacion abre y que estan alojados en otra maquina?
Gracias por vuestro tiempo.

byebye

ntQuerySystemInformation la puedes usar desde modo usuario.

mmob

Hola de nuevo, para el tema de averiguar archivos que son abiertos he tenido que inclinarme por utilizar un file system filter driver.
Estoy en pruebas con el del FileMon (filem.sys). Lo cargo sin problema, e incluso me responde al comando de versión (me devuelve la versión correctamente) pero a la hora de pedirle los datos relativos a las IRPs "capturadas" me devuelve una cadena vacia. Por supuesto antes fijo los drivers a escuchar, establezco un filtro con el tipo de fichero que me interesa y activo el proceso de filtrado. Realmente no se si es alguno de estos comandos el que configuro mal.
Alguien conoce este driver y puede darme alguna pista? por ejemplo, acerca de los parametros que deben recibir.
NOTA: El desarrollo de prueba es una aplicacion para consola escrita en C# 2005.