
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/tcp
archivo. Después de investigar un poco en Google, descubrí que está usando tcp4_seq_show
una 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_show
funció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 ltrace
pero 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 /proc
sistema 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?).