Доступ к ячеки памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Доступ к ячеки памяти

Сообщение 13GHOST » 02.12.2004 (Чт) 11:10

Как получить доступ к опредиленной ячеки памяти с заданным адресом, например что-нибудь вроде 0000:044С. Читать и изменять её содержимое.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.12.2004 (Чт) 11:27

Эээ, батенька, а чё это во flat model сегменты? :)
А вообще, есть функции GetMem4 и PutMem4...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 02.12.2004 (Чт) 15:12

Чё эта за функции такие? Я их чё-та найти не мог. Мне вообще надо прогу по информатике написать, там надо чтоб программа меняла байт расположенный по опредиленному адресу

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.12.2004 (Чт) 15:44

Меня терзают смутные сомненья...

На чём пишем?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.12.2004 (Чт) 15:54

Видимо на BASIC :)

Обрати внимание на команды PEEK/POKE и DEF SEG.
Lasciate ogni speranza, voi ch'entrate.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 02.12.2004 (Чт) 17:27

На VB. PEEK/POKE тама нету.

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 02.12.2004 (Чт) 19:22

Вот код как сделать трайнер для игры, с какого-то сайта

Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAcess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAdress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddess As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWriten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const PROC = &HD5976EC
Dim V As Long

Private Sub Command1_Click() ' Объявляем некоторые необходимые моменты для кнопки
Dim hwnd As Long ' удерживает управление, переданное функцией Find Window
Dim pid As Long ' используется для хранения идентификатора процесса
Dim pHandle As Long ' держит управление процессом
' Ищем окно игры и, если игра не запущена, выдаем сообщение об ошибке
hwnd = FindWindow(vbNullString, "SimCity 4")
If hwnd = 0 Then
MsgBox "Process not found!!!"
Exit Sub
End If
' Теперь можно определить идентификатор процесса
GetWindowThreadProcessId hwnd, pid
' Используем этот идентификатор для получения управления процессом
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn 't get a process handle!"
Exit Sub
End If
WriteProcessMemory pHandle, PROC, "100", Len("100"), 0&
CloseHandle hProcess
End Sub

Private Sub Form_Load()
V = 100
End Sub

Private Sub Timer1_Timer()
' Объявляем некоторые необходимые моменты для таймера
Dim hwnd As Long ' удерживает управление, переданное функцией FindWindow
Dim pid As Long ' удерживает идентификатор процесса
Dim pHandle As Long ' удерживает управление процессом
Dim str As String * 20 ' параметр текстовой строки
' Вначале ищем окно игры
hwnd = FindWindow(vbNullString, "SimCity 4")
If (hwnd = 0) Then Exit Sub
' Теперь можно определить идентификатор процесса
GetWindowThreadProcessId hwnd, pid
' Используем идентификатор для управления процессом
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then Exit Sub
' Теперь можно прочитать из памяти...
ReadProcessMemory pHandle, PROC, str, 20, 0&
' ... и показать строку в текстовом поле трейнера
Text1 = Asc(str)
' Прекращаем управлять процессом
CloseHandle hProcess
End Sub


8)
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 03.12.2004 (Пт) 13:56

Я чё-та не догнал.

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 03.12.2004 (Пт) 15:03

Че не догнал-то? :D
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 03.12.2004 (Пт) 19:39

Я тут не вижу где вводится адрес ячейки и все такое?

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 03.12.2004 (Пт) 20:21

Const PROC = &HD5976EC в этой константе вписываешь адрес по, и там где-то название процесса, в котором изменяется память! 8)
Что-нибудь еще! :D
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 04.12.2004 (Сб) 7:58

&HD5976EC - это чё адрес ячейки? Это чё-та не похоже на шестнадцетиричную? А если мне надо 0000:044С ?

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 04.12.2004 (Сб) 10:14

Всё задание на все общее обозрение. А то какое то странное задание по информатике. :lol:

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 04.12.2004 (Сб) 10:33

В Visual Basic'е пишеш так &H0000044С И он тебе все сам преобразует 8)
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 04.12.2004 (Сб) 14:58

"ReadProcessMemory pHandle, PROC, str, 20, 0&" - указывает на переменную PROC и говорит Type Mismatch. Почему?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.12.2004 (Сб) 15:52

13GHOST писал(а):"ReadProcessMemory pHandle, PROC, str, 20, 0&" - указывает на переменную PROC и говорит Type Mismatch. Почему?

Так, что мы видим в MSDN:
Код: Выделить всё
BOOL ReadProcessMemory(
  HANDLE hProcess,              // handle to the process
  LPCVOID lpBaseAddress,        // base of memory area
  LPVOID lpBuffer,              // data buffer
  SIZE_T nSize,                 // number of bytes to read
  SIZE_T * lpNumberOfBytesRead  // number of bytes read
);

Второй параметр должен передаваться как указатель на нетипизированную константу (если я еще что-то помню). Соотв-но, вопросы: во-первых, покажь свою деклару этой функции, во-вторых, покажь свое объявление константы.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 04.12.2004 (Сб) 17:26

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddess As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWriten As Long) As Long 'функция

Const PROC = &H44C 'константа

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.12.2004 (Сб) 17:55

Так...
Попробуй сменить в объявлении второго параметра ByVal на ByRef, а во-вторых, константы в VB лучше все-таки объявлять типизированными: Public const PROC as Long = &H44C
Рекомендую начать со второго.

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 04.12.2004 (Сб) 17:59

Кстати, как это не обидно, но Си в этом деле намного сильнее.
А Asm вообще Forever. Если кто пишет, попробуйте записать чего-нибудь по адресу B800:0000(es:di).
Microsoft DirectX - Маломягкий Прямой Х...
Не откладывай на завтра то, что можно выпить сегодня...

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 04.12.2004 (Сб) 18:16

В этом деле (низкоуровневой доступ к памяти) - да. Зачем такое на VB - полностью высокоуровневом языке программирования - непонятно :).
Зато попробуй использовать "визуальный" конструктор диалоговых окон MFC в MSVC++ 6 - выглядит так, как будто Windows 3.11 только что вышла. MSVC++ 6 - системный язык, и зачем ему нормальная работа с управляющими элементами - непонятно :P
Моду создают модоки, а распространяют модозвоны.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 04.12.2004 (Сб) 19:48

Изменил, ошибок не стало, но результата никакого. Не читает.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.12.2004 (Сб) 20:49

Так, во-первых, получай возвращаемое значение:
MSDN писал(а):If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

The function fails if the requested read operation crosses into an area of the process that is inaccessible.

Только не забудь, что API-шный BOOL - 4 байта, а не 2, как VB-шный, так что подставляй ему Long.
Во-вторых, смотри свойство Err.LastDLLError - оно может чем-то помочь.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 05.12.2004 (Вс) 18:29

Ну я Long и подставлял - не выходит. А Err.LastDLLError = "" (ничего). ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 18:45

Zer писал(а):А Asm вообще Forever. Если кто пишет, попробуйте записать чего-нибудь по адресу B800:0000(es:di).

А зачем :?:

Тем более, и это в основном в адрес 13GHOST: в Win32 нет сегментов.
Попытка чтения с адреса 0000044C неизбежно приведёт к ошибке (или, в случае ReadProcessMemory - ни к чему вообще).

Полный текст задания - в студию :!: Уж или VB, или 0000:044C, но не одновременно.


А что пытаешься прочитать-то, кстати? Гугл говорит, что по этому адресу лежит "size of video buffer in bytes". Ну и зачем тебе он?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 18:50

Ennor писал(а):константы в VB лучше все-таки объявлять типизированными: Public const PROC as Long = &H44C

Тип константы автоматически подбирается под содержимое.
В данном случае, более коротким и совершенно эквивалентным будет объявление "Public Сonst PROC = &H44C&"
Изображение

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 06.12.2004 (Пн) 9:32

Ну там надо разные программы: одна из них например должна менять размер курсора в досе другая читает Scan код клавиши, а 0000:044С - это я так просто сказал. Мне гланое надо узнать по какому принцыпу осуществляется низкоуровневый доступ к памяти из VB?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.12.2004 (Пн) 13:29

13GHOST писал(а):...
Мне гланое надо узнать по какому принцыпу осуществляется низкоуровневый доступ к памяти...

...Только не из VB, а из Win32API, ибо в басике встроенных средств для такого изврата нет.

2 tyomitch: Спасибо, я в свое время этого автоматизма наелся так, что больше уже не лезет. Кроме того, я не люблю использовать амперсанд и ему подобные как ID типа - менее читабельно...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.12.2004 (Пн) 18:19

Ennor писал(а):
13GHOST писал(а):...
Мне гланое надо узнать по какому принцыпу осуществляется низкоуровневый доступ к памяти...

...Только не из VB, а из Win32API, ибо в басике встроенных средств для такого изврата нет.

2 13GHOST: И что самое главное, в Win32 нет сегментов, и с адреса 0000:044С ничего прочитать невозможно, равно как и с 0000044C. Если тебе задали писать две досовские проги, то при чём же здесь VB?
Изображение

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 06.12.2004 (Пн) 19:53

Мне задали написать на каком угодно языке, но я только VB знаю. Мы вообще пока программирование не проходили, но если я напишу он мне автомат поставит :)).

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.12.2004 (Пн) 20:27

Напиши на кубейсике, раз надо под дос.
На VB под дос не напишешь :-)
Изображение

След.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 174

    TopList