Я хотел бы написать простое приложение, способное извлекать определенные данные из выделенной памяти другого процесса (приложения).
Скажем, я уже знаю идентификатор процесса и хотел бы всегда получать значение в памяти этого процесса из фиксированного смещения (например, 0x523F1C), возможно ли это в пользовательском режиме или это должно быть в режиме ядра?
Любые подсказки или информация приветствуются.
Моя среда - Windows XP, и я использую Visual C++ и Qt для графического интерфейса.
Заранее спасибо :)
Обновлено:
(а) спасибо, ребята. в основном он работает (при установке точки останова и перехвате правильного значения), но при выполнении нормальной сборки выпуска полученное значение всегда инициализировано :(
придется еще поработать, чтобы разобраться ...
(b) Поскольку приложение, из которого я пытаюсь получить значение, написано не мной, могу ли я по-прежнему использовать методы межпроцессного взаимодействия / общей памяти?
Обновлено еще раз:
еще раз спасибо за быстрый ответ! : D





Есть функция ReadProcessMemory (), но вам придется найти требования для ее использования самостоятельно. Я думаю, вам может потребоваться отладчик этого процесса.
Используйте 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);
Обновлено: б) Нет, если вы не используете CreateRemoteThread, но обычно вам нужно встроить свою собственную DLL в удаленный процесс, прежде чем вы сможете осмысленно создавать потоки в этом процессе. Это продвинуто, весело и опасно :)
Если вы выполняете межпроцессное взаимодействие / разделяемую память, я бы предложил вместо этого использовать Boost :: Interprocess, так как это значительно упростит жизнь.