Совместное использование памяти между двумя процессами (C, Windows)

StackOverflow https://stackoverflow.com/questions/1200998

Вопрос

Поскольку я не нашел ответа на вопрос, заданный ранее здесь Я пробую другой подход.

Есть ли какой-нибудь способ разделить память между двумя процессами?

Второй процесс получает информацию из инъекции, поскольку это устаревшая программа, которая больше не поддерживается.

Моя идея состоит в том, чтобы ввести туда некоторый код, в структуру, которую я передаю внедренной программе, передать адрес (или что-то еще) в общую память, где находятся данные, которые мне нужно запустить.Как только я получу данные, я заполню свои собственные переменные внутри введенного потока.

Возможно ли это?Каким образом?

Код приветствуется.

Редактировать:

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

Это было полезно?

Решение

Вы можете попробовать файл, отображенный в памяти.

Это дает немного больше пошаговых подробностей.

Другие советы

Хотя Windows поддерживает общую память через свой API сопоставления файлов, вы не можете легко внедрить сопоставление общей памяти непосредственно в другой процесс, поскольку Просмотр карты offileex не принимает аргумент процесса.

Однако вы можете ввести некоторые данные, выделив память в другом процессе с помощью Виртуальный Allocex и Запись в память процесса.Если бы вы копировали дескриптор, используя Дублирующий дескриптор, затем введите заглушку , которая вызывает Просмотр карты offileex, вы могли бы установить сопоставление общей памяти в другом процессе.Поскольку это звучит так, как будто вы все равно будете вводить код, это должно хорошо сработать для вас.

Подводя итог, вам нужно будет:

  • Создайте анонимный дескриптор сегмента общей памяти, вызвав Сопоставление файлов для создания с INVALID_HANDLE_VALUE для HFile и NULL для lpName.
  • Скопируйте этот дескриптор в целевой процесс с помощью Дублирующий дескриптор
  • Выделите немного памяти для кода, использующего Виртуальный Allocex, с flAllocationType = MEM_COMMIT | MEM_RESERVE и flProtect = PAGE_EXECUTE_READWRITE с помощью flAllocationType = MEM_COMMIT / MEM_RESERVE
  • Запишите свой код-заглушку в эту память, используя Запись в память процесса.Эта заглушка, скорее всего, должна быть написана на ассемблере.Передайте ДЕСКРИПТОР из DuplicateHandle, записав его где-нибудь здесь.
  • Выполните свою заглушку, используя Создатьэмоциональный поток.Затем заглушка должна использовать полученный ею дескриптор для вызова Просмотр карты offileex.Тогда процессы будут иметь общий сегмент совместно используемой памяти.

Возможно, вам будет немного проще, если ваша заглушка загрузит внешнюю библиотеку - то есть попросите ее просто вызвать LoadLibrary (поиск адреса LoadLibrary оставлен читателю в качестве упражнения) и выполнять свою работу из точки входа библиотеки dllmain.В этом случае использование именованной общей памяти, вероятно, будет проще, чем возня с DuplicateHandle.Смотрите статью MSDN о Сопоставление файлов для создания для получения более подробной информации, но, по сути, передайте INVALID_HANDLE_VALUE для HFile и имя для lpName.

Редактировать:Поскольку ваша проблема заключается в передаче данных, а не в фактическом внедрении кода, вот несколько вариантов.

  1. Используйте общую память переменного размера.Ваша заглушка получает размер и либо имя, либо дескриптор общей памяти.Это уместно, если вам нужно только один раз обменяться данными. Обратите внимание, что размер сегмента общей памяти не может быть легко изменен после создания.
  2. Используйте именованная труба.Ваша заглушка получает имя или дескриптор канала.Затем вы можете использовать соответствующий протокол для обмена блоками переменного размера - например, введите size_t для значения длины, за которым следует само сообщение.Или используйте PIPE_TYPE_MESSAGE и PIPE_READMODE_MESSAGE и следите за ERROR_MORE_DATA, чтобы определить, где заканчиваются сообщения.Это уместно, если вам нужно обмениваться данными несколько раз.

Правка 2:Вот набросок того, как вы могли бы реализовать хранилище дескрипторов или указателей для вашей заглушки:

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

Вы также могли бы просто использовать фиксированное имя, что, вероятно, проще.

Вы можете использовать общую память

Вы пытались использовать каналы (для памяти) или даже сериализацию (для ваших объектов)?Вы можете использовать файлы для управления памятью между процессами.Сокеты также хороши для обеспечения связи между процессами.

Сопоставление памяти - это правильный путь, вам даже не нужно создавать постоянное пространство памяти, сектор памяти выходит из области видимости, когда все процессы, совместно использующие его, завершают работу.Есть и другие способы.Быстрый и грязный способ передачи данных из одного приложения на C в другое - это просто использовать операционную систему.В командной строке введите app1 | app2.Это приводит к тому, что app2 становится местом назначения вывода app1, или iow команда printf из app1 отправит ее в app2 (это называется pipeline).

Вы можете попробовать использовать Ускорение.Межпроцессный для связи между двумя процессами.Но чтобы внедрить код в ранее существующее, не поддерживаемое программное обеспечение, вам, вероятно, придется воспользоваться способом @bdonlan, использующим Запись в память процесса.

Если вы говорите о Windows, то основным препятствием является то, что каждый процесс находится в своем собственном виртуальном адресном пространстве.К сожалению, вы не можете передавать обычные адреса памяти от процесса к процессу и получать ожидаемые результаты.(С другой стороны, все потоки находятся в одном и том же адресном пространстве, вот почему потоки могут видеть память одинаковым образом.)

Однако в Windows есть разделяемое пространство памяти, которым вы должны быть очень осторожны, чтобы правильно управлять.Любой процесс, который выделяет место в общей памяти, отвечает за явное освобождение этой памяти.Это в отличие от локальной памяти, которая более или менее исчезает, когда процесс завершается.

Видишь эта примерная статья MSDN за некоторыми идеями о том, как вы могли бы использовать пространство общей памяти, чтобы захватить власть над миром.Э-э, интерфейс с устаревшим программным обеспечением.Или что угодно :) Удачи, чем бы вы в конечном итоге ни занимались!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top