¿Podemos decir que una "serie" completa de archivos en un proceso (como se representa respectivamente por los descriptores de archivo) refleja directamente este proceso y los posibles subprocesos del mismo, de modo que al examinar los archivos, descritos por los descriptores de archivo, podría ¿Cuéntanos la naturaleza exacta del proceso y los posibles subprocesos?
En otras palabras, si observa cada archivo (representado por descriptores de archivo en un orden respectivo como 0-X), ¿le dirá la naturaleza del proceso o subprocesos?
Creo que la respuesta sería sí, si de hecho, todo el proceso realmente está hecho solo de estos archivos.
process
file-descriptors
JohnDoea
fuente
fuente
lsof(8)
archivo y no encontró descriptores abiertos, ¿entonces qué? Dicho de otra manera, si escribiera un programa que abriera todas las bibliotecas del sistema solo por diversión, ¿qué esperaría aprender de la lista de descriptores abiertos?Respuestas:
Respuesta corta: no
Respuesta larga: los descriptores de archivo utilizados por un proceso no son lo suficientemente estáticos como para permitir un análisis confiable del proceso. Los archivos se pueden abrir y cerrar, las estructuras de datos correspondientes serán recicladas por el núcleo.
fuente
Contraejemplo: escriba dos programas que duerman durante, por ejemplo, 100 segundos, y luego escriba 1 resp. 2 a stderr. Comience ambos desde el mismo caparazón y póngalos en segundo plano. No podrá distinguirlos mirando los descriptores de archivo, que son idénticos para ambos.
Variante: haga que abran el mismo archivo, por lo que ni siquiera funciona si no está restringido a los descriptores estándar.
fuente
No creo entender completamente lo que está preguntando ... Agregue alguna explicación.
Pero por lo que creo que entiendo, no .
Una analogía podría ser:
En este caso, esa respuesta es bastante turbia. Es posible que pueda ver que la Persona A habla con alguna persona importante en la aplicación de la ley, y tal vez con algunas personas asociadas con el crimen organizado. Pero va a ser extremadamente difícil (¿imposible?) Declarar con certeza los motivos de la Persona A. ¿Son policías encubiertos o delincuentes con un juez bajo el pulgar?
No se puede leer nada confiablemente en tal conocimiento solo.
Si lograra obtener más información, como la E / S que se está realizando, entonces estaría en camino de comprender la situación con mayor claridad.
Creo que estás algo confundido acerca de lo que es un " descriptor de archivo ". Un descriptor de archivo se identifica mediante un número simple (
int
): el valor de retorno deopen()
... pero dentro del núcleo un descriptor de archivo tiene información asociada. Verstruct file
.Esto también tiene alguna evidencia de mala comprensión. Un proceso no está " hecho solo de estos archivos ", sino que está accediendo a estos archivos en este momento . Podemos mostrar esto ejecutando lo siguiente:
Como @grawity ha señalado en un comentario,
open()
devolverá el siguiente descriptor de archivo gratuito, llenando los vacíos desde cero. Lo que ves arriba es una instantánea de los archivos que están abiertos actualmente y que cambiarán con el tiempo.No puede ver el
ls
binario en la lista anterior, ni ninguna de sus dependencias inmediatas:Cuando intenta " ejecutar
ls
", el enlazador es en realidad lo que lee los archivos de la biblioteca para clasificar y "enlazar" la imagen completa del proceso. Cuandols
comienza a ejecutarse, estos datos ya están en la memoria y los archivos ya no están "abiertos".Algunas aplicaciones pueden hacer uso de 'complementos' o cargar 'dinámicamente' archivos adicionales que brindan funcionalidad (ver
dlopen()
), pero este es un caso extremo y está lejos del comportamiento típico: ninguno de los procesos que se ejecutan actualmente en mi máquina tiene un objeto compartido (*.so
) archivo abierto.En resumen, y aún de acuerdo con mi respuesta original, no .
No hay una forma definitiva de determinar el comportamiento de un proceso al observar qué archivos tiene abiertos.
En cuanto a determinar la naturaleza de un subproceso, esto es imposible: ¿puede observar
init
y determinar la configuración de tiempo de ejecución completa de un sistema? No se .fuente
No.
La mayoría de los procesos tienen un comportamiento descriptor muy similar. Por ejemplo, casi todos los demonios escriben su salida en registros (archivos), que a menudo se comparten. Por ejemplo, en mi sistema
/var/log/journal
tiene entradas desystemd
,gnome-keyring-*
,dbus-daemon
y muchos programas más.Un patrón que se usa a menudo es redireccionar descriptores hacia / desde
/dev/{null,zero,urandom,tty*}
, o cerrarlos.Otro ejemplo,
cmp
ydiff
básicamente hacen lo mismo, pero tratan con diferentes tipos de datos.Incluso hay programas en el
moreutils
paquete (que es brillante) que envuelven algunos patrones de descriptores comunes:chronic
- ejecuta un comando en silencio a menos que fallesponge
- absorber la entrada estándar y escribir en un archivo (el archivo se abre después de empapar la entrada, de modo quegrep "mom" somefile | sponge somefile
solo deja esas líneas en algún archivo que contienen "mamá")diff
)E imagine, qué tan rápido están cambiando los descriptores
top
o losfind
programas. Debería rastrearlos durante todo el tiempo de ejecución.Una pregunta para llevar a casa: ¿cuál es la diferencia en los descriptores entre LibreOffice Writer y GIMP, o mejor,
sed
y WannaCry?fuente
Respuesta corta: Sí, pero de manera muy limitada.
De hecho, observar lo que hace un proceso es una de las funciones principales de un antivirus, ya que entre los archivos que se abren también están los de DLL (Windows) o bibliotecas compartidas (Linux). Un antivirus que juzga el comportamiento de un proceso generará la alarma cuando un proceso abra demasiados archivos demasiado confidenciales o intente acceder a carpetas confidenciales. Windows / Linux puede solicitar permiso del usuario en tales casos.
Es posible detectar que un proceso está abriendo un archivo DLL / biblioteca compartida, pero para averiguar qué API llama requiere el análisis de las llamadas del sistema que hace, que un antivirus puede encontrar al examinar el archivo ejecutable del proceso. .
No olvide que el ejecutable en sí es uno de los archivos abiertos, por lo que su análisis puede decir exactamente qué DLL / bibliotecas compartidas usa, lo que puede proporcionar una muy buena comprensión de lo que hace.
El sistema operativo observará el comportamiento del proceso y lo clasificará en una clase de programación como un límite de CPU o de E / S o mixto, lo que afectará su prioridad de ejecución y sus segmentos permitidos de recursos del sistema.
Un subproceso generalmente heredará todos los descriptores de archivo abiertos de su padre y, por lo tanto, comenzará su vida en la misma clasificación a los ojos del sistema operativo y el antivirus, pero más tarde, a través de sus acciones, puede pasar a otra clasificación.
fuente