我在一个系统上用C创建了一个简单的服务器而在另一个系统上创建了一个客户端。我的目标是在服务器上运行进程,将其进程HANDLE发送到连接系统,并使用 ReadProcessMemory ,读取和解释特定数据值。
我很清楚不同体系结构上的数据传输带来的问题,我想看看在提出这么困难的任务之前我提出的建议是否可行。我的问题如下:
在我的情况下,HANDLE仅仅是对过程的引用吗?这意味着如果我成功地将流程句柄发送给客户端,我将无法对其进行任何操作?
如果上述情况属实,是否有某种方法可以拍摄快照或转储进程的内存,通过TCP发送转储(当然使用Winsock),并通过读取和排序客户端上的内存。如果是这样,那条数据是否太大而无法发送。
我想强调的是,进程内存的读取必须由客户端系统而不是服务器完成
答案 0 :(得分:1)
HANDLE
是一个值。其含义仅对本地系统和流程有用。您将HANDLE
作为参数传递给Windows API以与相应的进程/窗口/等进行交互,因此除了标识之外,它对于远程系统并不是真正有用。
是的,您可以拍摄内存区域的快照并通过套接字发送。事实上,你可以通过套接字发送任何东西。由您来处理收到的数据并赋予其意义。如果你不这样做,那只是垃圾转移。
我想强调,过程'内存的读取必须由客户端系统而不是主机完成。
如果我理解正确,您所谓的主机实际上就是您的服务器。客户端无法直接读取服务器的内存。你的最终目标可以完成。您必须定义如下通信协议:
对于任何网络通信,必须特别注意字节顺序。
答案 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
在执行远程调试时的工作原理。