Pregunta

Tengo una pequeña aplicación de línea de comandos escrita en C que actúa como un contenedor / iniciador para otros programas (piense: xargs). La aplicación está escrita para compilar en FreeBSD / Linux (a través de fork () / exec ()) y Windows (CreateProcess ()). Además de poder interceptar, inyectar o manipular de otro modo los argumentos de la línea de comandos para la aplicación secundaria, me preguntaba si hay una manera fácil de interceptar la actividad del sistema de archivos del programa secundario (o son los elementos secundarios, etc.). Estoy interesado principalmente en los nombres de archivo a los que se accede para leer o escribir, pero no en el contenido de dichos archivos, y me gustaría que la intercepción sea lo más liviana posible.

Al buscar en Google algunas palabras clave relevantes de arriba, parece que hay muchas formas de hacerlo en Win32. Desde los controladores de filtro del sistema de archivos hasta la manipulación de encabezados de tabla de importación PE. Ninguno de estos parece trivial o algo que podría contener dentro del ejecutable de mi programa contenedor (por ejemplo, la mayoría requeriría archivos DLL o archivos de controladores adicionales junto con el ejecutable principal). Además, me gustaría que esto funcione en Windows XP a través de 7, si es posible , sin tener que hackear UAC u otras plataformas deltas. Es mi proceso hijo, así que creo que debería poder monitorear de manera segura su actividad :)

En Linux, hay inotify (), pero supervisa el acceso general al sistema de archivos sin tener en cuenta SOLO los procesos de mi hijo. Lo mismo ocurre con kqueue () de FreeBSD. Estos también se desglosan en casos de SMP en los que varias instancias del reiniciador pueden estar ejecutando diferentes programas, y cada uno necesita desambiguar la actividad del sistema de archivos de su propio hijo.

Sin duda agradecería cualquier sugerencia que la comunidad SO pueda ofrecer.

¿Fue útil?

Solución

Escriba un intercalador " biblioteca que conecta su fopen y establece la variable de entorno LD_PRELOAD para todos los procesos secundarios. Esto funciona con bibliotecas vinculadas dinámicamente.

Puede encontrar un ejemplo de cómo hacerlo aquí: http: // developers. sun.com/solaris/articles/lib_interposers.html y http://lists.debian.org/debian-powerpc/2004/11/msg00039.html muestra una implementación parcial para el interposer fopen () ..

Otros consejos

La única sugerencia que haría es usar strace (rastrear llamadas y señales del sistema), aunque esta es más una herramienta de depuración y afecta el rendimiento del proceso que se está rastreando

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

En mi humilde opinión: si te familiarizas con strace , siempre es una herramienta útil para tener en el arsenal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top