Отправка дескриптора процесса через TCP

Я создал простой сервер на C в одной системе и клиент в другой. Моя цель — взять процесс, работающий на сервере, отправить его HANDLE процесса в подключающуюся систему и с помощью ReadProcessMemory прочитать и интерпретировать определенные значения данных.

Я хорошо осведомлен о проблемах, связанных с передачей данных на разных архитектурах, и я хотел бы увидеть, возможно ли то, что я предлагаю, прежде чем пытаться решить такую ​​сложную задачу. Мои вопросы следующие:

  1. Является ли HANDLE просто ссылкой, в моем случае, на процесс? Это означает, что если я успешно отправлю дескриптор процесса клиенту, я ничего не смогу с ним сделать?

  2. Если вышесказанное верно, есть ли какой-то способ, которым я могу сделать снимок или сделать дамп памяти процесса, отправить дамп через TCP (конечно, используя Winsock), а также прочитать и отсортировать память на клиенте. Если да, то будет ли этот фрагмент данных слишком большим для отправки.

Я хотел бы подчеркнуть, что чтение памяти процесса должно выполняться клиентской системой, а не сервером.


person Tony Murillo    schedule 11.07.2014    source источник
comment
Дескриптор — это машинное локальное свойство в случае дескриптора процесса. Отправка на другую машину бессмысленна, она ничего с ней сделать не может.   -  person Hans Passant    schedule 12.07.2014
comment
Согласованный. ReadProcessMemory() нельзя использовать за пределами компьютера. ЕСЛИ клиент и сервер находятся на одном компьютере, тогда он будет работать. Что касается того, как отправить HANDLE, это просто указатель, поэтому введите его в int (32-битная система) или __int64 (64-битная система) и отправьте его, а затем введите его обратно в HANDLE на другой стороне. Конечно, это означает, что и клиент, и сервер должны быть 32-битными или 64-битными процессами, поэтому HANDLE имеет правильное значение, иначе вы рискуете усечь значение.   -  person Remy Lebeau    schedule 12.07.2014


Ответы (2)


  1. HANDLE ценность. Его значение полезно только для локальной системы и процессов. Вы передаете HANDLE в качестве аргумента API-интерфейсам Windows для взаимодействия с соответствующим процессом/окном/и т. д., поэтому он не очень полезен для удаленных систем ни для чего, кроме идентификации.

  2. Да, вы можете сделать снимок области памяти и отправить его через сокет. На самом деле через сокет можно отправить практически все что угодно. Вам решать, как обработать полученные данные и придать им смысл. Если вы этого не сделаете, это просто перенос мусора.

Я хотел бы подчеркнуть, что чтение памяти процесса должно выполняться клиентской системой, а не хостом.

Если я вас правильно понял, то, что вы называете host, на самом деле является вашим сервером. Клиент не может напрямую читать память сервера. Однако ваша конечная цель может быть достигнута. Вам нужно будет определить протокол связи следующим образом:

  1. [клиент] Запросить список HANDLE или PID (идентификаторов процессов);
  2. [сервер] Прочитайте запрос, отправьте список PID и дождитесь дополнительных запросов;
  3. [клиент] Получить список PID;
  4. [клиент] Запросите снимок одного PID и дождитесь его;
  5. [сервер] Получите запрос моментального снимка и интерпретируйте его;
  6. [сервер] Сделайте снимок;
  7. [сервер] Отправьте снимок клиенту и дождитесь дополнительных запросов;
  8. [клиент] Получите снимок и обработайте его;
  9. [клиент] Сделать что-то еще?

Как и при любой сетевой связи, особое внимание следует уделить порядку байтов.

person jweyrich    schedule 11.07.2014

Вызов 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 при удаленной отладке.

person jxh    schedule 11.07.2014