Cómo saber qué función se está ejecutando al leer /proc

Cómo saber qué función se está ejecutando al leer /proc

Estoy intentando escribir un módulo del kernel que oculte algunos sockets de netstat. Revisé cómo funciona netstat y vi que está leyendo desde /proc/net/tcp.

Ahora estoy estancado. Estoy tratando de descubrir qué sucede cuando leo el /proc/net/tcparchivo. Después de investigar un poco en Google, descubrí que está usando tcp4_seq_showuna función.

Mi pregunta es ¿cómo puedo saber qué función se utiliza sin buscarla en Google?

Intenté usar strace como:

strace -y -yy -v cat /proc/net/tcp

pero la salida no contiene ninguna referencia a la tcp4_seq_showfunción ni a ninguna otra función del núcleo.

la salida relevante -

arch_prctl(ARCH_SET_FS, 0x7ff5ec3e1580) = 0
mprotect(0x7ff5ec3d6000, 12288, PROT_READ) = 0
mprotect(0x55c369b3b000, 4096, PROT_READ) = 0
mprotect(0x7ff5ec420000, 4096, PROT_READ) = 0
munmap(0x7ff5ec3e2000, 71701)           = 0
brk(NULL)                               = 0x55c36a40e000
brk(0x55c36a42f000)                     = 0x55c36a42f000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5698896, ...}) = 0
mmap(NULL, 5698896, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff5ebc7f000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
openat(AT_FDCWD, "/proc/net/tcp", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5ebc5d000
read(3, "  sl  local_address rem_address "..., 131072) = 900
write(1, "  sl  local_address rem_address "..., 900  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0915 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 69736 1 ffff9f59772fc600 100 0 0 10 0                     
   1: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000   102        0 31698 1 ffff9f59772f9a40 100 0 0 10 0                     
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 38399 1 ffff9f5972c3a300 100 0 0 10 5                     
   3: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 38548 1 ffff9f5972c3b480 100 0 0 10 0                     
   4: 0100007F:A879 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 44812 1 ffff9f59772fd780 100 0 0 10 0                     
) = 900
read(3, "", 131072)                     = 0
munmap(0x7ff5ebc5d000, 139264)          = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Intenté usarlo también ltracepero devuelve una salida vacía...

Entonces, ¿cómo puedo determinar qué función se utiliza sin conocer todo el núcleo y sin buscarlo en Google?

Respuesta1

No creo que puedas rastrear las llamadas al kernel simplemente con herramientas del espacio de usuario. Lo que probablemente estés buscando esftrace, entonces podrías (si tu kernel lo admite) hacer algo como esto:

sysctl kernel.ftrace_enabled=1
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
cat /proc/net/tcp
echo 0 > /sys/kernel/debug/tracing/tracing_on
less /sys/kernel/debug/tracing/trace

Para obtener más información sobre qué sucede exactamente cuando lees /proc/net/tcp, puedes descargar los archivos fuente del kernel y/o leer la documentación del kernel, por ejemplo. acerca desistema de archivos virtual, /procesoy elarchivo_secinterfaz.

Como el /procsistema de archivos es una característica del kernel para que la información del sistema esté disponible para el espacio del usuario, no sé si es posible ocultar sockets netstat(cf.¿Cómo puedo editar /proc/net/tcp?).

información relacionada