我正在尝试编写一个内核模块,从 netstat 中隐藏一些套接字。我检查了 netstat 的工作原理,发现它正在从/proc/net/tcp
.
现在我被困住了。我试图弄清楚当我阅读文件时发生了什么/proc/net/tcp
。经过一番谷歌研究后,我发现它正在使用tcp4_seq_show
函数。
我的问题是如何在不谷歌搜索的情况下找到使用了哪个函数?
我尝试使用 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
,您可以下载内核源文件和/或阅读内核文档,例如。有关虚拟文件系统, /进程和序列文件界面。
由于/proc
文件系统是一个内核功能,可以使系统信息可供用户空间使用,我不知道是否可以隐藏套接字netstat
(参见如何编辑/proc/net/tcp?)。