ОЗУ

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Left Behind
Сообщения: 2
Зарегистрирован: 28 окт 2005, 19:02

Проблема, точнее задача:

1) Есть чужой процесс (например - игра)
2) У меня есть адресс в ОЗУ какойто переменной из этой игры (например 001A6469 , полученое с АртМонеи)

3) Как мне, в моей программе прочитать/записать туда своё значение!?

***

+) Есть Handle на нужный мне процесс,
+) ReadProcessMemory() Постоянно return FALSE!

Код: Выделить всё

BOOL ReadProcessMemory(
  HANDLE hProcess,
  LPCVOID lpBaseAddress,
  LPVOID lpBuffer,
  SIZE_T nSize,
  SIZE_T* lpNumberOfBytesRead
) ;
Мне еще не ясно, откуда можно получить lpBaseAddress ( Pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access. If this is the case, the function proceeds; otherwise, the function fails.)

Мне кажется что ето изза доступа он постоянно return FALSE, там он часто упоминается, в таком случая я смотрел:

Код: Выделить всё

BOOL VirtualProtectEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD flNewProtect,
  PDWORD lpflOldProtect
);
 
Тутже возникает вопрос, откуда получить lpAddress ?!

PS Я уже перерыл гигабайты MSDN с 2001-2005 года, мне реально необходива ваш совет.

Заранее благодарен.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

[quote="Left Behind"] Pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access. If this is the case, the function proceeds]

Указатель на базовый (предполагаю физический без оффсета) адрес заданного процесса из которого можно читать.
Перед тем, как произойдёт любая передача информации система проверяет, специфицирован ли базовый адрес и память на доступ к чтению .
Если доступ разрешён - продолжается выполнение функции, иначе функция прерывается.


Я не гуру в Си и операционных системах,
но могу предположить, что операционная система не даст тебе так просто доступа.
Left Behind
Сообщения: 2
Зарегистрирован: 28 окт 2005, 19:02

Знаеш АртМонеи программку, ей же даёт.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Не надо гадать, в чем причина ошибки - посмотри, что возвращает GetLastError().
Дальше возможны варианты:
1) Не хватает прав на чтение из данного процесса.
Что делать: используй флаг PROCESS_VM_READ в OpenProcess.
2) lpBaseAddress невалиден в контексте данного процесса.
Что делать: задай валидный lpBaseAddress :)
Пояснение: не все адреса в виртуальном адресном простанстве процесса (ВАП) допустимы, а именно, валидны только диапазоны адресов, куда загружены модули процесса (exe и dll).
3) lpBaseAddress валиден, но из данного участка памяти нельзя читать.
Что делать: измени права доступа к данному диапазону ВАП с помощью VirtualProtectEx - собственно, что ты и пытался сделать.
Пояснение: функция VirtualQueryEx выдает информацию о заданном диапазоне адресов (включая базовый адрес и права доступа).
Ответить