有点难以解释,但我注意到当strace
ing 使套接字打开的 PID 时,我看不到任何通信。我怎样才能坐在套接字文件的中间来观察通信?
答案1
套接字是用于通信的内核 API。使用套接字 API,您可以通过 TCP/IP 连接、SCTP 关联、UDP 数据报在两个端点之间交换数据,或者使用 Unix 域套接字在两个进程(数据报或连接)之间交换数据...
作为内核 API,与套接字的任何交互都是通过系统调用(socket
、bind
、connect
、listen
、accept
、sendmsg
、send
、recv
... write/read
)。
因此,通常strace
能够跟踪那些,因为strace
跟踪系统调用。唯一strace
无法跟踪的通信机制是共享内存上的 IPC(因为在内存中读/写某些内容显然不涉及系统调用)。
就您而言,更有可能的是其他事情。我敢打赌,该应用程序是多线程的,并且您没有跟踪正确的线程。或者应用程序可能是 setuid/setgid 并且不是以超级用户身份启动。
如果您想跟踪通过 Unix 域套接字交换的内容,选项有:
strace
和其他ptrace
调试器(跟踪服务器或客户端)- 审计系统 (
auditd
/auditctl
),再次跟踪系统调用 - 使用
LD_PRELOAD
技巧来包装与套接字交互的系统调用 - 检测应用程序的代码以在其中添加日志记录。
- 如前所述,systemtap 和其他低级内核跟踪/调试系统
- 中间插入一个人。
对于 MITM,您可以例如使用socat
.这里是面向连接的 Unix 域套接字,例如 X11:
socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo
xlogo
然后,您会看到与 X 服务器交换的 X11 流量。
答案2
您不能“跟踪套接字”,strace 适用于进程,因此您可以跟踪与套接字通信的所有进程,但您不能使用 strace 来查看涉及套接字的所有通信。你可能如果 dtrace 或 systemtap 在您的操作系统上可用,则可以使用 dtrace 或 systemtap 到达某处,但这需要相当多的工作。