Как оределить адрес памяти для конкретного приложения.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Как оределить адрес памяти для конкретного приложения.

Сообщение zafon » 20.02.2006 (Пн) 9:41

Есть код который читает 4-ёх байтовое число с определённого адреса в памяти т.е.

Запускается "чужая" программа с которой нужно прочесть определённый адрес
памяти . (Адрес заранее нахобится при помощи программы t-Search.)
Но при запуске этой программы на другом компе адрес меняется. И нужно вручную искать арес для данного компа.

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

Const PROCESS_ALL_ACCESS = &HF0000 Or &H100000 Or &HFFF

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 OpenProcess Lib "kernel32" (ByVal dwDesiredAcess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function  CloseHandle Lib "kernel32" (ByVal hPass As Long)

Private Sub Read_Address()
Dim hwind As Long
Dim pid As Long
Dim pHandle As Long
Dim str As Long
Dim Adr As Long

Adr = "&H53DD110"
hwind = FindWindow(vbNullString, "Заголовок Окна")

If (hwind = 0) Then
MsgBox "Not Found"
Exit Sub
End If

GetWindowThreadProcessId hwind, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0&, pid)

If (pHandle = 0) Then Exit Sub
End If

ReadProcessMemory pHandle, Adr, VarPtr(str), 4, 0&
MsgBox  str
CloseHandle hProcess

End Sub


Нашел одинаковое значение адреса памяти типа - 0х402EE1
Пытался его заменить вместо &H53DD110 ничего ... читает не то...

Подскажите как можно использовать адрес типа 0х402EE1 или как можно определить "смещение" нужного адреса на другом компе...
ООчень нужно...
Заранее благодарен Всем !!!

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

Сообщение GSerg » 20.02.2006 (Пн) 9:46

Нды... Самобытно...

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

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 20.02.2006 (Пн) 16:53

Ты никогда не задавался вопросом, что в твоём случае получает RPM вторым параметром?


Объясни что такое RPM потому что я никогда до недавнего времени не сталкивался с чтением адресов памяти . Поэтому можно сказать что я в этом "Чайник".

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

Сообщение GSerg » 20.02.2006 (Пн) 16:55

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

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 20.02.2006 (Пн) 18:08

ReadProcessMemory - я думал его использовать но поискав в инете ненащел применение етой функции без dll .
Т.Е. Нашёл примеры только для оьращения к библиотеке.
И как его вообще использовать в моем случае без понятия....
И Чё за первый параметр в описании - модуль!!!??? Че туда писать...???

Помоги пожалуйста...
Я же говорю что совсем недавно (4-дня назад ) начал вникать в работу VB с памятью ....

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

Сообщение GSerg » 20.02.2006 (Пн) 18:14

Блин, это неявное преобразование, чтоб его... adr-таки as long... но = "&H53DD110" - это нды...

Код: Выделить всё
Adr = &h402EE1&


После чего (да, пользоваться поиском на этом форуме обязательно) http://bbs.vbstreets.ru/viewtopic.php?t=13672
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 20.02.2006 (Пн) 21:47

Огромное спасибо за подсказку.
Но этот пример показыват как можно при каждом запуске приложения
просканировать память на наличие раритетного значения к примеру надпись на кнопке.
Как быть если мне нужно найти значение в памяти которое изменяется с 1 на 0 , таких значений может быть тысячи ..
Каждый раз сканировать неразумно заране зная адрес в памяти
Изменив адрес "&H53DD110" на &h402EE1& получат неверный результат.
При сканировании памяти с помощью t-Search я обнаружил что эта програма пишет "DataBreackPoint at: 0x402EE1" Что это ?

Ну тыкните меня носом , три часа ломал голову над примером и некак не смог разобраться как можно его применить в моём случае. :oops:

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.02.2006 (Пн) 22:19

на наличие раритетного значения к примеру
Раритетного это типа очень старого?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 20.02.2006 (Пн) 22:38

Неверно выразился - "уникального" значения. Типа - единственого и не существующего в другом адресе памяти.

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 21.02.2006 (Вт) 0:57

Нет проблем с кодом когда я явно указываю адрес заранее найденый при помощи специальной програмы .
Проблема возникает на другом компьютере при прочтении данного адреса в памяти данные которые я получаю они неверные.
При поиске правельного адреса он оказывается другим.
&H53DD110 становится &H17DD110 а на третем компе совершенно другой.

Код: Выделить всё
ReadProcessMemory pHandle, lpBaseAddress, VarPtr(str), 4, 0&


Как определить этот lpBaseAddress на другом компе используя 53DD110
Или как правельно использовать адрес записаный в виде 0x402EE1
И как понять вот это :
Код: Выделить всё
Data BreakPoint at : 0x43C52F  8910  mov [eax],edx

0x43C52F я проверил на всех машинах одинаково
я понимаю что это Ассемблер и я от него оочень далёк...

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

Сообщение GSerg » 21.02.2006 (Вт) 6:34

Значит во-первых.
0x402EE1 и 0x43C52F - VA с основанием 0x400000. 0x400000 - ImageBase, место, куда загружается exe. В VB это App.hInstance.
ImageBase может быть иным, если в exe присутствует секция .reloc. ImageBase не может быть иным, если секции .reloc нет.

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

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 21.02.2006 (Вт) 8:29

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

Или я ошибаюсь и есть какието "подводные камни" ???

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 21.02.2006 (Вт) 13:13

"подводные камни"
Да, они имеют место быть
если программа использует динамическое выделение памяти
А я все практикую лечение травами...

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 21.02.2006 (Вт) 16:53

Это значит простым языком говоря что дапустим сегодня программа
у которой "старт адрес" к примеру - 40000 и максимальный адрес (После запуска программы) к примеру - 80000 и искомое значение находится по адресу 50000 , оно (искомое значение) может находится за пределами максимального адреса или здвигается сам максимальный адрес.

(Я повторюсь - с этим не сталкивался, а профи для которых это как семечки лутше любой книги могут объяснить . Да и найти книгу "Работа с памятью средствами Visual Basic " здесь (в Израиле) практически невозможно )

Просто пример:
Дапустим запускаем приложение , запускаем нашу программу которая будет читать значения с памяти , получаем 'hwnd' приложения и т.д.
Затем в этом приложении есть к примеру "лэйбл" на котором выводится число от 0 до 100 (в зависимости от работы этой проги , т.е. постоянно меняется ) Адрес по которому будет находися значение , которое выводится на "лэйбле" МОЖЕТ ПОСТОЯННО МЕНЯТЬСЯ !!!???

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

Сообщение GSerg » 21.02.2006 (Вт) 16:59

Адрес значения - будет.
Адрес хранения указателя на это значение - нет.

В общем случае нельзя сказать, каков уровень косвенности. Для каждого конкретного приложения сказать можно.

Предположим конструкция:
dim h as long
h = GlobalAlloc(...)

Неизвестно, что хранится в h. Но где хранится само h, известно - в смысле, фиксированно. Если ты нашёл, где в программе хранится адрес, по которому лежат данные, то скорее всего он будет храниться там же всегда.
То есть тебе не надо искать данные. Тебе надо найти, где в программе хранится адрес данных.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 21.02.2006 (Вт) 17:13

Т. е. просто каждый раз нужно находить старт адрес программы ???

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 22.02.2006 (Ср) 0:06

Да сказать легко а на практике не получается ...

Как найти начальный и конечный адрес процесса ???

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

Option Explicit

Private Type MEMORY_BASIC_INFORMATION ' 28 bytes
    BaseAddress As Long
    AllocationBase As Long
    AllocationProtect As Long
    RegionSize As Long
    State As Long
    Protect As Long
    lType As Long
End Type

Private Type SYSTEM_INFO ' 36 Bytes
    dwOemID As Long
    dwPageSize As Long
    lpMinimumApplicationAddress As Long
    lpMaximumApplicationAddress As Long
    dwActiveProcessorMask As Long
    dwNumberOrfProcessors As Long
    dwProcessorType As Long
    dwAllocationGranularity As Long
    wProcessorLevel As Integer
    wProcessorRevision As Integer
End Type


Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
Private Declare Function VirtualQueryEx& Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long)
Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
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
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long

Const PROCESS_VM_READ = (&H10)
Const PROCESS_VM_WRITE = (&H20)
Const PROCESS_VM_OPERATION = (&H8)
Const PROCESS_QUERY_INFORMATION = (&H400)
Const PROCESS_READ_WRITE_QUERY = PROCESS_VM_READ + PROCESS_VM_WRITE + PROCESS_VM_OPERATION + PROCESS_QUERY_INFORMATION
Const MEM_PRIVATE& = &H20000
Const MEM_COMMIT& = &H1000
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2

Dim CurrWnd As String
Dim ListItem As String
Dim Length As String
Dim hwind As Long
Dim pid As Long, hProcess As Long
Dim lpMem As Long, ret As Long, lLenMBI As Long
Dim lWritten As Long, CalcAddress As Long, lPos As Long
Dim si As SYSTEM_INFO
Dim mbi As MEMORY_BASIC_INFORMATION


Sub GetTaskList()
  CurrWnd = GetWindow(Me.hWnd, GW_HWNDFIRST)
  Do While CurrWnd <> 0
    Length = GetWindowTextLength(CurrWnd)
    ListItem = Space(Length + 1)
    Length = GetWindowText(CurrWnd, ListItem, Length + 1)
    If Length > 0 Then
      Combo1.AddItem ListItem
    End If
    CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
    DoEvents
  Loop
End Sub

Private Sub Combo1_Change()
hwind = FindWindow(vbNullString, Combo1.Text)
Label1.Caption = "hWnd : " & hwind
Address
End Sub

Private Sub Combo1_Click()
hwind = FindWindow(vbNullString, Combo1.Text)
Label1.Caption = "hWnd : " & hwind
Address
End Sub

Private Sub Form_Load()
Label1.Caption = "hWnd : "
Label2.Caption = "ProcessMemoryStartAddress : "
Label3.Caption = "ProcessMemoryEndAddress : "
GetTaskList

End Sub

Private Sub Address()
GetWindowThreadProcessId hwind, pid
hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, False, pid)
  lLenMBI = Len(mbi)
   Call GetSystemInfo(si)
    lpMem = si.lpMinimumApplicationAddress
    Label2.Caption = "ProcessMemoryStartAddress : " & CStr(lpMem) '   <------ Что нужно вписать сюда ???
    Label3.Caption = "ProcessMemoryEndAddress : " & CStr(si.lpMaximumApplicationAddress) '   <-------------- Что нужно вписать сюда ???
  CloseHandle hProcess
End Sub

Неужели всё до такой степени сложно ???
Помогите пожалуйста !!!
Ведь чтобы понять код нужно хотябы иметь представление или описание
как это работает а одной смекалки не хватит .
Люди Добрые , помогите кто действительно знает .
Три дня по 12-14 часов я пытаюсь разобраться в этом , помочь некому ...
А высказывания "это функция такая" помогает лишь когда человек знаком с ней или есть достаточно материалов по описанию ...
А иногда в примерах допускают серьёзные ошибки
Искав через поисковики "ReadProcessMemory" я почти во всех примерах
не нашел такой маленькой вещи :
Const PROCESS_ALL_ACCESS = &HF0000 Or &H100000 Or &HFFF
это типа сами догадайтесь....
А зачастую , как бывает - есть люди которые могут помочь но по каким-то причинам не хотят помогать , а это неправельно...
И тогда человек который неможет найти ответ , не закончив работу делает : 'On Error ExitSub '

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 22.02.2006 (Ср) 2:03

Нужно хотябы узнать начальный адрес приложения...
Но как ???

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

Сообщение GSerg » 22.02.2006 (Ср) 5:17

zafon писал(а):Как найти начальный и конечный адрес процесса ???

http://bbs.vbstreets.ru/viewtopic.php?p=95581#95581

zafon писал(а):Неужели всё до такой степени сложно ???

В каждом случае своя специфика.

zafon писал(а):А высказывания "это функция такая" помогает лишь когда человек знаком с ней или есть достаточно материалов по описанию ...

http://msdn.microsoft.com/library

zafon писал(а):А иногда в примерах допускают серьёзные ошибки

http://msdn.microsoft.com/library

zafon писал(а):не нашел такой маленькой вещи :
Const PROCESS_ALL_ACCESS = &HF0000 Or &H100000 Or &HFFF
это типа сами догадайтесь....

http://bbs.vbstreets.ru/viewtopic.php?t=11721

zafon писал(а):А зачастую , как бывает - есть люди которые могут помочь но по каким-то причинам не хотят помогать , а это неправельно...

Ты не поверишь, но на всё не хватает времени...
Я не видел экзешника, я не знаю, куда он и что сохраняет, и я не хочу тратить кучу времени на его дизасм и узнавание всего этого.
Не проще ли с помощью http://bbs.vbstreets.ru/viewtopic.php?p=95581#95581 каждый раз искать значение заново?

zafon писал(а):И тогда человек который неможет найти ответ , не закончив работу делает : 'On Error ExitSub '

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


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

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

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

    TopList