
¿Hay alguna forma de manipular (leer, escribir, etc.) un descriptor de archivo para cualquier aplicación que se pueda encontrar en la ruta ?/proc/{pid}/fd
Especialmente para enchufes.
$ ll /proc/4229/fd
total 0
lrwx------. 1 vagrant vagrant 64 May 18 01:10 0 -> socket:[34147]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 1 -> socket:[34149]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 10 -> /dev/null
lrwx------. 1 vagrant vagrant 64 May 18 01:10 11 -> socket:[34943]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 13 -> socket:[34945]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 14 -> socket:[34948]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 15 -> socket:[34950]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 2 -> socket:[34151]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 3 -> socket:[34153]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 4 -> pipe:[34155]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 5 -> pipe:[34155]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 6 -> anon_inode:[eventpoll]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 7 -> pipe:[34156]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 8 -> pipe:[34156]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 9 -> anon_inode:[eventfd]
Respuesta1
Técnicamente, casi todo es posible con ptrace()
/ gdb
. Resultados de la búsqueda.
El uso ptrace()
depende del arco, es incómodo y AFAICT nadie lo ha implementado por usted. La aplicación popular consiste en inyectar un fd en el proceso, pero eso es más o menos lo contrario de lo que desea.
Pensé en lo que sería necesario y parece muy doloroso.
Podrías usar el enfoque de script gdb y mirar el código fuente defiltrar. Probablemente todavía sea muy incómodo comunicar FD desde gdb. La forma de comunicar fds es enviarlos como "datos auxiliares" mediante sendmsg()
un socket Unix.
Desafortunadamente, el envío de datos auxiliares generalmente se realiza mediante una macro. Si bien gdb
da una impresión sorprendente de un intérprete de C, no creo que sea posible utilizar macros.
La otra forma de pasar fds es usando fork()
, por lo que podría proporcionar algunas opciones un poco más sencillas (combinadas con exec()
). Lamentablemente parece que ptrace()
no fork()
son mejores amigos. Hay algunoscomandos gdb específicos de Linuxque podría hacer el trabajo, pero sólo menciona el soporte para puntos de interrupción; no dice si puede hacer que el comando gdb call fork()
funcione de manera sensata. Incluso si funciona, es posible que FD_CLOEXEC
también deba meterse con (close-on-exec). Eso también es una macro.
No es demasiado difícil encontrar el valor numérico de una macro simple (así es como se escribió screenify). La interfaz macro para enviar datos auxiliares no es muy complicada, por lo que podría ser más fácil realizar ingeniería inversa.