通过TCP发送进程句柄

通过TCP发送进程句柄,c,sockets,tcp,handle,winsock2,C,Sockets,Tcp,Handle,Winsock2,我在一个系统上用C创建了一个简单的服务器,在另一个系统上创建了一个客户端。我的目标是获取服务器上运行的进程,将其进程句柄发送到连接系统,并使用ReadProcessMemory读取和解释特定的数据值 我很清楚在不同的体系结构上进行数据传输所带来的问题,这就是我希望在尝试这样一项困难的任务之前,看看我提出的建议是否可行。我的问题如下: 在我的例子中,句柄仅仅是对进程的引用吗?这意味着,如果我成功地将进程句柄发送给客户端,我将无法对其执行任何操作 如果上述情况属实,是否有某种方式可以拍摄快照或转储进

我在一个系统上用C创建了一个简单的服务器,在另一个系统上创建了一个客户端。我的目标是获取服务器上运行的进程,将其进程句柄发送到连接系统,并使用ReadProcessMemory读取和解释特定的数据值

我很清楚在不同的体系结构上进行数据传输所带来的问题,这就是我希望在尝试这样一项困难的任务之前,看看我提出的建议是否可行。我的问题如下:

  • 在我的例子中,句柄仅仅是对进程的引用吗?这意味着,如果我成功地将进程句柄发送给客户端,我将无法对其执行任何操作

  • 如果上述情况属实,是否有某种方式可以拍摄快照或转储进程的内存,通过TCP发送转储(当然使用Winsock),并读取和排序客户端上的内存。如果是这样的话,这段数据是否太大而无法发送

  • 我想强调的是,进程内存的读取必须由客户端系统完成,而不是服务器

  • 是一种价值。其含义仅对本地系统和流程有用。您将
    句柄
    作为参数传递给Windows API,以与相应的进程/window/etc交互,因此除了标识之外,它对远程系统没有任何用处

  • 是的,您可以拍摄内存区域的快照并通过套接字发送。事实上,您可以通过套接字发送几乎任何内容。由您来处理接收到的数据并赋予其意义。如果你不这样做,那就是垃圾被转移

  • 我想强调的是,进程内存的读取必须由客户端系统而不是主机完成

    如果我没弄错的话,你们所说的主机实际上就是你们的服务器。客户端无法直接读取服务器的内存。你的最终目标是可以实现的。您必须定义如下所示的通信协议:

  • [客户端]请求句柄或PID(进程标识符)列表
  • [server]读取请求,发送PID列表,等待更多请求
  • [客户端]接收PID列表
  • [客户端]请求单个PID的快照,并等待它
  • [服务器]接收快照请求,并对其进行解释
  • [服务器]拍摄快照
  • [服务器]将快照发送到客户端,等待更多请求
  • [客户端]接收快照并进行处理
  • [客户端]做点别的吗

  • 对于任何网络通信,必须特别注意字节顺序。

    只能从与句柄所属的进程在同一台机器上运行的进程调用
    ReadProcessMemory()
    调用

    服务器可以将句柄传递给它认为是远程客户端的对象,但是实际的接收方可以是与服务器运行在同一台机器上的代理进程。然后,客户机指示代理需要读取哪些值,代理读取并返回这些值

    Client Machine              Server Machine 
    --------------              --------------
    +--------+                  +-------+        +--------+
    | Client |                  | Proxy |        | Server |
    +--------+                  +-------+        +--------+
        |- Get HANDLE ------------->|                |
        |                           |- Get HANDLE -->|
        |                           |<------ HANDLE -|
        |<------------- Got HANDLE -|                |
        |- Read data value x ------>|
        |                           |ReadProcessMemory()
        |<------------- value of x -|
        |- Read data value y ------>|
        |                           |ReadProcessMemory()
        |<------------- value of y -|
    
    客户端计算机服务器计算机
    --------------              --------------
    +--------+                  +-------+        +--------+
    |客户端| |代理| |服务器|
    +--------+                  +-------+        +--------+
    |-获取句柄----------------->|
    ||-获取句柄-->|
    
    ||对于进程句柄,句柄是机器本地属性。发送到另一台机器是没有意义的,它不能用它做任何事情<代码>ReadProcessMemory()
    不能跨计算机边界使用。如果客户机和服务器在同一台机器上,那么它将工作。至于如何发送
    句柄
    ,它只是一个指针,所以键入cast将其转换为
    int
    (32位系统)或
    \u int64
    (64位系统)并发送,然后键入cast将其转换回另一侧的
    句柄
    。当然,这意味着客户端和服务器都必须是32位或64位进程,因此
    句柄
    具有正确的含义,否则就有截断值的风险。