Вопрос по ReadProcessMemory

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Вопрос по ReadProcessMemory

Сообщение Ruslan2000 » 24.04.2009 (Пт) 0:51

Привет всем. Хотел спросить совета у людей которые сталкивались с винапи ReadProcessMemory. Проблемма заключается в том, что при использовании в качестве буфера чтения числовых переменных функция неработает.

При следуюших определениях:

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

dim r_adress as long
dim r_buffer as string
dim butes_to_read as long
dim lwritten as long

r_buffer="1111"
butes_to_read=4

result = ReadProcessMemory(hProcess, ByVal r_adress, ByVal r_buffer, butes_to_read, lWritten)

все байты считываются правильно и result=1.

Но если определить r_buffer as long или любой другой числовой формат. То функция не работает и возвращает ошибку.
Существует ли возможность обеспечить считывания нескольких байт числа в числовую переменную?
Как вариант - можно пригласить попа, освятить комп, вдруг это демоны?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Вопрос по ReadProcessMemory

Сообщение iGrok » 24.04.2009 (Пт) 1:01

Ruslan2000 писал(а):result = ReadProcessMemory(hProcess, ByVal r_adress, ByVal r_buffer, butes_to_read, lWritten)

На вскидку. Не уверен, но всё же попробуй:
Если объявляешь r_buffer As Long, то в вызове ф-ции убери ByVal перед r_buffer.
Т.е. result = ReadProcessMemory(hProcess, ByVal r_adress, r_buffer, butes_to_read, lWritten)
label:
cli
jmp label

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Вопрос по ReadProcessMemory

Сообщение Xcode » 24.04.2009 (Пт) 4:42

Ruslan2000 писал(а):Проблемма заключается в том, что при использовании в качестве буфера чтения числовых переменных функция неработает.

Брехня. Функция работает.

Ruslan2000 писал(а):При следуюших определениях:

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

result = ReadProcessMemory(hProcess, ByVal r_adress, ByVal r_buffer, butes_to_read, lWritten)


Сначала идем сюда и вникаем: http://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx
Теперь смотрим что мы имеем:
Если явно не указывать в объявлении функции способ передачи параметров, то по умолчанию используется ByRef. Из MSDN ясно, что передавать надо именно указатель, значит тут все нормально. Но с чего вдруг у нас указатели стали типа Any? Это не логично, с моей точки зрения, используй Long.
Теперь смотрим на сам вызов. Вот тут то и ошибка, судя по всему полное непонимание происходящего, функция ждет от нас указатель, а мы насильно передаем ей значение, последсвия непредсказуемые.

Вот пример чтения a в b
Код: Выделить всё
Dim a As Long
Dim b As Long
a = 321
ret = ReadProcessMemory(hp, a, b, 4, 0&)


В твоем случае, если ты хочешь передвать уже известный адрес, то да, вызывай так:
result = ReadProcessMemory(hProcess, ByVal r_adress, r_buffer, butes_to_read, lWritten)

Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Re: Вопрос по ReadProcessMemory

Сообщение Ruslan2000 » 25.04.2009 (Сб) 1:07

спс, помогло
Код: Выделить всё
result = ReadProcessMemory(hProcess, ByVal r_adress, r_buffer, butes_to_read, lWritten).


Вероятно логичность Any заключается в том что в дальнейшем можно использовать и строковые и числовые переменные в качестве буфера чтения. Полюбому с
Код: Выделить всё
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
все прекрасно работает.
Как вариант - можно пригласить попа, освятить комп, вдруг это демоны?

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Вопрос по ReadProcessMemory

Сообщение Xcode » 25.04.2009 (Сб) 4:19

Ruslan2000 писал(а):Вероятно логичность Any заключается в том что в дальнейшем можно использовать и строковые и числовые переменные в качестве буфера чтения.

Дубль два, читаем MSDN, в котором ясно написанно:
lpBuffer [out] pointer to a buffer that receives the contents from the address space of the specified process.

Функции нужен указатель на буфер, в котороый она и прочитает блок памяти, причем ей абсолютно пофигу что эта последовательность байт будет для тебя значить .

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Вопрос по ReadProcessMemory

Сообщение iGrok » 25.04.2009 (Сб) 10:54

Ruslan2000 писал(а):Вероятно логичность Any заключается в том что в дальнейшем можно использовать и строковые и числовые переменные в качестве буфера чтения.

Если точнее, объявление As Any позволяет подсунуть туда указатель на переменную любого типа. Самой функции вообще пофигу, что это будет. Если главное - валидный указатель. А вот для компилятора это важно.
label:
cli
jmp label

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Вопрос по ReadProcessMemory

Сообщение Xcode » 25.04.2009 (Сб) 16:06

iGrok писал(а):Если точнее, объявление As Any позволяет подсунуть туда указатель на переменную любого типа. Самой функции вообще пофигу, что это будет.

Не морочьте голову, используйте varptr/strptr и передавайте ByVal. Так оно правильней.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Вопрос по ReadProcessMemory

Сообщение iGrok » 25.04.2009 (Сб) 17:53

Xcode писал(а):Так оно правильней.

Не спорю.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по ReadProcessMemory

Сообщение Хакер » 26.04.2009 (Вс) 13:58

Не совсем.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Вопрос по ReadProcessMemory

Сообщение Xcode » 26.04.2009 (Вс) 14:28

Хакер писал(а):Не совсем.

Ну так поясни, пожалуйста, в чем заключается "не совсем"?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по ReadProcessMemory

Сообщение Хакер » 26.04.2009 (Вс) 14:54

В лишнем вызове функции, ничего не делающей, просто возвращающей то же самое число, которое ей передали. Не более.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList  
cron