![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Kluyg |
|
|||
Unregistered |
Помогите плиз, очень нужно реализовать функцию чтения значения из определенной ячейки памяти на языке Delphi. Например PID 248, адрес 00F3B333. Как оттуда прочитать значение??
Заранее спасибо |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
||||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Перенесенно из раздела Delphi
-------------------- С уважением, г-н Посол. |
|||
|
||||
Guest |
|
|||
Unregistered |
Во-первых спасибо за оперативный ответ
![]() Во-вторых возникло пару вопросов...
1) А нельзя поподробней о функции OpenProcess (ну о параметрах возможных). 2) Мне не писать а читать нужно... ReadProcessMemory я полагаю тоже существует? Какие там пораметры? 3) Только не смейтесь... hProcess - это что? ![]() |
|||
|
||||
Kluyg |
|
|||
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. Это я сам себе ответил ![]() |
|||
|
||||
Kluyg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.1.2005 Репутация: нет Всего: нет |
Итак я поразбирался и вопросы 2) и 3) снимаются
![]() Так как мои знания Дельфи и строения ПК пока далеки от идеала то у меня появился вопрос по поводу Буфера. Это, я так понял, указатель на какую-то область памяти? Вообщем вопрос такой: как мне с помощью ReadProcessMemory получить массив со значениями собственно? З.Ы. Сори за флуд. Поторопился я что-то. |
|||
|
||||
dm9 |
|
||||||||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
При такой записи это просто набор байт. Если памяти много не надо, можно просто объявить массив.
Использование - ReadProcessMemory (..., Buffer); Если памяти надо больше, выделять её лучше динамически.
Я сам этим никогда не занимался, но у меня по Ctrl + клик по ф-ции выдаётся такое описание ReadProcessMemory:
Тут lpBuffer - Pointer; В этом случае также выделаешь память GetMem-ом, но передаёшь в ф-цию сам указатель, просто Buffer (не Buffer^). Это сообщение отредактировал(а) dm9 - 8.1.2005, 20:06 |
||||||||
|
|||||||||
Kluyg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.1.2005 Репутация: нет Всего: нет |
Не работает
![]() вот код, который я использую:
Что-то я ничего не понимаю... |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Ты Size-то где задаёшь?
Добавлено @ 22:18 Вначале Size := 2 Добавлено @ 22:18 То есть Size - это размер памяти, которую надо выделить. |
|||
|
||||
Kluyg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.1.2005 Репутация: нет Всего: нет |
Упс у меня ПИД - cardinal. А там надо Dword. Может тут ошибка?
Добавлено @ 22:35 Нет не тут ![]() |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
PROCESS_VM_WRITE -> PROCESS_VM_READ
Добавлено @ 22:36 ![]() |
|||
|
||||
Kluyg |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.1.2005 Репутация: нет Всего: нет |
![]() Добавлено @ 22:37
??? |
||||
|
|||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Или, наверное, сразу можно PROCESS_ALL_ACCESS
Добавлено @ 22:39
Ты на запись открываешь, а пытаешься читать! Укажи вместо PROCESS_VM_WRITE PROCESS_VM_READ, или попробуй указать 1-м параметром OpenProcess PROCESS_ALL_ACCESS. Это сообщение отредактировал(а) dm9 - 8.1.2005, 22:40 |
|||
|
||||
Kluyg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.1.2005 Репутация: нет Всего: нет |
Тьфу блин!!! Получилось!!! ПАСИБО ОГРОМНОЕ!!
![]() ![]() |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Это хорошо, что получилось
![]() |
|||
|
||||
MSergey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.3.2005 Репутация: нет Всего: нет |
Я тут попробывал эту функцию, работает, но медленно
Допустим мне надо просканировать память и найти определенные значения for i := $0046DEB1 to $01FFFFFF do begin ReadProcessMemory(hProcess, Pointer(i), buffer, 4, BR); a := buffer[0]; На это уходит порядка 10 минут, есть программы, например ArtMoney которые туже операцию выполняют в считанные секунды. Может кто нибудь знает как ускорить выполнение такой процедуры? |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Попробуй сначала всё прочитать в буфер, а потом выполнять поиск по этому буферу.
|
|||
|
||||
MSergey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.3.2005 Репутация: нет Всего: нет |
Я с оперативкой еще не работал, поэтому до меня так и не дошло как скопировать ее в буфер.
|
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Копируй информацию не по байтику (ну, не по 4 байта), а сразу большими блоками, затем по этим блокам ищи нужную информацию. Думаю, так будет быстрее. Лучше один раз запросить данные и получить их, а затем ползать по этим данным, чем тысячу раз вызывать функцию.
|
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
1. Буфер для чтения... надо больше использовать 2. наХ весь диапозон сканить? http://forum.vingrad.ru/index.php?showtopi...ndpost&p=274736 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |