Страница: 1 |
Страница: 1 |
Вопрос: Поиск значения в памяти процесса (API)
Добавлено: 29.09.09 13:56
Автор вопроса: Aleksey
Хочу сделать некую пародию на трейнер для игры, чтобы можно было в нужные адреса в памяти писать нужные значения.
И так, делать это пытаюсь с пом. WinAPI в vb.net.
'Объявил все нужные функции
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAcess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function ReadProcessMemory Lib "KERNEL32.DLL" Alias "ReadProcessMemory" (ByVal hProcess As Byte, ByVal lpBaseAddress As Long, ByVal lpBuffer As Object, ByVal nSize As Byte, ByVal lpNumberOfReadedBytes As Long) As Long
sub main()
Dim PID, hWnd As Long
hWnd = FindWindow(vbNullString, "SomeWindowTitle")
GetWindowThreadProcessId(hWnd, PID)
PID = OpenProcess(PROCESS_ALL_ACCESS, 0&, PID)
'и вот самое главное - чтение из памяти:
ReadProcessMemory(PID, lpBaseAddress, lpBuffer, buffsize, readedbyte)
откуда брать значение lpBaseAddress?
По идее это значение должно быть из диапазона адресов занимаемых процессом, вот как узнать этот диапазон?
Ответы
Всего ответов: 2
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 29.09.09 23:33
VirtualQueryEx
Номер ответа: 2
Автор ответа:
Aleksey
Вопросов: 12
Ответов: 35
Профиль | | #2
Добавлено: 02.10.09 12:11
Ок, добавляю нужные объявления функций:
Declare Function VirtualQueryEx Lib "kernel32" (ByVal hProcess As Long, ByRef lpAddress As Long, ByRef lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long
Structure MEMORY_BASIC_INFORMATION
Dim BaseAddress As Long
Dim AllocationBase As Long
Dim AllocationProtect As Long
Dim RegionSize As Long
Dim state As Long
Dim protect As Long
Dim type As Long
End Structure
Sub main ()
...
dim meminfo as MEMORY_BASIC_INFORMATION
VirtualQueryEx PID, lpAddress, meminfo, Len(meminfo)
но тут возникает вопрос: а откуда взять lpAddress?
Порывшись в МСДН, понял что его надо взять из GetSystemInfo()
добавляю объявление этой ф-ции:
Public dwOemID As Long
Public dwPageSize As Long
Public lpMinimumApplicationAddress As Long
Public lpMaximumApplicationAddress As Long
Public dwActiveProcessorMask As Long
Public dwNumberOfProcessors As Long
Public dwProcessorType As Long
Public dwAllocationGranularity As Long
Public wProcessorLevel As Short
Public wProcessorRevision As Short
End Structure
Declare Function GetSystemInfo Lib "kernel32.dll" (ByRef lpSystemInfo As SYSTEM_INFO) As Long
Dim sysinfo As SYSTEM_INFO
GetSystemInfo(sysinfo)
после этого уже вызываю VirtualQueryEx
VirtualQueryEx PID, lpAddress, meminfo, Len(meminfo)
но переменная meminfo не заполняется данными
Что я тут делаю не так?