Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Dark_Timur
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
#1

Получить адрес ИЗ указателя на адрес другой программы

26.08.2013, 21:36. Просмотров 1483. Ответов 11
Метки нет (Все метки)

В программе для редактирования RAM памяти процессов (в основном игровых =) ) ArtMoney можно получить из указателя №1 + число №2 на адрес №3 собственно адрес №3. Делается это в основном для того, чтобы не переискать искомый адрес после перезапуска игры/перехода на другую локацию/любом другом событии, меняющим искомый адрес. Собственно вопрос: как это сделать в Visual Basic 6? Важно, чтобы сделать это надо в ДРУГОМ процессе, не в самой программе VB.

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2013, 21:36
Ответы с готовыми решениями:

Как получить МАС-адрес?
Как использовать функцию Netbios для получения МАС-адреса. Пробовал...

Получить Ip-адрес сервера из обычной ссылки
Добрый день! Вроде задача вполне реализуемая (тем более что в моем случае...

Как получить текущий ip- адрес в локальной сети?
подскажите, пожалуйста, как получить текущий ip- адрес в локальной сети.

Как получить и передать параметры из другой программы (через командную строку)?
Как получить и передать параметры из другой программы (через командную строку)

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

11
morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
27.08.2013, 04:01 #2
Сразу бы выложил "ключ" для дешифровки вопроса
0
dev.Free
Заблокирован
27.08.2013, 06:36 #3
После спиритического сеанса духи форума говорят, что он хочет аналог WebMoney.
0
Dark_Timur
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
27.08.2013, 07:56  [ТС] #4
Извините, видимо я что-то не так объяснил. Я хочу написать что-то вроде трейнера для игры.

Статья на сайте программы про указатели

Если вкратце, то:

Указатели используется в основном в играх Windows имеющих исполняемый файл, реже в эмуляторах.
Адреса меняются после перезапуска игры. Но игра должна знать, где её параметры, поэтому существует ячейка, в которой записан адрес этого параметра. Эта ячейка называется указателем на адрес, фактически она его содержит.
0
SoftIce
comment ca va
10435 / 3943 / 1006
Регистрация: 27.07.2011
Сообщений: 9,526
Завершенные тесты: 1
27.08.2013, 09:52 #5
Цитата Сообщение от Dark_Timur Посмотреть сообщение
для того, чтобы не переискать искомый адрес после перезапуска игры/перехода на другую локацию/любом другом событии
А как Вы думаете, можно ли предсказать по какому адресу в памяти будет находиться определённая переменная при очередном запуске программы? Почему каждый раз в артмани приходится искать и отсеивать значения?
Цитата Сообщение от Dark_Timur Посмотреть сообщение
Но игра должна знать, где её параметры,
Игра это знает, пока работает. Закрыл игру, она всё "забыла".
0
Dark_Timur
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
27.08.2013, 10:45  [ТС] #6
А как Вы думаете, можно ли предсказать по какому адресу в памяти будет находиться определённая переменная при очередном запуске программы? Почему каждый раз в артмани приходится искать и отсеивать значения?
1. Да, можно. В окне "Поиск", в комбобоксе "Искать" выбрать не "Точное значение", а "Указатель". Однако зачастую бывает, что надо искать Указатель -> Указатель -> Адрес (или еще сложнее). Ищется искомый указатель например так:

1. Ищут адрес того, на что надо будет найти указатели (напр. адрес значения какого-либо ресурса в какой-либо игре)
2. Ищут указатели на адреса.
3. Например, перезапускаем игру, смотрим, какие указатели показывают на верное значение ресурса.
4. Переходим на другие уровни/играем за др. персонажей..., продолжая отсеивать те указатели, которые становятся показывающими ("становятся показывающими" не по русски немного выразился, но по-другому не смог) неправильный адрес.
5. Остается 1-3 указателя, они искомые

Но на это уходит много времени, иногда гораздо проще просто каждый раз искать адрес по-новой.

2.
"динамическое распределение памяти" по-английски "Dynamic Memory Allocation" сокращенно DMA. Когда игре необходима дополнительная память, она использует функцию Windows для получения памяти. Windows раздает участки памяти случайно, то есть по DMA. Из этого следует, что перезапуск игры приводит к полной переделки всей карты памяти. Блоки памяти меняются местами, адреса меняются.
P.S. Действительно, возможно я тут несу бред. Я лишь хочу узнать, как с помощью VB6 в другой программе, зная указатель на адрес, смещение получить сам искомый адрес.
0
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
28.08.2013, 00:38 #7
Цитата Сообщение от SoftIce Посмотреть сообщение
А как Вы думаете, можно ли предсказать по какому адресу в памяти будет находиться определённая переменная при очередном запуске программы? Почему каждый раз в артмани приходится искать и отсеивать значения?
Можно, если смещение структуры данных относительно начального адреса процесса в памяти не изменяется.
Зависит от конкретной реализации игры.

Цитата Сообщение от Dark_Timur Посмотреть сообщение
P.S. Действительно, возможно я тут несу бред. Я лишь хочу узнать, как с помощью VB6 в другой программе, зная указатель на адрес, смещение получить сам искомый адрес.
Так. Для информации. Указатель не на адрес, а на переменную, массив или структуру...
При этом в VB нет такого типа данных, как указатель. Но можно оперировать адресами (именно это Вы указываете в ArtMoney).

Готовые реализации можно поискать в других разделах (например, C++, C#).
Отправная точка: API-функции: ReadProcessMemory, WriteProcessMemory.

Добавлено через 2 минуты
Dark_Timur, а что если не секрет собрались ломать?
Через ArtMoney получилось? CheatEngine вон еще можете взять. Это более проф. инструмент.

Добавлено через 2 минуты
Там на их забугорном форуме мануалы и сорцы простых утилит есть (конечно, не на VB).
0
Dark_Timur
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
28.08.2013, 12:31  [ТС] #8
Dark_Timur, а что если не секрет собрались ломать?
Я, прочитав эту статью , решил написать что-то вроде программы, выполняющей скрипты для поля этой игры (изменение ситуации в "квадратах" поля, изменение значения таймера, счетчика мин и т. д.). Насколько я помню, в сапере XP не используются указатели, а просто имеется определенная разница между адресами клеток. Но я хотел бы, чтобы была возможность использовать эту программу-скриптер на других программах типа "Сапер" (если указать, как находить адреса
) в которых, возможно, используются указатели.

P.S. Кажется, вопрос исчеран. Я нашел в Интернете тему про похожий, но другой вопрос . Оттуда я выяснил, что искомый адрес высчитывается по формуле:

Искомый адрес = Значение адреса указателя (не адрес указателя, а само значение адреса) + значение смещения

Однако, я не понял, каков должен быть размер (в байтах) значения адреса указателя. Опытным путем я выяснил, что значение адреса указателя 4 байт не всегда равно значению адреса указателя 8 байт.

И опять же, опытным путем я выяснил, что более точная формула такова:

Искомый адрес = Значение адреса указателя типа (разрядность процесса, в байтах) байт + Значение смещения

Сейчас напишу функцию получения, мало ли, может кому-то это пригодится.
0
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
28.08.2013, 17:28 #9

Не по теме:

Dark_Timur, гг. Чит для сапера =)))



С терминологией прям так сказать у Вас сложно.
Но вот с пониманием процесса более-менее верно.
Действительно, от разрядности системы и процесса будет зависеть размер типа данных переменной, на которую ссылается указатель (это например, тип size_t).

Что ж, напишите - выкладывайте. Читы не сильно приветствуются, но не запрещены правилами.
Уж явно не к такой игре, как сапер-линейка... =))
0
Pro_grammer
Модератор
6139 / 2217 / 438
Регистрация: 24.04.2011
Сообщений: 3,897
Записей в блоге: 10
29.08.2013, 06:04 #10
Цитата Сообщение от Dragokas Посмотреть сообщение
Уж явно не к такой игре, как сапер
Как раз для Сапера, проверено на WinXP
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    Option Explicit
     
    Private Const PROCESS_VM_READ = &H10
    Private Const PROCESS_VM_WRITE = &H20
    Private Const PROCESS_VM_OPERATION = &H8
    Private Const PROCESS_VM = PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE
     
    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 dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Long, 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
Private Sub Command1_Click()
Dim hW As Long, PId As Long, hP As Long, buf As Long, address As Long, NewTimer As Integer
      
      'Необходимо зппустить Сапер и начать играть
      hW = FindWindow("Сапер", "Сапер") ' если игра английская, то корректировать!
      Call GetWindowThreadProcessId(hW, PId)
     
      hP = OpenProcess(PROCESS_VM, 0&, PId)
      address = &H100579C ' По этому адресу у сапера время тикает
      Call ReadProcessMemory(hP, address, VarPtr(buf), LenB(buf), 0&)  'Считываем значение времени
      MsgBox buf  'после нажатия на кнопку вы увидите время игры в секундах.
      NewTimer = 1
      'А тут сбрасываем время на 1 сек - и ты  чемпион!
      Call WriteProcessMemory(hP, ByVal address, NewTimer, LenB(NewTimer), 0&)
     
End Sub
Закомментировал мессагу
Visual Basic
1
 'MsgBox buf  'после нажатия на кнопку вы увидите время игры в секундах.
и поставил на таймер с интервалом 500 эту процедуру
Visual Basic
1
2
3
Private Sub Timer1_Timer()
Command1_Click
End Sub
И я ЧЕМПИОН!
1
Миниатюры
Получить адрес ИЗ указателя на адрес другой программы  
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
29.08.2013, 13:16 #11
Pro_grammer, крутой что-сказать

Dark_Timur, вот Вам для затравки еще другой набор функций: http://www.manhunter.ru/assembler/26..._processa.html
0
Dark_Timur
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
30.08.2013, 19:40  [ТС] #12
Извиняюсь за столь долгое отсутствие. Вот у меня получился пример для получения разрядности процесса, а также адреса из указателя и адреса. Тестировал, вроде рабочий.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Global F_App As EXE
 
Const MAX_PATH = 260
Const PROCESS_ALL_ACCESS = &H1F0FFF
 
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function GetBinaryType Lib "kernel32" Alias "GetBinaryTypeA" (ByVal lpApplicationName As String, lpBinaryType As Long) As Long
Declare Function GetModuleFileNameEx Lib "psapi" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Integer
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal SomeValueIsStoredHere As Long, lpdwProcessId As Long) As Long
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
 
Type EXE
 Caption As String
 Handle As Long
 hWnd As Long
 Module As Long
 nSize As Byte
 Path As String
 PID As Long
End Type
 
Type OSVERSIONINFO
 OSVSize         As Long
 dwVerMajor      As Long
 dwVerMinor      As Long
 dwBuildNumber   As Long
 PlatformID      As Long
 szCSDVersion    As String * 128
End Type
 
Type SHFILEINFO
 hIcon As Long ' out: icon
 iIcon As Long ' out: icon index
 dwAttributes As Long ' out: SFGAO_ flags
 szDisplayName As String * 260 ' out: display name (or path)
 szTypeName As String * 80 ' out: type name
End Type
 
Function Load(Caption As String)
 With F_App
  .Caption = Caption
  .hWnd = FindWindow(vbNullString, .Caption)
  GetWindowThreadProcessId .hWnd, .PID
  .Handle = OpenProcess(PROCESS_ALL_ACCESS, 0, .PID)
  
  Dim Buffer As String
  Dim PathLen As Long
  
  Buffer = String$(260, " ")
  PathLen = GetModuleFileNameEx(.Handle, .Module, Buffer, Len(Buffer))
 
  If PathLen Then
   .Path = Left(Buffer, PathLen)
   .nSize = GetNsizeOfProc(.Path)
  'В GetModuleFileNameEx есть баг, в связи с которым 64-разрядные приложения не открываются
  ElseIf PathLen = 0 And .Handle Then
   .Path = "NaN"
   .nSize = 8
  End If
 End With
End Function
 
Function GetAddrFromPtr(Pointer As Long, Offset As Long) As Long
 With F_App
  GetAddrFromPtr = GetValue(Pointer, .nSize) + Offset
 End With
End Function
 
Function GetNsizeOfProc(AppPath As String) As Byte
 'Сначала пробуем получить информацию через ShGetFileInfo
 Dim SHFI As SHFILEINFO
 Dim lngResult   As Long
 Dim intLoWord   As Integer
 Dim intLoWordHiByte As Integer
 Dim intLoWordLoByte As Integer
 Dim strLOWORD   As String
 
 lngResult = SHGetFileInfo(AppPath, 0, SHFI, Len(SHFI), &H2000)
  
 If lngResult = 0 Then 'Если приложение не может быть прочитано
  GetNsizeOfProc = 0
  Exit Function
 End If
  
 intLoWord = lngResult And &HFFFF&
 intLoWordHiByte = intLoWord \ &H100 And &HFF&
 intLoWordLoByte = intLoWord And &HFF&
 strLOWORD = Chr$(intLoWordLoByte) & Chr$(intLoWordHiByte)
  
 Select Case strLOWORD
  Case "NE", "MZ" 'Насколько я понял, NE и MZ приложения - 16 разрядные
   GetNsizeOfProc = 2
  Case "PE" 'Если PE приложение, то узнаем информацию об ос
   Dim OSV As OSVERSIONINFO
   With OSV
    .OSVSize = Len(OSV)
    GetVersionEx OSV
    If .PlatformID < 2 Then 'Если у нас PE и Windows 9x или ниже
     GetNsizeOfProc = 4
    Else 'Если PE и у нас Windows NT и выше
     If .dwVerMajor >= 4 Then
       'Получаем информацию через GetBinaryType
       Dim BinaryType As Long
       GetBinaryType AppPath, BinaryType
       Select Case BinaryType
        Case 0 'SCS_32BIT_BINARY
         GetNsizeOfProc = 4
        Case 1 'SCS_DOS_BINARY
         GetNsizeOfProc = 2
        Case 2 'SCS_WOW_BINARY
         GetNsizeOfProc = 2
        Case 3 'SCS_PIF_BINARY
         GetNsizeOfProc = 2
        Case 4 'SCS_POSIX_BINARY
         GetNsizeOfProc = 0 'так и не понял разрядность Posix
        Case 5 'SCS_OS216_BINARY
         GetNsizeOfProc = 2
        Case 6 'SCS_64BIT_BINARY
         GetNsizeOfProc = 8
       End Select
     Else 'Ну, а если у нас, например, Windows NT 3.51, то
      GetNsizeOfProc = 4
     End If
    End If
   End With
 End Select
End Function
 
Function GetValue(Address As Long, BytesAmount As Byte) As Long
 With F_App
  If .Handle <> 0 Then
   ReadProcessMemory .Handle, Address, GetValue, BytesAmount, 0&
  End If
 End With
End Function
Получить разрядность из пути до файла:

Visual Basic
1
Msgbox GetNsizeOfProc("Путь до файла")
Получить разрядность из имени одного из окон файла:

Visual Basic
1
2
Load "Имя одного из окон"
msgbox F_App.nSize
Получить адрес из указателя на адрес и смещения:

Visual Basic
1
2
3
'Собственно, запустить процесс
Load "Имя одного из окон"
Msgbox GetAddrFromPtr("Указатель", "Смещение")
2
30.08.2013, 19:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 19:40

Как узнать мак адрес по IP?
Привет Всем!!! Если IP номер стоить как вторичное IP № как мне узнат MAC адрес...

Зная имя хоста – узнать IP-адрес машины.
Доброе время суток. Если у кого найдётся время - help? Plizz Мой...

Как средствами VB узнать IP адрес или имя ПК?
Как средствами VB узнать IP адрес или имя ПК, запустившего приложение и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru