有没有办法在Unix / Linux中拦截进程间通信?


15

为了拦截/分析网络流量,我们有一个名为Wireshark的实用程序。

在Unix / Linux中,我们是否有类似的工具来拦截任何两个进程之间的所有进程间通信?

我已经在内存中创建了一些进程,我需要分析它们如何相互通信。


1
您使用哪种IPC机制进行通信?
axel_c

@axel_c:进程源与我无关,但我认为我在文档中的某个地方阅读了“共享内存”。
拉泽尔

Answers:


19

这在很大程度上取决于通信机制。

  • 在最透明的范围内,进程可以使用Internet套接字(即IP)进行通信。然后,wireshark或tcpdump可以通过将其指向回送接口来显示所有流量。

  • 在中间级别上,可以使用瑞士军队系统跟踪电锯/ / / ... 来观察管道unix套接字上的流量。但是,这可能会大大减慢过程,因此可能不适合进行概要分析。trussstracetrace

  • 在最不透明的一端,有共享内存。共享内存的基本操作原理是,在每个涉及的过程中访问都是完全透明的,您只需要系统调用即可设置共享内存区域。从外部跟踪这些内存访问将很困难,尤其是如果您需要观察以免干扰时间的话。您可以尝试使用Linux跟踪工具包之类的工具(需要内核补丁),并查看是否可以提取有用的信息。我希望Solaris具有更好的工具(但我对此一无所知)。

    如果有资源,最好的选择可能是将跟踪语句添加到关键库函数中。LD_PRELOAD即使您没有(整个)源,也可以通过技巧来实现,只要您对访问共享内存的程序部分的控制流有足够的了解。


6

这将显示进程读取和写入的内容:

strace -ewrite -p $PID

它不是干净的输出(显示如下行:write(#,)),但是可以工作!(并且是单行:D)您可能还不喜欢参数缩写的事实。要使用-s参数控制该参数,该参数设置显示的字符串的最大长度。

它捕获所有流,因此您可能希望以某种方式对其进行过滤。

您可以过滤它:

strace -ewrite -p $PID 2>&1 | grep "write(1"

仅显示描述符1调用。2>&1是将stderr重定向到stdout,因为strace默认写入stderr。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.