Как узнать, какая функция запущена при чтении /proc

Как узнать, какая функция запущена при чтении /proc

Я пытаюсь написать модуль ядра, который скрывает некоторые сокеты от netstat. Я проверил, как работает netstat, и увидел, что он читает из /proc/net/tcp.

Теперь я застрял. Я пытаюсь понять, что происходит, когда я читаю файл /proc/net/tcp. После небольшого исследования в Google я обнаружил, что он использует tcp4_seq_showфункцию.

Мой вопрос в том, как узнать, какая функция используется, не прибегая к поиску в Google?

Я пробовал использовать strace как -

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

но вывод не содержит никаких ссылок на tcp4_seq_showфункцию или любую другую функцию ядра.

соответствующий вывод -

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 +++

Пробовал также использовать ltrace, но возвращает пустой вывод...

Так как же мне определить, какая функция используется, не зная всего ядра и не гугля его?

решение1

Я не думаю, что вы можете отслеживать вызовы ядра просто с помощью инструментов пользовательского пространства. То, что вы, вероятно, ищете, этоftrace, то вы могли бы (если ваше ядро ​​это поддерживает) сделать что-то вроде этого:

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

Для получения дополнительной информации о том, что именно происходит, когда вы читаете /proc/net/tcp, вы можете загрузить исходные файлы ядра и/или прочитать документацию ядра, например, овиртуальная файловая система, /проциseq_fileинтерфейс.

Поскольку /procфайловая система — это функция ядра, позволяющая сделать системную информацию доступной для пользовательского пространства, я не знаю, возможно ли скрыть сокеты netstat(см.Как мне отредактировать /proc/net/tcp?).

Связанный контент