Как вы можете получить доступ к памяти другого процесса и вызвать его функции? - PullRequest
6 голосов
/ 24 октября 2010

Я хочу научиться читать память других процессов и заставить мою программу вызывать функции других процессов, а не мои собственные параметры и прочее.Я прогуглил это, и кажется, что вам нужно использовать такие вещи, как ReadProcessMemory, но я не смог найти ни одного хорошего учебника, объясняющего, как их использовать.Может ли кто-нибудь указать мне правильное направление, чтобы узнать такие вещи?Я хочу сделать это в C ++ (или Java, если это возможно) в Windows (7 и 64 бит, если это имеет значение).

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

Ответы [ 3 ]

7 голосов
/ 24 октября 2010

Вы не можете напрямую вызывать функции в других процессах, потому что ваш процесс и другой процесс имеют разные адресные пространства. Один из способов обойти это - создать в процессе удаленный поток (используя CreateRemoteThread или RtlCreateUserThread), но это позволяет передать только один параметр функции. Вы можете попробовать создать удаленный поток, записать параметры в его стек и изменить его регистры, используя SetThreadContext. Другой способ - добавить собственную DLL, которая вызывает функцию.

Другая проблема связана с поиском функции для вызова. Возможно, вам понадобится загрузить символы для EXE или DLL, где нужная функция не экспортируется.

По общим вопросам, связанным с внутренними компонентами Windows, попробуйте задать вопрос на Форумы Sysinternals .

РЕДАКТИРОВАТЬ: то, что вы указали (читая строку, которую процесс проверяет на ввод пользователя), очень трудно сделать в программе, не зная заранее расположение инструкций и данных в файле изображения. Если, например, у вас есть программа crackme, вы должны либо использовать инструмент статического анализа, такой как IDA Pro, либо запустить программу под отладчиком. В любом случае, эти вещи обычно требуют участия человека, и их трудно сделать автоматически.

1 голос
/ 24 октября 2010

Процессы по конструкции и по определению изолированы друг от друга. У них отдельное адресное пространство.

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

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

Однако потоки , иногда называемые облегченными процессами, совместно используют свое адресное пространство и могут читать структуры данных друг друга.

Не уверен, что вы имели в виду под

вызывать функции других процессов

Функция f() может быть скомпилирована в исполняемый код нескольких процессов. Процесс A и процесс B могут независимо вызывать f() в своем контексте.

В противном случае процесс A может «связаться» с процессом B для выполнения какого-либо действия, которое, например, может быть реализовано в функции g() в B. B может выполнить его в своем контексте и «передать» результат обратно A.

0 голосов
/ 24 октября 2010

Я не вижу никакой пользы от этого, но все равно. Есть как минимум два способа заставить другой процесс вызывать что-то:

1) CreateRemoteThread(), создаст поток в процессе.

2) QueueUserAPC() заставит существующий поток в этом процессе вызвать функцию обратного вызова.

Если ASLR отключен, то достаточно вызвать функцию без параметров. Иначе вам также понадобятся VirtualQueryEx(), ReadProcessMemory() и WriteProcessMemory().

Да, и это не то, что делать в Java :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...