深入tcpdump
研究实现,我可以看到它实际上libpcap.so
在用户空间中加载动态库。
但是,通过使用strace
,我看不到对 libpcap 导出的任何函数的任何调用。
以上是 tcpdump 的预期行为吗?谢谢。
root@eve-ng02:~# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.7.4
OpenSSL 1.0.2g 1 Mar 2016
编辑:根据我尝试过的收到的评论ltrace
,但似乎也没有完成对动态库的调用。
root@eve-ng02:~# ltrace tcpdump -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
^C--- SIGINT (Interrupt) ---
0 packets captured
126 packets received by filter
98 packets dropped by kernel
+++ exited (status 0) +++
root@eve-ng02:~#
答案1
strace
仅显示系统调用。ltrace
是一个用于显示库调用的工具(请参阅系统调用和库调用的区别)。
如果您想同时查看系统调用和库调用,您可以-S
添加ltrace
(“显示系统调用以及库调用”)
您还可以将 添加-k
到您的strace
(“每次系统调用后打印所跟踪进程的执行堆栈跟踪”)如果您的strace
版本支持它。它不会显示所有的库调用,但会显示每个系统调用的执行跟踪,您可以在其中看到哪个库触发了系统调用。
17212 eventfd2(0, EFD_NONBLOCK) = 3
> /lib64/libc-2.31.so(eventfd+0x7) [0x117b87]
> /usr/lib64/libpcap.so.1.10.1() [0xb8fa]
> /usr/lib64/libpcap.so.1.10.1(pcap_create+0xaa) [0x10a9a]
> /usr/sbin/tcpdump() [0x3efbf]
> /usr/sbin/tcpdump() [0x3c891]
> /lib64/libc-2.31.so(__libc_start_main+0xee) [0x3524c]
> /usr/sbin/tcpdump() [0x3e149]
17212 socket(AF_PACKET, SOCK_DGRAM, htons(0 /* ETH_P_??? */)) = 4
> /lib64/libc-2.31.so(__socket+0x7) [0x1190d7]
> /usr/lib64/libpcap.so.1.10.1() [0xa0c0]
> /usr/lib64/libpcap.so.1.10.1(pcap_activate+0x1c) [0x1191c]
> /usr/sbin/tcpdump() [0x3f0d2]
> /usr/sbin/tcpdump() [0x3c891]
> /lib64/libc-2.31.so(__libc_start_main+0xee) [0x3524c]
> /usr/sbin/tcpdump() [0x3e149]