通过TCP发送进程句柄

时间:2014-07-11 23:02:11

标签: c sockets tcp handle winsock2

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

我很清楚不同体系结构上的数据传输带来的问题,我想看看在提出这么困难的任务之前我提出的建议是否可行。我的问题如下:

  1. 在我的情况下,HANDLE仅仅是对过程的引用吗?这意味着如果我成功地将流程句柄发送给客户端,我将无法对其进行任何操作?

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

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

2 个答案:

答案 0 :(得分:1)

  1. HANDLE是一个值。其含义仅对本地系统和流程有用。您将HANDLE作为参数传递给Windows API以与相应的进程/窗口/等进行交互,因此除了标识之外,它对于远程系统并不是真正有用。

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

  3.   

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

    如果我理解正确,您所谓的主机实际上就是您的服务器。客户端无法直接读取服务器的内存。你的最终目标可以完成。您必须定义如下通信协议:

    1. [客户端]请求HANDLE或PID列表(进程标识符);
    2. [服务器]读取请求,发送PID列表,等待更多请求;
    3. [客户端]接收PID列表;
    4. [客户端]请求单个PID的快照,并等待它;
    5. [服务器]接收快照请求并对其进行解释;
    6. [服务器]拍摄快照;
    7. [服务器]将快照发送到客户端,等待更多请求;
    8. [客户端]接收快照并进行处理;
    9. [客户]做点什么吗?
    10. 对于任何网络通信,必须特别注意字节顺序。

答案 1 :(得分:1)

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

服务器可以将HANDLE传递给它认为是远程客户端的东西,但是实际的接收者可以是与服务器在同一台机器上运行的代理进程。然后,客户端指示代理要读取的值,代理读取它们并返回它们。

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 -|

这大致是gdbserver在执行远程调试时的工作原理。