Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать значение из оперативки, ID процесса известен, адрес тоже. 
:(
    Опции темы
Kluyg
Дата 8.1.2005, 12:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите плиз, очень нужно реализовать функцию чтения значения из определенной ячейки памяти на языке Delphi. Например PID 248, адрес 00F3B333. Как оттуда прочитать значение??
Заранее спасибо
  Вверх
dm9
Дата 8.1.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



PM MAIL ICQ   Вверх
p0s0l
Дата 8.1.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Перенесенно из раздела Delphi


--------------------
С уважением, г-н Посол.
PM   Вверх
Guest
Дата 8.1.2005, 17:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Во-первых спасибо за оперативный ответ smile
Во-вторых возникло пару вопросов...
Код

hProcess := OpenProcess (PROCESS_VM_WRITE or PROCESS_VM_OPERATION, False, ProcessID);
WriteProcessMemory (hProcess, Pointer(Адрес в чужом процесса), Pointer(Адрес записываемых данных), <Число записываемых байт>, WrittenBytes);
CloseHandle (hProcess);


1) А нельзя поподробней о функции OpenProcess (ну о параметрах возможных).
2) Мне не писать а читать нужно... ReadProcessMemory я полагаю тоже существует? Какие там пораметры?
3) Только не смейтесь... hProcess - это что?smile Ну всмысле тип какой?
  Вверх
Kluyg
Дата 8.1.2005, 17:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Reads data from the process.

Delphi syntax:

function ReadProcessMemory(Address: LongWord; Count: Integer; var Buffer): Integer;

Description

ReadProcessMemory reads data from an arbitrary address in the process’s memory.

The Address parameter specifies the starting address to read.

The Count parameter specifies the number of bytes to read.

The Buffer parameter specifies the starting location where the data are to be stored.

The return value is the number of bytes successfully read. Note that the return value is always the same as Count because if the read fails, the IDE throws an EDbkError exception.

Это я сам себе ответил smile
  Вверх
Kluyg
Дата 8.1.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.1.2005

Репутация: нет
Всего: нет



Итак я поразбирался и вопросы 2) и 3) снимаются smile
Так как мои знания Дельфи и строения ПК пока далеки от идеала то у меня появился вопрос по поводу Буфера. Это, я так понял, указатель на какую-то область памяти? Вообщем вопрос такой: как мне с помощью ReadProcessMemory получить массив со значениями собственно?
З.Ы. Сори за флуд. Поторопился я что-то.
PM MAIL   Вверх
dm9
Дата 8.1.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



Цитата(Kluyg @ 8.1.2005, 17:41)
var Buffer


При такой записи это просто набор байт.

Если памяти много не надо, можно просто объявить массив.

Код
var Buffer : packed array [0..9] of Byte;


Использование - ReadProcessMemory (..., Buffer);

Если памяти надо больше, выделять её лучше динамически.

Код
type
  TBuf = packed array [0..$7FFFFFFE] of Byte;
  PBuf = ^TBuf;
var
  Buffer : PBuf;
  Size : Integer;
begin
  GetMem (Buffer, Size);
  ...
  ReadProcessMemory (..., Buffer^); //Тут уже сама переменная Buffer - указатель, поэтому используем её по-другому.
  ...
  //Читать так:
  a := Buffer[0];
  //Или так:
  a := Buffer^[0];
  FreeMem (Buffer, Size);
end;


Я сам этим никогда не занимался, но у меня по Ctrl + клик по ф-ции выдаётся такое описание ReadProcessMemory:

Код
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
  nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;


Тут lpBuffer - Pointer;
В этом случае также выделаешь память GetMem-ом, но передаёшь в ф-цию сам указатель, просто Buffer (не Buffer^).

Это сообщение отредактировал(а) dm9 - 8.1.2005, 20:06
PM MAIL ICQ   Вверх
Kluyg
Дата 8.1.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.1.2005

Репутация: нет
Всего: нет



Не работает smile(
вот код, который я использую:

Код

type

  TBuf = packed array [0..$7FFFFFFE] of Byte;
  PBuf = ^TBuf;

var
ProcessID, hProcess, WritenByte,BR: Cardinal;
Buffer : PBuf;
Size : Integer;
a:byte;
i:integer;

begin
GetMem (Buffer, Size);
...
 ProcessID:= GetIDProcess('MUDClient.exe'); {работает правильно - проверял}
 hProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, False, ProcessID);
 readprocessmemory(hProcess,Pointer($00F3B333),Buffer,2,BR); {Почемуто BR - 0, я в раздумьях}
 for i:=1 to 5 do
 begin
 a := buffer[i]; {а - все время ноль}
  FreeMem (Buffer, Size);
end;



Что-то я ничего не понимаю...
PM MAIL   Вверх
dm9
Дата 8.1.2005, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



Ты Size-то где задаёшь?
Добавлено @ 22:18
Вначале Size := 2
Добавлено @ 22:18
То есть Size - это размер памяти, которую надо выделить.
PM MAIL ICQ   Вверх
Kluyg
Дата 8.1.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.1.2005

Репутация: нет
Всего: нет



Упс у меня ПИД - cardinal. А там надо Dword. Может тут ошибка?
Добавлено @ 22:35
Нет не тут smile (проверил)
PM MAIL   Вверх
dm9
Дата 8.1.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



PROCESS_VM_WRITE -> PROCESS_VM_READ
Добавлено @ 22:36
smile
PM MAIL ICQ   Вверх
Kluyg
Дата 8.1.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.1.2005

Репутация: нет
Всего: нет



Цитата

Ты Size-то где задаёшь?
Добавлено @ 22:18
Вначале Size := 2
Добавлено @ 22:18
То есть Size - это размер памяти, которую надо выделить.

smile Щас попробую. Но помойму проблема не в этом - пробовал другими способами (без getmem) - то же самое.
Добавлено @ 22:37
Цитата
PROCESS_VM_WRITE -> PROCESS_VM_READ
Добавлено @ 22:36
smile

???
PM MAIL   Вверх
dm9
Дата 8.1.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



Или, наверное, сразу можно PROCESS_ALL_ACCESS
Добавлено @ 22:39
Цитата(Kluyg @ 8.1.2005, 22:36)
???


Ты на запись открываешь, а пытаешься читать!
Укажи вместо PROCESS_VM_WRITE PROCESS_VM_READ, или попробуй указать 1-м параметром OpenProcess PROCESS_ALL_ACCESS.

Это сообщение отредактировал(а) dm9 - 8.1.2005, 22:40
PM MAIL ICQ   Вверх
Kluyg
Дата 8.1.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.1.2005

Репутация: нет
Всего: нет



Тьфу блин!!! Получилось!!! ПАСИБО ОГРОМНОЕ!! smile)) Пойду спать smile
PM MAIL   Вверх
dm9
Дата 8.1.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



Это хорошо, что получилось smile
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.