为了拦截/分析网络流量,我们有一个名为的实用程序Wireshark。
我们是否有类似的实用程序来拦截 Unix/Linux 中任意两个进程之间的所有进程间通信?
我在内存中创建了一些进程,我需要分析它们如何相互通信。
答案1
这在很大程度上取决于沟通机制。
在最透明的一端,进程可以使用互联网套接字进行通信(即知识产权)。然后,wireshark 或 tcpdump 可以通过将其指向环回接口来显示所有流量。
在中等水平上,交通管道和Unix 套接字
truss
可以用//strace
/ ...来观察trace
,系统追踪的瑞士军电锯。然而,这会显着减慢进程速度,因此它可能不适合分析。在最不透明的一端,有共享内存。共享内存的基本工作原理是,访问在每个涉及的进程中是完全透明的,只需要系统调用来设置共享内存区域。从外部跟踪这些内存访问会很困难,特别是当您需要观察而不干扰时序时。您可以尝试类似的工具Linux 跟踪工具包(需要内核补丁)并看看是否可以提取有用的信息;我希望 Solaris 在这方面有更好的工具(但我对此一无所知)。
如果您有源代码,那么最好的选择可能是将跟踪语句添加到关键库函数中。
LD_PRELOAD
即使您没有(完整)源代码,只要您对访问共享内存的程序部分的控制流有足够的了解,这也可以通过技巧来实现。
答案2
这将显示进程读取和写入的内容:
strace -ewrite -p $PID
它不是干净的输出(显示类似以下的行: write(#,) ),但可以工作! (并且是单行:D)您可能也不喜欢参数被缩写的事实。要控制该设置,请使用 -s 参数来设置显示的字符串的最大长度。
它捕获所有流,因此您可能需要以某种方式对其进行过滤。
您可以过滤它:
strace -ewrite -p $PID 2>&1 | grep "write(1"
仅显示描述符 1 调用。 2>&1是将stderr重定向到stdout,因为strace默认写入stderr。