kiwi898 2023-01-12 11:03 采纳率: 0%
浏览 10

python通过pid控制局部进程socks5

如题 希望通过识别进程pid 对部分进程实现局部socks5,或其他协议

  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-01-12 11:21
    关注

    在 Python 中,你可以使用 psutil 库来识别进程的 PID,然后使用 socket 库来控制网络连接。

    首先你可以安装 psutil 库,通过命令行:

    pip install psutil
    
    

    然后导入并使用 psutil.process_iter() 方法来识别你需要控制的进程,并获取它们的 PID。

    import psutil
    
    def get_pid_by_name(process_name):
        pid = None
        for process in psutil.process_iter():
            if process.name() == process_name:
                pid = process.pid
        return pid
    
    

    之后你可以使用 socket 库来实现 SOCKS5 协议。首先,你需要创建一个 socket 对象,并连接到 SOCKS5 代理服务器。然后,使用 SOCKS5 协议规定的格式发送认证和连接请求。

    import socket
    
    def socks5_proxy(proxy_ip, proxy_port, target_ip, target_port, pid):
        # Connect to the proxy server
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((proxy_ip, proxy_port))
        # Send the authentication details
        sock.sendall(b'\x05\x01\x00')
        # Receive the response
        resp = sock.recv(2)
        if resp != b'\x05\x00':
            raise Exception('SOCKS5 proxy authentication failed.')
        # Send the connection request
        req = b'\x05\x01\x00\x03' + len(target_ip).to_bytes(1, 'big') + target_ip.encode() + target_port.to_bytes(2, 'big')
        sock.sendall(req)
        # Receive the response
        resp = sock.recv(4)
        if resp[0] != 0x05:
            raise Exception('Not a SOCKS5 proxy.')
        if resp[1] != 0x00:
            raise Exception('SOCKS5 connection failed.')
        # Receive additional data (such as the chosen IP and port for the bound connection)
        extra = sock.recv(resp[3])
        # use the socket for further communication
        # and you can also control it as per your requirements such as closing the connection for specific pid
        #...
    
    

    现在你可以根据 PID 来控制连接。例如,在你需要关闭某个进程的网络连接时,你可以使用 sock.close() 方法来关闭 socket,关闭该进程的网络连接。

    if pid == get_pid_by_name(process_name):
        sock.close()
    
    

    还有另一个可选的方案,比如通过iptables或者是别的网络代理工具来限制连接,可以按需选择

    需要注意的是, 如果你想要代理所有进程的网络连接,那么你需要在系统级别设置代理,而不是在 Python 程序中实现。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月12日