Получить значение из фиксированного смещения памяти: Visual C ++ Programming - PullRequest
0 голосов
/ 07 января 2009

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

Допустим, я уже знаю идентификатор процесса и хотел бы получать значение в памяти этого процесса всегда из фиксированного смещения (например, 0x523F1C), это выполнимо в пользовательском режиме или в ядре -mode

Любые советы или информация высоко ценятся.

Моя среда - Windows XP, и я использую Visual C ++ и Qt для графического интерфейса.

Заранее спасибо:)

EDIT:

(а) спасибо, ребята. в основном это работает (при установке точки останова и перехватывании значения это правильно), но при выполнении нормальной сборки выпуска полученное значение всегда инициализируется: (

придется больше работать, чтобы понять это ...

(b) Поскольку приложение, которое я пытаюсь получить, не написано мной, могу ли я по-прежнему использовать методы межпроцессного взаимодействия / совместной памяти?

РЕДАКТИРОВАТЬ 2:

еще раз спасибо за быстрый ответ! : D

Ответы [ 3 ]

5 голосов
/ 07 января 2009

Используйте ReadProcessMemory - вам понадобится дескриптор с доступом PROCESS_VM_READ к другому процессу [1], но если вы администратор (или, возможно, у вас есть привилегии SE_DEBUG), это должно быть просто.

BOOL WINAPI ReadProcessMemory(
  __in   HANDLE hProcess,
  __in   LPCVOID lpBaseAddress,
  __out  LPVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T* lpNumberOfBytesRead
);

[1]

HANDLE hProc = OpenProcess(PROCESS_VM_READ, false, pid);

Редактировать: b) Нет, если только вы не используете CreateRemoteThread - но обычно вам нужно добавить свою DLL в удаленный процесс, прежде чем вы сможете осмысленно создавать потоки в этом процессе. Это продвинутый, веселый и опасный:)

1 голос
/ 07 января 2009

Если вы осуществляете межпроцессное взаимодействие / разделяемую память, я бы предложил вместо этого использовать Boost :: Interprocess , поскольку это значительно облегчит жизнь.

0 голосов
/ 07 января 2009

Существует функция ReadProcessMemory () , но вам необходимо найти требования для ее использования самостоятельно. Я думаю, что вам, возможно, потребуется установить себя в качестве отладчика для этого процесса.

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