如何控制子进程套接字?

How to take control of subprocess socket?

所以基本上,我想用 subprocess 模块创建进程,我也想控制数据包。

我的意思是什么?


考虑这段代码。

import socket
client = socket.socket()
client.connect((..., ...))

client.send("e".encode())
client.close()

(假设文件名是 client.py
我想在这里做的是,我想制作另一个 python 文件,运行 client.pysubprocess 模块,我想在父进程中收听它的数据包正在发送,我想修改它们,基本上是篡改子进程套接字的数据包,如果可能的话。

是的,这是可能的。这本质上是调试器所做的。

在system/binary级别,有一个系统调用ptrace(2)允许一个进程控制另一个进程。这包括在受控进程中设置断点、停止它、继续它、修改其中的数据等等。要从 python 程序运行它,有这个模块:https://python-ptrace.readthedocs.io/en/latest/usage.html

您还可以在 python 语句级别进行调试。这就是 python 调试器模块 (pdb) 所做的。我不知道以编程方式 运行 调用它的最佳方式,但我确信这是可能的。 (在最坏的情况下,您可以简单地 运行 交互式调试器和管道命令进入它。)

但是,这两种选择都具有显着的学习曲线。在较高级别,您可以在子进程中设置一个断点,以便程序在执行 send 系统调用之前的某个时间点停止。触发断点后,您可以检查缓冲区内容 and/or 将其替换为您自己的内容,然后让程序继续。